对于 middle 难度的
我们直接先看源码
<?php
if( 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 user
echo "<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 难度的
还是先看源码
<?php
if( 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 user
echo "<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 靶场命令执行漏洞的讲解
除了靶场,其实命令执行漏洞在我们的现实中也是有很多的,建议各位多去打打实战,当然是在符合法律的前提下。还是那句话,开发和安全缺一不可!