Content-Disposition:一般可更改
name:表單參數值,不能更改
filename:檔案名,可以更改
Content-Type:檔案 MIME,視情況更改
資料溢出-防止WAF比對(xxx...)'
符号變異-防止WAF比對(' " ;)
資料截斷-防止WAF比對(%00 ; 換行)
重複資料-防止WAF比對(參數多次)
我以靶場upload-labs第二關進行示範。
我們開啟安全狗的上傳防護:

第2關上傳一個php檔案,被安全狗檢測到且被攔截:
php加上空格"ph p",可上傳,但無法解析。
filename的内容進行溢出。
filename的内容進行溢出雖然可以繞過WAF但是我無法将php檔案上傳至伺服器。
name與filename之間進行溢出
也可繞過WAF但是無法上傳php檔案。
大量垃圾資料後加“;”
Content-Disposition與name之間的垃圾資料加上分号可繞過安全狗。
可成功上傳php檔案
經測試,name與filename之間的垃圾資料也可繞過。
可用payload:
filename的内容用單引号括起來(被攔截)
顯然被攔截
filename去掉最後一個雙引号(被攔截)
被攔截
filename去掉最後一個雙引号,再加上分号(字尾不能被解析)
可繞過,可上傳,但是無法被解析
filename去掉最後一個雙引号,在檔案名字尾前任意位置加空格(可行)
可繞過WAF,可上傳。
單引号與雙引号一緻。
隻在末尾加雙引号(被攔截)
檔案名前加雙引号或單引号(無法解析)
檔案名前加雙引号或單引号可繞過waf,也可上傳,但是無法解析。
檔案名中加入圖檔字尾提前用分号截斷
可用payload:
檔案名中加入圖檔字尾提前用分号截斷(可行)
原因是防護軟體隻檢測前面的部分,一旦正确就放行,不再檢測後面的
同理結合符号變形可有:
檔案名中用%00url編碼截斷(可行)
直接在資料包中進行換行操作(可行)
重複filename
前面的filename為可接受的檔案格式,最後一個為php檔案格式,前面的重複多次,可繞過。
filename中配合其他參數
配合Content-Type: image/jpeg:
payload:
字典位址:
手工測試的話有點麻煩,我們可以借助寫好的字典配合BP進行批量測試,先在本地測試好了,再在真實環境進行測試,以防會封IP。
我借助fuzzDicts的php字典進行測試。
首先将攔截的資料包發送至Intruder
清除所有變量
将filename的值設定為變量
payload加載字典:
開始攻擊:
能否成功取決于字典的好壞。
後端驗證:采用服務端驗證模式
字尾檢測:基于黑名單,白名單過濾
MIME 檢測:基于上傳自帶類型檢測
内容檢測:檔案頭,完整性檢測
自帶函數過濾:參考 uploadlabs關卡的函數
自定義函數過濾:function check_file(){}等
WAF 防護産品:寶塔,雲盾,安全公司産品等