文件上傳之WAF繞過及相安全防護
文件上傳在數據包中可修改的地方
-
Content-Disposition:一般可更改
-
name:表單參數值,不能更改
-
filename:文件名,可以更改
-
Content-Type:文件 MIME,視情況更改
常見繞過WAF的方法
- 數據溢出-防止WAF匹配(xxx…)’
- 符號變異-防止WAF匹配(’ ” ;)
- 數據截斷-防止WAF匹配(%00 ; 換行)
- 重複數據-防止WAF匹配(參數多次)
WAF繞過簡單演示
我以靶場upload-labs第二關進行演示。
我們開啟安全狗的上傳防護:
第2關上傳一個php文件,被安全狗檢測到且被攔截:
php加上空格”ph p”,可上傳,但無法解析。
1. 垃圾數據溢出法
- filename的內容進行溢出。
filename的內容進行溢出雖然可以繞過WAF但是我無法將php文件上傳至服務器。
- name與filename之間進行溢出
也可繞過WAF但是無法上傳php文件。
- 大量垃圾數據後加「;」
Content-Disposition與name之間的垃圾數據加上分號可繞過安全狗。
可成功上傳php文件
經測試,name與filename之間的垃圾數據也可繞過。
2. 符號變異繞過
可用payload:
filename=" xx.php
filename="x x.php
filename=' xx.php
filename='x x.php
- filename的內容用單引號括起來(被攔截)
顯然被攔截 - filename去掉最後一個雙引號(被攔截)
被攔截 - filename去掉最後一個雙引號,再加上分號(後綴不能被解析)
可繞過,可上傳,但是無法被解析 - filename去掉最後一個雙引號,在文件名後綴前任意位置加空格(可行)
可繞過WAF,可上傳。 - 單引號與雙引號一致。
- 只在末尾加雙引號(被攔截)
- 文件名前加雙引號或單引號(無法解析)
文件名前加雙引號或單引號可繞過waf,也可上傳,但是無法解析。
- 文件名中加入圖片後綴提前用分號截斷
3. 數據截斷繞過
可用payload:
filename="x.jpg;shell.php"
filename="x.jpg;shell.php
filename='x.jpg;shell.php
filename="shell.php%00xx.jpg" 注意%00要編碼
- 文件名中加入圖片後綴提前用分號截斷(可行)
原因是防護軟件只檢測前面的部分,一旦正確就放行,不再檢測後面的
同理結合符號變形可有:
filename="x.jpg;shell.php
filename='x.jpg;shell.php
·····
- 文件名中用%00url編碼截斷(可行)
4. 數據換行截斷
可用payload:
x.ph
p
x.p
h
p
x.
p
h
p
x
.
p
h
p
- 直接在數據包中進行換行操作(可行)
5. 重複數據繞狗(參數多次)
- 重複filename
前面的filename為可接受的文件格式,最後一個為php文件格式,前面的重複多次,可繞過。
- filename中配合其他參數
配合Content-Type: image/jpeg:
6. “/”與”;”配合繞過
payload:
filename="/jpeg;x.php"
filename="/jpeg;/x.php"
7. FUZZ字典配合
字典地址:
//github.com/TheKingOfDuck/fuzzDicts
//github.com/fuzzdb-project/fuzzdb
手工測試的話有點麻煩,我們可以藉助寫好的字典配合BP進行批量測試,先在本地測試好了,再在真實環境進行測試,以防會封IP。
我藉助fuzzDicts的php字典進行測試。
首先將攔截的數據包發送至Intruder
清除所有變量
將filename的值設置為變量
payload加載字典:
開始攻擊:
能否成功取決於字典的好壞。
安全及修復建議
- 後端驗證:採用服務端驗證模式
- 後綴檢測:基於黑名單,白名單過濾
- MIME 檢測:基於上傳自帶類型檢測
- 內容檢測:文件頭,完整性檢測
- 自帶函數過濾:參考 uploadlabs關卡的函數
- 自定義函數過濾:function check_file(){}等
- WAF 防護產品:寶塔,雲盾,安全公司產品等