something about DVWA - command injection
DVWA
Command Injection(命令注入)
Low
手动注入
在
命令参数
尾部手动拼接&
,&&
,|
,||
,;
等,与其它命令。命令连接符
&
使得命令在后台运行。
1
2# 在后台更新软件包索引
apt update &;
按顺序执行分隔的每条命令。
1
2# 先更新索引 再更新软件包
apt update ; apt upgrade&&
短路与
前一条命令执行成功时,执行后一条命令;
前一条命令执行失败,不会执行后一条命令。1
2# 更新软件包索引,成功后更新软件包
apt update && apt upgrade||
短路或
前一条命令执行失败时,执行后一条命令;
前一条命令执行成功,不会执行后一条命令。1
2# 更新软件包索引失败时,打印信息
apt update || echo "update failure"!
排除命令执行对象。
1
2# 删除当前目录下,除html文件的所有文件
rm -r !(*.html)&&
和||
&&
和||
搭配可以形成if-else
选择分支。1
2# 先更新软件包索引,成功就更新软件包,失败就打印信息
apt update && apt upgrade || echo "update failure"|
管道运算符,前一条命令的输出作为后一条命令的输入。
1
2# 列出当前文件夹下所有文件,并筛选文件名包含`example`的内容打印
ls | grep example{}
合并多条命令,使得分隔在一起的命令中,后面的命令依赖于前面的命令。
1
2# ping web服务器,连接不上,就重启网络服务并打印信息
ping www.example.com || {service networking restart ; echo "start networking ..."}()
给命令分组,用以改变优先级。
1
2# 倘若`echo "1"`执行失败,`echo "3" && echo "4"`依然会执行
(echo "1" && echo "2") || (echo "3" && echo "4")\
用以将长命令换行。
1
2
3# 打印"hello world"
echo "hello \
world"
Windows
下命令连接符不同意义:&&
短路与
前一条命令执行成功时,执行后一条命令;
前一条命令执行失败,不会执行后一条命令。&
真与
无论情况如何,被分隔的命令都会执行。||
短路或
前一条命令执行失败时,执行后一条命令;
前一条命令执行成功,不会执行后一条命令。|
真或
无论情况如何,被分隔的命令都会被执行。;
Windows
不支持;
分隔符。
源码分析
直接从
request
中获取参数1
2// Get input
$target = $_REQUEST[ 'ip' ];直接将参数以字符串的方式拼接入
command
中使用
shell_exec
函数调用函数。1
2// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
Medium
手动注入
不使用
黑名单
字符,使用其它命令连接符
。源码分析
直接从
request
中获取参数与
Low
级别相同。设置 黑名单
1
2
3
4
5// Set blacklist
$substitutions = array(
'&&' => '',
';' => '',
);过滤黑名单字符
使用
str_replace
函数过滤字符。1
2// Remove any of the charactars in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );将过滤后的命令以字符串的方式拼接入
command
中1
2// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
High
手动注入
使用
|
进行注入,注意|
后不跟随空格。源码分析
直接从
request
中获取参数,过滤首尾空白字符1
2// Get input
$target = trim($_REQUEST[ 'ip' ]);设置黑名单
此
黑名单
不完善 。1
2
3
4
5
6
7
8
9
10
11
12
13// 注意'| ',有 `空格`,因此不完善
// Set blacklist
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);过滤黑名单字符
与
Medium
相同。将过滤后的命令以字符串的方式拼接入
command
中与
Medium
相同。
Impossible
针对命令注入
:
首先在获取参数时使用
stripslashes
函数去除参数中的反斜杠(\
)其次针对特定命令参数分解判断
ping ip.ip.ip.ip
中针对ip地址,分别判断。1
2
3
4
5
6
7// Split the IP into 4 octects
$octet = explode( ".", $target );
// Check IF each octet is an integer
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// ...
}