文件上傳
文件上傳
1. 文件類型檢測繞過
1.1. 更改請求繞過
有的站點僅僅在前端檢測了文件類型,這種類型的檢測可以直接修改網絡請求繞過。 同樣的,有的站點在后端僅檢查了HTTP Header中的信息,比如 Content-Type 等,這種檢查同樣可以通過修改網絡請求繞過。
1.2. Magic檢測繞過
有的站點使用文件頭來檢測文件類型,這種檢查可以在Shell前加入對應的字節以繞過檢查。幾種常見的文件類型的頭字節如下表所示
|
類型 |
二進制值 |
|
JPG |
FF D8 FF E0 00 10 4A 46 49 46 |
|
GIF |
47 49 46 38 39 61 |
|
PNG |
89 50 4E 47 |
|
TIF |
49 49 2A 00 |
|
BMP |
42 4D |
1.3. 后綴繞過
部分服務僅根據后綴、上傳時的信息或Magic Header來判斷文件類型,此時可以繞過。
php由于歷史原因,部分解釋器可能支持符合正則 /ph(p[2-7]?|t(ml)?)/ 的后綴,如 php / php5 / pht / phtml / shtml / pwml / phtm 等 可在禁止上傳php文件時測試該類型。
jsp引擎則可能會解析 jspx / jspf / jspa / jsw / jsv / jtml 等后綴,asp支持 asa / asax / cer / cdx / aspx / ascx / ashx / asmx / asp{80-90} 等后綴。
除了這些繞過,其他的后綴同樣可能帶來問題,如 vbs / asis / sh / reg / cgi / exe / dll / com / bat / pl / cfc / cfm / ini 等。
1.4. 系統命名繞過
在Windows系統中,上傳 index.php. 會重命名為 . ,可以繞過后綴檢查。 也可嘗試 index.php%20 , index.php:1.jpgindex.php::$DATA 等。 在Linux系統中,可以嘗試上傳名為 index.php/. 或 ./aa/../index.php/. 的文件
1.5. .user.ini
在php執行的過程中,除了主 php.ini 之外,PHP 還會在每個目錄下掃描 INI 文件,從被執行的 PHP 文件所在目錄開始一直上升到 web 根目錄($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被執行的 PHP 文件在 web 根目錄之外,則只掃描該目錄。 .user.ini 中可以定義除了PHP_INI_SYSTEM以外的模式的選項,故可以使用 .user.ini 加上非php后綴的文件構造一個shell,比如 auto_prepend_file=01.gif 。
1.6. WAF繞過
有的waf在編寫過程中考慮到性能原因,只處理一部分數據,這時可以通過加入大量垃圾數據來繞過其處理函數。
另外,Waf和Web系統對 boundary 的處理不一致,可以使用錯誤的 boundary 來完成繞過。
1.7. 競爭上傳繞過
有的服務器采用了先保存,再刪除不合法文件的方式,在這種服務器中,可以反復上傳一個會生成Web Shell的文件并嘗試訪問,多次之后即可獲得Shell。
2. 攻擊技巧
2.1. Apache重寫GetShell
Apache可根據是否允許重定向考慮上傳.htaccess內容為
AddType application/x-httpd-php .png
php_flag engine 1
就可以用png或者其他后綴的文件做php腳本了
2.2. 軟鏈接任意讀文件
上傳的壓縮包文件會被解壓的文件時,可以考慮上傳含符號鏈接的文件 若服務器沒有做好防護,可實現任意文件讀取的效果
3. 防護技巧
- 使用白名單限制上傳文件的類型
- 使用更嚴格的文件類型檢查方式
- 限制Web Server對上傳文件夾的解析
4. 參考鏈接
原文鏈接:https://websec.readthedocs.io/zh/latest/vuln/fileupload.html

浙公網安備 33010602011771號