1. 程式人生 > >【筆記】網易微專業-Web安全工程師-04.WEB安全實戰-3.命令註入

【筆記】網易微專業-Web安全工程師-04.WEB安全實戰-3.命令註入

失效 我們 erro 原則 val post strip 得到 linux

命令註入(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.命令註入