本篇文章如未特别强调,均使用提供的Win10进行实验
靶场的获取与配置
本篇内容基于dvwa靶场,文件已经放在文章0.安全类工具文件资源库中了,这里再贴出来一次
链接:https://pan.baidu.com/s/1dmU9DcXAthjY0te4qv4tAg 提取码:38mj
下载得到dvwa汉化版.zip,将压缩包里dvwa文件夹里的文件解压到C:\phpstudy_pro\WWW中,注意提前将phpmyadmin以外的其他文件删除
- 打开phpstudy,在“网站”菜单中的“管理”处设置php版本为
5.6.x; - 到“设置”-“配置文件”中点击你上面选择的php版本打开配置文件
- 使用Ctrl+F搜索
allow_url_fopen和allow_url_include确保这两项后面的配置都是On,保存文件 - 回到首页,启动Apache和MySQL,打开FireFox浏览器访问
127.0.0.1,点击下面的 |创建/重置数据库| 按钮 - 登录,用户名为:
admin,密码为:password - 在DVWA安全页面里设置安全等级为low
靶场的使用
提前配置好抓包环境并打开burp suite,详见1.1 抓包和web基本知识
小贴士:可以在phpstudy目录下新建test.php用来测试代码中看不懂的部分
暴力破解 Brute Force
打开dvwa中暴力破解页面,可以点击右下角查看源代码简单分析功能如何实现
- 现在随便输入用户名和密码(以分别为admin;123为例),同时启用抓包,点击“登陆”,发现已经抓到相应数据包,右键空白处点击“Send to Intruder"后放行数据包
- 转到Intruder-Positions页面,这里需要我们设置要暴力破解哪个部分,我们先点击
Clear§,然后选中密码部分(也就是123),点击add§,Attack Type选择sniper - 转到Payloads选项中,可以在Payloads Options中添加可能的密码或直接导入字典
- 点击Start attack等待攻击完成提示Finished
- 点击Length按照长度排序,发现“password”的长度明显与其他不同,说明password是正确密码
补充1(点击展开):
不同的攻击模式:
- sniper 模式[单向爆破] 知道用户名不知道密码的情况,破解一些单一的输入框
- battering ram 模式[并发攻击] 对多个目标进行单一的payload攻击,也就是用户名和密码一致
- pitchfork 模式[交叉攻击(撞库)] 有几个变量就可以选几个字典,从字典中随机抽取穷举
- cluster bomb 模式[完整爆破] 从字典中挨个抽取尝试
命令注入 Command injection(命令执行漏洞)
所谓命令执行漏洞就是说一个地方可以执行操作系统的命令
low 低难度
打开dvwa中命令注入页面,可以点击右下角查看源代码简单分析功能如何实现
补充2(点击展开):
在Windows CMD中可以通过&、&&符号同时输入并执行两条指令,其他也有|、||等在特定条件下可用
例如执行ping www.retr0.xyz & ipconfig,输出
正在 Ping www.retr0.xyz [104.21.69.83] 具有 32 字节的数据:
来自 104.21.69.83 的回复: 字节=32 时间=211ms TTL=128
来自 104.21.69.83 的回复: 字节=32 时间=202ms TTL=128
来自 104.21.69.83 的回复: 字节=32 时间=200ms TTL=128
来自 104.21.69.83 的回复: 字节=32 时间=201ms TTL=128
104.21.69.83 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 200ms,最长 = 211ms,平均 = 203ms
Windows IP 配置
以太网适配器 Ethernet0:
连接特定的 DNS 后缀 . . . . . . . : localdomain
本地链接 IPv6 地址. . . . . . . . : fe80::9087:a026:a5bf:e1c5%12
IPv4 地址 . . . . . . . . . . . . : 192.168.80.134
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.80.2high 高难度
现在我们加大难度为high,重新查看源代码发现多出了过滤机制
|
|
补充3(点击展开):
str_replace的用法:str_replace("要换的字符串","替换为",作用于哪个变量),例如:
<?php
$a = $_GET['username'];
$b = str_replace('t','x',$a);
echo $b;
?> 打开url:http://127.0.0.1/test.php?username=retr0,返回 rexr0
漏洞解析: 观察发现屏蔽名单中’| ‘为一个管道符加一个空格,因此我们填入127.0.0.1 |ipconfig即可
如果在linux环境下
ping 127.0.0.1 & cat /etc/passwd 几乎同时执行
ping 127.0.0.1 && cat /etc/passwd 执行完左边去执行右面
ping 127.0.0.1 | cat /etc/passwd 只执行右面
反射型跨站点脚本(XSS)
打开dvwa中XSS 反射型页面,随便输入几个字符测试,以retr0为例
low 低难度
右键查看页面源代码发现提交的字符会直接填到下面的“你好”后面,如图:

结合右下角查看php源代码也可以得到
漏洞解析: 因此我们可以在输入的字符串中插入<script></script>的html脚本,让网页执行我们的脚本代码
填入ret<script>alert(123)</script>r0,网页弹窗内容‘123’
medium 中等难度
点击右下角查看源代码发现添加了过滤机制:
|
|
漏洞解析: 屏蔽代码只过滤了一次<script>,因此我们使用双写绕过,填入ret<sc<script>ript>alert(123)</script>r0,其中<script>被过滤后又重新组合为新的<script>从而生效;此外将<script>中的字符替换为大写也可以,例如ret<sCRIpt>alert(123)</script>r0(原理:前端代码不识别<script>大小写)
high 高难度
点击右下角查看源代码发现升级了过滤机制:
|
|
因此直接使用<script>的方法已经完全不可用
补充4(点击展开):
html存在以下加载图片的句法:
<img src='x' onerror='alert(123)'/>
当页面试图加载名为x的图片但是失败时就会把onerror后面的代码当作JavaScript来执行
另外还有onmouseover=(鼠标浮过)onmouseup=(鼠标松开)onmousedown=(鼠标按下)等参数可供替换
漏洞解析: 我们利用html图片加载代码来执行js,填入ret<img src='x' onerror='alert(123)'/>r0
存储的跨站点脚本(XSS)
打开dvwa中XSS 存储型页面,随便输入几个字符测试
low 低难度
发现和上面的反射型原理类似,直接填入留言hel<script>alert(123)</script>lo
medium 中等难度
查看源代码发现在留言上启用了htmlspecialchars(将特定的 HTML 字符转换为 HTML 实体字符),名字上添加了过滤,如下:
|
|
因此我们针对名字下手,直接填入双写绕过的字符串发现网页对长度有限制,所以要用burp suite修改数据包
随便填写名字和留言(以123;hello)为例,打开抓包后点击“提交留言”,发现截获的数据包有以下内容(不一定完全一致):
txtName=123&mtxMessage=hello&btnSign=%E6%8F%90%E4%BA%A4%E7%95%99%E8%A8%80
将这里的123改为hel<sc<script>ript>alert(123)</script>lo后放行数据包发现提交成功
high 高难度
查看源代码发现名字对<script>的屏蔽升级:
|
|
漏洞解析: 依旧结合抓包使用图片加载机制传入字符串hel<img src='x' onerror='alert(123)'/>lo,成功提交
跨站请求伪造 (CSRF)
low 低难度
打开dvwa中跨站请求伪造 (CSRF)页面,随便输入几个字符测试
获取当前页面的url:http://127.0.0.1/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=æ´æ¹#
应用场景: 利用上面的连接制作钓鱼网站诱导某网站管理员点击该链接即可直接修改管理员密码