0%

DVWA命令执行

1. 常见的网站漏洞

OWASP TOP 10:每年公布关于web安全的十大安全威胁报告,三年公开一次

  • SQL注入(key):渗透数据库,获取数据库数据或者控制权限
  • XSS
  • 文件上传(key):上传木马病毒到网站中
  • 反序列化
  • 文件包含
  • CSRF
  • 命令执行(key):获取命令执行的权限
  • 信息泄露
  • XXE
  • SSRF
  • 未授权访问

2. DVWA靶场

OWASP的官方网站

1. DVMA搭建

1. 六步快速搭建(使用phpstudy 2018)
  • 下载安装PHPstudy

  • 将解压后的DVWA源码放在phpstudy安装目录的PHPTutorial\WWW目录下

  • 进入DVMA/config目录,将config.inc.php.dist最后的.dist后缀删除

  • 打开刚刚修改的config.inc.php,修改db_user和db_password全为root

  • 访问localhost/DVMA,点击setup,然后点击最下面的Create DataBase

  • 访问localhost/DVMA,输入账号密码,admin 和 password,登录

2. 使用小皮面板
  • 下载安装小皮面板
  • 将下载解压后的DVWA源码放在www目录下
  • 进入DVMA/config目录,将config.inc.php.dist最后的.dist后缀删除
  • 打开刚刚修改的config.inc.php,修改db_user和db_password全为root(小皮面板使用的是内置的另一个MySql,如果之前电脑中已经安装MySql,记得改DVWA下config.inc.php中默认的MySql端口号,小皮面板中的配置也记得改)
  • 访问localhost/DVMA,点击setup,然后点击最下面的Create DataBase
  • 访问localhost/DVMA,输入账号密码,admin 和 password,登录

3. DVWA命令执行漏洞

攻击者在执行远程的控制命令时,由于系统设置的不完善,导致攻击者可以执行一些特殊的命令,从而取得权限

1. 常用连接符

  • cmd1|cmd2,无论是cmd1是否执行成功,均执行cmd2

  • cmd1;cmd2,无论是cmd1是否执行成功,均执行cmd2

  • cmd1&cmd2,无论是cmd1是否执行成功,均执行cmd2

  • cmd1||cmd2,只有cmd1失败时才执行cmd2

  • cmd1&&cmd2,只有cmd1成功时才执行cmd2

2. 常见cmd命令

  • whoami:当前用户名
  • shutdown -s -t 0:立即关机
  • net user [username] [password] /add 添加用户,用户名为username,密码为password
  • type [file_name] 查看file_name文件的内容

3. Command injection

攻击之前首先将防御级别改低

image-20230711214441876

输入whoami类似的

image-20230711214557276

4. 防御策略

过滤管道符:|,&,;,||,&&符号替换为空格或者检测到时便停止程序

5. 防御 low

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

<?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>";
}

?>

未做任何的过滤

6. 防御 medium

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
27
28
29
30
31

<?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>";
}

?>

只对&&和;做了防御

7. 防御 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
27
28
29
30
31
32
33
34
35
36
37
38

<?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>";
}

?>

单纯进行了拓宽,效果不好,注意“| ”后是有一个空格的,“|”不带空格的拦截不了,开发时注意

8. 防御 impossible

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

<?php

if( isset( $_POST[ 'Submit' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

// Get input
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target );

// 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 ) ) {
// If all 4 octets are int's put the IP back together.
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];

// 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>";
}
else {
// Ops. Let the user name theres a mistake
echo '<pre>ERROR: You have entered an invalid IP.</pre>';
}
}

// Generate Anti-CSRF token
generateSessionToken();

?>

重点是其中的

1
2
3
4
5
6
7
8
1	$target = stripslashes( $target );
// Split the IP into 4 octects
2 $octet = explode( ".", $target );

// Check IF each octet is an integer
3 if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// If all 4 octets are int's put the IP back together.
4 $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];

1.将用户输入中的反斜线去掉,防止转义字符

2.将输入的Ip按照”.”分开

3.判断分开的每个部分是不是都是数字并且总的数量为4

4.再将4个部分的数字用三个“.”给拼接起来

--------------本文结束感谢您的阅读--------------