一、概述
1.1何為命令執行
攻擊者通過web應用可以執行系統命令,從而獲得敏感信息,進而控制服務器攻擊內網。
1.2產生條件
1.應用調用執行命令的函數
2.將用戶輸入作為系統命令的參數拼接到命令中
3.沒有對用戶輸入的過濾或者過濾不嚴格
1.2常見命令
1.2.1 Windows
dir |
列出目錄 |
Ipconfig |
查看ip |
arp -a |
查看路由表 |
Calc |
打開計算器 |
Regedit |
打開注冊表 |
netstat -ano |
查看服務端口信息 |
1.2.2 linux
Cat /etc/passwd |
查看password文件內容 |
Id |
查看當前用戶的id號(Windows中500表示admin,501表示游客,自定義用戶100以上) |
Cat /etc/group |
查看用戶組文件內容 |
Pwd |
顯示當前目錄 |
Uname -a |
查看當前系統版本 |
Natstat -pantu |
查看當前服務的端口信息 |
Netstat -nr |
查看網關和路由 |
1.3常見命令拼接符
格式 |
內容 |
A;B |
先執行A,再執行B |
A&B |
簡單拼接,A B之間無制約關系 |
A|B |
顯示B的執行結果 |
A&&B |
A執行成功,然后才會執行B |
A||B |
A執行失敗,然后才會執行B |
二、產生原理
應用有時需要調用一些執行系統命令的函數,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,當用戶能控制這些函數中的參數時,就可以將惡意系統命令拼接到正常命令中,從而造成命令執行攻擊。
三、防御方法
1.盡量少用執行命令的函數或者直接禁用
2.參數值盡量使用引號包括,並在拼接前調用addslashes函數進行轉義
3.在使用動態函數之前,確保使用的函數是指定的函數之一
4.在進入執行命令的函數方法之前,對參數進行過濾,對敏感字符進行轉義
5.對於可控點是程序參數的情況下,使用escapeshellcmd函數進行過濾,對於可控點是程序參數值的情況下,使用 escapeshellarg函數進行過濾
四、危害
1.繼承Web服務程序的權限去執行系統命令或讀寫文件。
2.反彈shell
3.控制整個網站甚至控制服務器。
4.進一步內網滲透
五、php常見危險函數
system:成功則返回命令輸出的最后一行,失敗則返回FALSE。
exec:命令執行結果的最后一行內容。
shell_exec:命令執行的輸出。如果執行過程中發生錯誤或者進程不產生輸出,則返回NULL。
passthru:執行外部程序並且顯示原始輸出。
eval:將輸入的字符串參數當做PHP程序代碼來執行