檔案上傳之WAF繞過及相安全防護

朝朝_暮暮發表於2021-08-12

檔案上傳在資料包中可修改的地方

  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字典配合

字典地址:

https://github.com/TheKingOfDuck/fuzzDicts
https://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 防護產品:寶塔,雲盾,安全公司產品等

相關文章