【筆記】網易微專業-Web安全工程師-04.WEB安全實戰-3.命令註入
命令註入(Command Injection):是指通過提交惡意構造的參數破壞命令語句結構,從而達到執行惡意命令的目的。
前面的基礎課程中,我們提到命令註入需要三個條件:
1. 是否調用系統命令?
2. 函數/參數是否可控?
3. 是否拼接輸入?
具體怎麽應用,我們在接下去的實戰中學習和體會。
DVWA實戰:
1. 打開phpStudy或xampp,運行Apach和MySQL;
2. 瀏覽器進入DVWA主界面,在左側欄選擇DVWA Security安全等級為Low,然後進入Command Injection;
3. 我們輸入一個IP提交後,發現返回了對這個IP進行Ping的結果。
註:如果返回亂碼,可以試試如下方法:
找到DVWA目錄下/dvwa/includes裏的dvwaPage.inc.php文件,把字符集utf-8改為gb2312 ,保存一下便可。
// Send Headers + main HTML code Header( ‘Cache-Control: no-cache, must-revalidate‘); // HTTP/1.1 //Header( ‘Content-Type: text/html;charset=utf-8‘ ); // TODO- proper XHTML headers... Header( ‘Content-Type: text/html;charset=gb2312‘ ); //TODO- proper XHTML headers... Header( ‘Expires: Tue, 23 Jun 2009 12:00:00 GMT‘ ); // Date in the past
其實就跟我們自己進Windows的cmd裏ping是一樣的。因此,我們猜想後臺肯定也是調用了系統的命令,並且將輸入的參數進行拼接:
// Get input $target = $_REQUEST[ ‘ip‘ ]; // Determine OS and execute the ping command. if( stristr( php_uname( ‘s‘ ), ‘Windows NT‘ ) ) {// Windows $cmd = shell_exec( ‘ping ‘ . $target ); } else { // *nix $cmd = shell_exec( ‘ping -c 4 ‘ . $target ); }
因此,這邊的提交操作滿足了命令註入的三個條件,存在命令註入漏洞。
4. 如果我們輸入123.125.114.144 && net user,那麽會得到如下信息:
一個簡單的命令註入漏洞就這樣被利用了,只需要常見的命令連接符(&,&&,|,||,;等)和系統命令,如果輸入的命令更具威脅性,那麽這個危害就更大了,例如在Linux下輸入127.0.0.1&&cat /etc/shadow甚至可以讀取shadow文件。
5. 接下去我們把安全等級調到medium,發現報錯了:錯誤的參數 net。我們來看看後臺的代碼,發現對”&&” 、”;”進行過濾,本質上是黑名單的方式。
// Set blacklist $substitutions = array( ‘&&‘ => ‘‘, ‘;‘ => ‘‘, );
但是黑名單的過濾有限,我們可以利用&來攻擊漏洞,輸入123.125.114.144 & net user即可,另外,既然會把關鍵連接符過濾,何不反過來利用,構造&;&連接符,這樣當;被過濾後,&&發揮了功效。
6. 接下去我們看看high等級的命令註入,發現上述方法也失效了,查看後臺代碼,發現對更多的命令連接符進行了過濾。
// Set blacklist $substitutions = array( ‘&‘ => ‘‘, ‘;‘ => ‘‘, ‘| ‘ => ‘‘, ‘-‘ => ‘‘, ‘$‘ => ‘‘, ‘(‘ => ‘‘, ‘)‘ => ‘‘, ‘`‘ => ‘‘, ‘||‘ => ‘‘, );
本質上仍然是黑名單的方式,所以仍然存在局限性。例如代碼中的‘| ‘後面有個空格,因此,我們直接輸入123.125.114.144|net user即可。
另外,對於無回顯的情況,可以使用延時命令查看響應速度(如Windows下的ping 127.0.0.1 -n 5 > nul或Linux下的sleep 5)或搭建服務器查看是否有接收到請求(Windows下的ping,telnet或者Linux下的wget,curl等)等方法;
7. 最後我們來看看impossible等級的命令註入,發現用上述的方法不可行,而且報錯信息也更改了:ERROR: You have entered an invalid IP。查看後臺代碼,發現對參數ip進行了嚴格的限制,只有“數字.數字.數字.數字”的輸入才會被接收執行,有效的修復了命令註入漏洞。
// Get input $target = $_REQUEST[ ‘ip‘ ]; $target = stripslashes( $target ); // Split the IP into 4 octects $octet = explode( ".", $target ); // Check IF each octet is an integer if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) { // If all 4 octets are int‘s put the IP back together. $target = $octet[0] . ‘.‘ . $octet[1] . ‘.‘ . $octet[2] . ‘.‘ . $octet[3];
實戰心得:
使用白名單對用戶輸入的命令進行限制,盡量不要使用黑名單,最好是要遵守對一切輸入不可信任的原則,對輸入進行嚴格的校驗。
【筆記】網易微專業-Web安全工程師-04.WEB安全實戰-3.命令註入