介紹
命令執行漏洞是值應用有時需要調用一些執行系統命令的函數,如:system()、shell_exec()、eval()、passthru(),代碼未對用戶可控參數做過濾,當用戶能控制這些函數中的參數時,就可以將惡意系統命令拼接到正常命令中,從而造成命令執行攻擊。
分類
1、代碼層過濾不嚴
商業應用的一些核心代碼封裝在二進制文件中,在web應用中通過system函數調用:
system("/bin/program --arg $arg");
2、系統的漏洞造成命令注入
bash破殼漏洞(CVE-2014-6271)
3、調用的第三方組件存在代碼執行漏洞
wordpress中用來處理圖片的ImageMagick組件;
JAVA中的命令執行漏洞(struts2/ElasticsearchGroovy等);
ThinkPHP命令執行;
利用條件
1、應用調用執行命令的函數
2、將用戶輸入作為系統命令的參數拼接到命令中
3、沒有對用戶輸入過濾或過濾不嚴格
常見拼接符
命令A ;命令B | 先執行命令A,在執行命令B |
命令A && 命令B | 命令A執行成功,才會執行命令B |
命令A & 命令B | 簡單拼接,命令A、B之間沒有制約關系 |
命令A | 命令B | 顯示命令B的執行結果 |
命令A || 命令B | 命令A執行失敗,才會執行命令B |
PHP中的危險函數
system(): 成功則返回命令輸出的最后一行,失敗則返回 FALSE。
exec(): 命令執行結果的最后一行內容
shell_exec(): 命令執行的輸出。如果執行過程中發生錯誤或者進程不產生輸出,則返回NUL。
passthru(): 執行外部程序並且顯示原始輸出。
eval(): 將輸入的字符串參數當做PHP程序代碼來執行。
命令執行常見可控位置情況
system("$sag"); //可控點直接是待執行的程序
stem("/bin/prog $arg") //可控點是傳入程序的整個參數
system("/bin/prog -p $arg"); //可控點是傳入程序的某個參數的值(無引號包裹)
system("/bin/prog -p=\"$arg\""); //可控點是傳入程序的某個參數的值(有雙引號包裹)
system("/bin/prog -p='$arg'"); //可控點是傳入程序的某個參數的值(有單引號包裹)
利用方式
方式一:常見拼接符利用
1、&&拼接符
2、&拼接符
3、||拼接符
4、|拼接符
方式二:添加用戶
創建用戶a
查看用戶是否創建成功
將用戶a添加管理員組
使用創建的用戶進行遠程登錄
方式三:執行函數,信息泄露
執行函數,phpinfo();
方式四:寫入文件,反彈shell
在目標/tmp目錄下寫入反彈shell腳本
使用命令執行漏洞,執行寫入的腳本
nc監聽端口,得到目標服務器shell
命令執行漏洞危害
- 繼承WEB服務程序的權限去執行系統命令或讀寫文件
- 反彈shell
- 控制整個網站甚至服務器
- 進一步內網滲透
命令執行漏洞防御方式
- 盡量少用執行命令的函數或直接禁用
- 參數值盡量使用引號包括,並在拼接前調用addslashes函數進行轉義
- 在使用動態函數之前,確保使用的函數是指定的函數之一
- 在進入執行命令的函數方法之前,對參數進行過濾,對敏感字符進行轉義
- 對於可控點是程序參數的情況下,使用escapeshellcmd函數進行過濾