DVWA-Command Injection(命令注入)
命令注入是通过提交含有恶意的服务器端可以执行命令,且这些命令能被服务器执行,从而能间接操作服务器。
DVWA的Command Injection 级别分为:
--low
--medium
--high
--impossible
--low级别
看以下,正常的操作是输入IP地址,交由服务器进行ping操作,然后再将结果返回给前端展示。
服务器端代码:
<?php if( isset( $_POST[ 'Submit' ] ) ) { // Get input $target = $_REQUEST[ 'ip' ]; // 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>"; } ?>
从上面的代码,可以看出提交成功后,获取ip参数后,判断当前服务器类型,如果是windows则直接拼接ip参数,然后执行ping命令,如果否则拼接ping -c 4的命令,没有针对&& 和|| 字符进行转化,那么尝试用&& 、|| 连接符拼接其他命令,看能不能执行。
命令查看当前文件及权限信息:123 || ls -l
命令查看环境变量信息:127.0.0.1 && echo $PATH
查看进程信息:127.0.0.1 && ps auxf
--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>"; } ?>
在medium级别中,已经通过str_replace()函数将&&和;符号转换为空。但是用&;&转换后是不是又变成了:&& 符号了,或者用单个& 是不是还是能执行,尝试一下看看。
查看服务器的ip:127.0.0.1 &;& ip addr
看来还是能执行:&;& 后面的命令。
再试试单个& 符号,查看进程看看:
--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>"; } ?>
在high级别中,开始对所有可以拼接的字符进行替换,但是由于疏忽在“|”后面多加了一个空格符,导致原本是要将”|”为空, 变成将了”| ”替换为空,导致最终还是能用“|” 或“||”来拼接后面的命令。下面尝试一下,看是不是猜测的。
查看文件信息命令:127.0.0.1 || ls -l .
可以看到还是可以执行双竖线||后面的命令。
在试试&&后面的命令是不是已经被过滤掉了。
在试试将high中的”| ”后面的空格去掉,看看双竖线后面的命令是不是也被替换掉了。
编辑/var/www/html/vulnerabilities/exec/source中high.php,去掉”| ”后面的空格符。
在页面【View Source】查看源码,已经将竖线”|”后面的空格去掉
在试一下,上面查看文件信息的命令:127.0.0.1 || ls -l .
可以看到再去掉“|”后面的空格符后,命令:127.0.0.1 || ls -l . 已经无法查询到当前目录下的文件信息了,说明虽然已经加上了对竖线的过滤,
但是由于编写的不严谨,导致其中的某些特殊字符在过滤中失效了,还是会存在风险隐患。