dvwa

暴力破解(Brute Force)

暴力破解或称为穷举法,是一种针对于密码的破译方法,即将密码进行逐个推算直到找出真正的密码为止

Command Injection

low

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' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];

// 确定操作系统并执行ping命令
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>";
}

?>
  • php_uname()会返回操作系统的一些相关信息,其中就包括操作系统的名称,之后带入到stristr()函数查找windows NT,如果有就会返回字符串的剩余部分(从匹配点)。如果未找到所搜索的字符串,则返回 FALSE
  • shell_exec() — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回
    可以直接进行命令注入:
    127.0.0.1&ipconfig
    127.0.0.1&net user
    127.0.0.1&systeminfo
    127.0.0.1&dir
    当然也可以使用管道符|,|的输出只有后面指令的,因为|的含义是将前面命令的标准输出作为后面命令的标准输入

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
<?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>";
}
  • array_keys() 函数返回包含数组中所有键名的一个新数组
    eg:
    1
    2
    3
    4
    <?php
    $substitutions = array('&&' => '',';' => '',);
    print_r(array_keys( $substitutions ));
    ?>
    输出:
    1
    2
    3
    4
    5
    Array
    (
    [0] => &&
    [1] => ;
    )
  • str_replace():array_keys( $substitutions )规定查找的字符;$substitutions是规定查找到后要替换成的值;$target是目标字符串
    下面的代码后low一样,所以可以使用&来拼接也可以这样绕过:127.0.0.1 &;& ipconfig

high

1
2
3
4
5
6
7
8
9
10
11
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);

和medium的差别就是黑名单过滤变多了,其中最后一个存在空格,所以可以使用127.0.0.1|| net user

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
<?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 );

// 将ip分成4个八位字节
$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();

?>

查看代码,impossible级别的代码加入了Anti-CSRF:token,同时对参数ip进行了严格限制,只有像“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。
源码分析
先checkToken,检查了token,然后把输入的ip=()删除反斜杠,接着用explode()函数把传入的命令以.为分界分成4个部分,然后if语句中使用is_numeric()函数来验证每个部分是不是数字,sizeof()函数检查是不是四个部分,如果以上都满足就将四个部分拼接在一起进行命令执行,否则报错。最后生成生成反csrf令牌。

CSRF

low

这是一个修改密码的页面,修改试试,修改成功,并且是以get方式传输的

从有源码中,可以知道,服务器收到修改密码的请求后,会检查参数$pass_new与$pass_conf是否相同,如果相同就会修改密码,并且没有任何的防csrf机制
我们就直接在URL中修改内容:
http://www.dvwa.test/vulnerabilities/csrf/?password_new=abcd&password_conf=abcd&Change=Change#
(必须使用同一个浏览器,因为在访问页面时通常存在cookie认证,否则即使点击了恶意链接也没用)
密码有效

所以在这种情况下我们可以使用短链接包装一下上面的链接诱骗受害者点击,然后密码就会被自动修改

Medium

直接修改url,提示请求错误

尝试修改密码,抓包发现referer

查看源码,medium级别中通过Referer检查来源,要求Referer中的来源方和host一致才能通过,所以我们需要添加并修改Referer

High

加入了Anti-CSRF token来防范CSRF攻击,即随机生成了一个token,正确时才能通过。
如果要绕过这个机制,就要获取token,然后利用受害者的cookie去修改密码
这里需要XSS+CSRF来共同完成:
找到DVWA中的XSS(stored)模块,在Low中抓包投放js代码
<iframe src="../csrf/" onload=alert(frames[0].document.getElementsByName('user_token')[0].value)></iframe>
然后就出现了这样一个数据信息

再点击DVWA Security后弹出token

构造语句后将这个token添加上,然后回车

Impossible

可以看到,Impossible级别的代码利用PDO技术防御SQL注入,至于防护CSRF,则要求用户输入原始密码(简单粗暴),攻击者在不知道原始密码的情况下,无论如何都无法进行CSRF攻击。

File Inclusion

low

没有任何保护措施,可以直接在地址栏中进行文件名传参
?page=D:/phpStudy/PHPTutorial/WWW/phpinfo.php

Medium

1
2
3
4
5
6
7
8
9
10
<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation验证
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\\" ), "", $file );

?>

对于http的替换我们可以采用双写绕过,而下面的斜杠主要是针对相对路径文件存储路径,但如果我们采用绝对路径上述过滤也可以成功绕过

high

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}

?>
  • fnmatch() 函数:根据指定的模式来匹配文件名或字符串
    采用file类型地址,那么我们就把我们要输入的地址进行修改
    ?page=file:///D:/phpStudy/PHPTutorial/WWW/phpinfo.php

Impossible

1
2
3
4
5
6
7
8
9
10
11
<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}

查看源代码,发现采用了白名单过滤,规定了传入的文件只能是这几个,那么就杜绝了文件包含漏洞

交换机和路由器

1、交换机是用来组建局域网最重要的设备(一个圈打个叉)
2、路由器可以让这个局域网(内网)上网,实现连接内网和外网(长方形两条横线)
3、交换机、网线、电脑构成局域网

上面那个是交换机,下面是电脑的网卡插着网线连接着交换机
如果这个局域网需要可以上网就需要买路由器,路由器一端连交换机一端连运营商而这几台电脑之间需要能通信就需要有ip地址
这里是VMware提供的虚拟交换机

如果我勾选VMnet1相当于我的虚拟机的网卡连上了交换机,如果另一台虚拟机也连这个交换机就可以做局域网实验
IP可以手动配也可以自动,但是企业的ip一般是手动配的不会变

ip地址

ip地址就是一个唯一标识,是一段网络编码(二进制),由32位组成
11010010.01001001.10001100.00000110
210.73.140.6(便于记忆这样写)
常用ip地址都是由32位二进制组成的,最大的ip地址是255.255.255.255最小的ip地址是0.0.0.0

子网掩码

有ip的地方必须有子网掩码

  • 局域网通信规则:在同一个局域网中,所有的ip必须在同一个网段中才可以互相通信,所以在不同的网段需要路由器才能通信,单单有交换机不行
  • ip地址的构成:网络位+主机位(网络位相同的ip地址为同一个网段)类比你来自哪里,你叫什么网络位可以是前一位两位三位,而子网掩码就是来确认网络位的,在子网掩码中与255对应的是网络位,与0对应的是主机位,比如255.0.0.0就是将第一个小数点前作为网络位,255和0都是连续的不会出现交替
  • 每个网段的总称是将ip的主机位置零,表示这个网段
    eg:
    ip:10.1.1.1
    子网掩码:255.255.255.0
    这个网段表示为10.1.1.0,该网段的广播地址是10.1.1.255,广播地址是指可以直接向这个网段的所有ip地址发送东西,可以视为组播地址的升级版,是该网段的
    大喇叭,255.255.255.255是全局广播地址,可以向所有网段发送信息,但是现在一些地区已经做了隔断。所有可用地址有254个,除去主机位全为0或255的

IP地址分类(看第一部分区分)

国际标准组织ISO定义地址分类:五大类(是以ip地址的第一位区分)

A类:1-126 默认子网掩码:255.0.0.0
B类:128-191 默认子网掩码:255.255.0.0
C类:192-223 默认子网掩码:255.255.255.0
D类:224-239 组播地址
E类:240-254 科研使用

这样的定义年代久远了,已经不一定使用默认子网掩码,普通人只能使用前三类,子网掩码可以修改
127.0.0.1是回环地址,代表本主机自己,经常用来测试将自己的主机作为服务器是否故障,就ping 127.0.0.1看看是否可以访问

组播技术
和组播地址相对应的是单播地址,就是一个人一个地址,但组播地址就可以给一组人使用,将一组ip地址视为是同一个组播地址,发东西只发给这个ip地址就相当于发给这一组ip地址,这样的组播技术可以节省服务器带宽

网关(GW)

这个整体是内网


电脑向别的ip地址发送信息时先会比较自己和对方是否在同一个网段,如果不在同一个网段就直接通过交换机发给对方;如果不在同一网段就得发给路由器,而一般每个网段的第一个或最后一个可用的ip地址作为网关,网关就是整个内网的出口,是通向外网的通道,所以只需要将信息发给网关,网关会去寻找要转发的对象(这里怎么转发就涉及到路由器原理了)。
这里的10.1.1.254就是网关,如果只需要在局域网中通信就只需要ip和子网掩码,如果要上网就必须配网关,如果不知道网关就无法和外界通信,一般网关在路由器上

这里就有配置默认网关

VM开头的是虚拟的,一般网卡的牌子是realtek和Intel,所以属于我物理机的是以太网

DNS(域名解析服务器)

任何两个PC通信都需要知道对方的ip,当在浏览器上地址栏输入www.jd.com浏览器会先问问自己,即查看有没有匹配的DNS缓存,但如果从来没有访问过就先在本地域名解析文件(host文件)中寻找,如果还没有就求助DNS服务器,所以电脑需要知道DNS服务器的IP,DNS的服务器分布于全球各地,DNS的ip是在公网(互联网)上
这里是电脑里的相关配置,这个DNS服务器是北京联通的最通用的一台DNS

访问过程

如果所使用的DNS服务器被劫持,使我们输入的域名解析成恶意网站就很危险
一些网络测试命令

  • ping 测试网络连通性,有去有回,相当于发过去几个探测包,对方有回包
    这里的时间可以反映网速,如果对方打开防火墙的某些功能也会ping不通
  • nslookup 域名(比如www.baidu.com),手工解析ip地址