文章会讨论 DVWA 中低、中、高、不可能级别的命令行注入
低级
Hacker 试下输入 192.168.31.130; cat /etc/apache2/apache2.conf;
瞬间爆炸, 竟然是直接执行 shell 的结果。再看看代码
{$cmd}
";
}
?>
竟然没有任何的参数校验!这主机安全可以说是形同虚设。 Hacker 竟然不废任何力气,就得到一个 weshell 了!接下来的攻击主要是就看攻击者的想象力了,什么改掉你的文件,什么创建个新页面做负载均衡,批量将 php 重名了。。。
中级
中级代码有做了一点参数校验
'',
';' => '',
);
// 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 "{$cmd}
";
}
?>
会将有;
和&&
都移除了。
Hacker 试了一下 || cat /etc/apache2/apache2.conf
。。。注入成功。而 ||
的意思是第一条命令执行失败就会执行下一条。。。
Hacker 又试了一下 & cat /etc/apache2/apache2.conf
。。。注入也成功。 &
是后台执行,然后再执行新的代码。
主要是过滤太少的参数了。
高级
高级的话就过滤的参数比较多。
'',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
// 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 "{$cmd}
";
}
?>
用 |cat /etc/apache2/apache2.conf
就可以了,因为 substitutions 中的 |
后面有个空格, |+
才会被替换 。。。有点无语
不可能
{$cmd}
";
}
else {
// Ops. Let the user name theres a mistake
echo 'ERROR: You have entered an invalid IP.'; } } // Generate Anti-CSRF token generateSessionToken(); ?>
不能级别,添加了 token 用来对付 CSRF 跨域请求攻击。还对参数进行真正的验证,只有 ip 参数才能够 ping。如果是我写的话可能会用估计会用正则表达式。这个方式验证也可以了。