首先进入dvwa
初始账号 admin
初始密码 password
也可以用密码爆破得出密码
将密码难度设置为high
用 ip 127.0.0.1 进行命令注入,发现不能执行,检查源代码
进入high的代码
代码解释
这是ping ip地址中 high 的代码
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = trim($_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>";
}
$target = trim($_REQUEST[ 'ip' ]); //trim 去除 填写的“ip”首尾处的空白字符
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
将敏感字符写入到一个数组
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
str_replace 替换字符 将$target函数中 array_keys( $substitutions ) 中的键名替换
stristr 忽略函数大小写版本
注意:因为Windows 系统不区分大小写,所以用stristr 来输出
stristr( php_uname( 's' ), 'Windows NT' ) 这个代码的意思是匹配主机信息 将匹配的信息与Windows NT 做比对 ,如果成功则执行下面的语句,不成功则执行else语句 (这里的s指特定查询主机名称 )
$cmd = shell_exec( 'ping ' . $target ) 这个命令执行ping命令
代码分析
-
设置了黑名单,
&
,;
,|+
,-
,(
,)
,[反引号],||
。 -
黑名单中漏掉了关键字符
|
。 可以用|来进行执行。