漏洞原理
當用戶能控制這些函數中的參數時,就可以將惡意系統命令拼接到正常命令中,從而造成命令執行攻擊,這就是命令執行漏洞。
常見調用的一些系統命令的函數,如PHP中的system(),exec(),shell(),passthru(),popen(),proc_popen()
等。
漏洞產生
應用調用執行系統命令的函數
- 存在系統命令的參數可以被用戶輸入並且拼接到參數中執行
未對用戶輸入進行過濾或過濾不嚴格
漏洞分類
代碼層過濾措施不完善
Web應用中通過system函數來調用
系統的漏洞造成命令注入
bash破殼漏洞(CVE-2014-6271)
調用的第三方中間件或組件中存在的漏洞
如 WordPress 中用來處理圖片的ImageMagick組件
Java中的命令執行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP命令執行
漏洞危害
- 利用Web服務器的權限去執行系統命令或讀寫文件
- 反彈Shell
- 控制整個網站甚至控制服務器
- 進一步內網滲透
- 等等
PHP中常見的漏洞代碼
system("$arg");
// 直接輸入即可system("/bin/prog $arg");
// 直接輸入;lssystem("/bin/prog -p $arg");
// 和2一樣system("/bin/prog --p=\"$arg\"");
// 可以輸入";ls;"system("/bin/prog --p='$arg'");
// 可以輸入';ls;'
在Linux上,上面的
;
也可以用|
、||
代替
; 前面的執行完執行後面的
| 是管道符,顯示後面的執行結果
|| 當前面的執行出錯時執行後面的
在Windows上,不能用
;
可以用&
、&&
、|
、||
代替
A&B 前面的語句爲假則直接執行後面的
A&&B A執行成功,然後纔會執行B
A|B A的輸出,作爲B的輸入
A||B A執行失敗,然後纔會執行B
漏洞防禦
- 儘量少用執行命令的函數或者直接禁用
- 參數值儘量使用引號包括
- 在使用動態函數之前,確保使用的函數是指定的函數之一
- 在進入執行命令的函數/方法之前,對參數進行過濾,對敏感字符進行轉義