檔案上傳在資料包中可修改的地方
-
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字典配合
字典地址:
https://github.com/TheKingOfDuck/fuzzDicts
https://github.com/fuzzdb-project/fuzzdb
手工測試的話有點麻煩,我們可以藉助寫好的字典配合BP進行批量測試,先在本地測試好了,再在真實環境進行測試,以防會封IP。
我藉助fuzzDicts的php字典進行測試。
首先將攔截的資料包傳送至Intruder
清除所有變數
將filename的值設定為變數
payload載入字典:
開始攻擊:
能否成功取決於字典的好壞。
安全及修復建議
- 後端驗證:採用服務端驗證模式
- 字尾檢測:基於黑名單,白名單過濾
- MIME 檢測:基於上傳自帶型別檢測
- 內容檢測:檔案頭,完整性檢測
- 自帶函式過濾:參考 uploadlabs關卡的函式
- 自定義函式過濾:function check_file(){}等
- WAF 防護產品:寶塔,雲盾,安全公司產品等