命令執行漏洞原理
命令執行漏洞是指應用有時需要調用一些執行系統命令的函數,如:system()、exec()、shell_exec()、eval()、passthru()等函數,代碼未對用戶可控參數做過濾,當用戶能控制這些函數中的參數時,就可以將惡意系統命令拼接到正常命令中,從而造成命令執行攻擊。
命令執行漏洞應用例子:
日常的網絡訪問中,我們常常可以看到某些Web網站具有執行系統命令的功能,比如:有些網站提供ping功能,我們可以輸入一個IP地址,它就會幫我們去嘗試ping目標的IP地址,而我們則可以看到執行結果。
但是如果用戶沒有遵循網站的本意,而去輸入精心構造的指令,可能會對網站本身的功能邏輯產生逆轉,導致讓目標網站執行惡意命令。
惡意用戶通過將惡意系統命令拼接到正常命令中,讓網站執行惡意命令
命令執行漏洞產生條件
- 用戶可控:可以控制輸入的內容
- 后台執行:用戶輸入的內容被當作命令執行
命令執行常用函數
一:反撇號:` `
` `輸出並返回shell結果 相當於exec的效果
1 payload:echo `whoami`
二:system()
system() 輸出並返回最后一行shell結果
1 payload:system('whoami')
三:passthru()
只調用命令,把命令的運行結果原樣地直接輸出到標准輸出設備上。
1 payload:passthru('whoami')
四:exec()
不能輸出結果,返回最后一行shell結果,所有結果可以保存到一個返回的數組里面
1 payload:exec($_POST['system'],$output);print_r($output);
五:shell_exec()
通過shell環境命令執行,並且將完整的輸出以字符串的方式返回
1 payload:shell_exec($_POST['system']);
六:其他函數
popen()、proc_open()、pcntl_exec()
注意事項:權限問題 => 權限和中間件運行有關 繼承web運行權限
命令注入漏洞的危害跟web中間件運行的權限有關。由於web應用運行在web中間件上,所以web應用會“繼承”web中間件的運行權限。如果存在命令注入漏洞的web應用運行在以系統管理員身份運行的web中間件上,那么通過web執行命令就相當於以管理員權限執行命令。
常用系統命令與功能:windows下同時執行多條命令語法格式
Windows下同時執行多條命令語法格式:
Comnand1 & Comnand2:
先后執行Comnand1和Comnand2,無論Comnand1執行是否成功
Comnand1 && Comnand2:先后執行Comnand1和Comnand2,只有Comnand1執行成功時才執行Comnand2
Comnand1 || Comnand2:先后執行Comnand1和Comnand1,只有Comnand1執行失敗時才執行Comnand1
Comnand1 | Comnand2:|是管道符,將Comnand1的執行結果傳遞給Comnand2
常用系統命令與功能:Linux下同時執行多條命令語法格式
Linux下同時執行多條命令語法格式:
Comnand1 ; Comnand2:
先后執行Comnand1和Comnand2,無論Comnand1執行是否成功
Comnand1 && Comnand2:先后執行Comnand1和Comnand2,只有Comnand1執行成功時才執行Comnand2
Comnand1 || Comnand2:先后執行Comnand1和Comnand1,只有Comnand1執行失敗時才執行Comnand1
Comnand1 | Comnand2:|是管道符,將Comnand1的執行結果傳遞給Comnand2
命令執行漏洞分類
1. web代碼層命令執行:代碼層過濾不嚴
商業應用的一些核心代碼封裝在二進制文件中,在Web應用中通過system函數來調用:
system("/bin/program --arg $arg");
2. 系統層面的漏洞造成命令注入
bash破殼漏洞(CVE-2014-6271)、MS08-67、永恆之藍
3. 調用的第三方組件存在代碼執行漏洞
WordPress中用來處理圖片的ImageMagick組件
JAVA中的命令注入漏洞(struts2/ElasticsearchGroovy等)
vBulletin 5.x版本通殺遠程代碼執行ThinkPHP命令執行
命令執行漏洞防御方式
- 盡量少用執行命令的函數或者直接禁用 ,在PHP下禁用高危系統函數,找到php.ini,查找到disable_functions,添加禁用的函數名
- 參數值盡量使用引號包括,並在拼接前調用addslashes函數進行轉義
- 在使用動態函數之前,確保使用的函數是指定的函數之一
- 在進入執行命令的函數方法之前,對參數進行過濾,對敏感字符進行轉義
- 對於可控點是程序參數的情況下,使用escapeshellcmd函數進行過濾,對於可控點是程序參數值的情況下,使用escapeshellarg函數進行過濾



