第一关 暴力破解
源代码这里查看!!
抓包工具 抓到数据包
设置变量,因为有token,所以我们最好要提前得到用户名,不然工作量太大了
这里的用户名我们提前知道是 admin
设置两个变量
Sniper: 单参数爆破,多参数时使用同一个字典按顺序替换各参数,只有一个数据会被替换
Battering ram: 多参数同时爆破,但用的是同一个字典,每个参数数据都是一致的
Pichfork: 多参数同时爆破,但用的是不同的字典,不同字典间数据逐行匹配
Cluster bamb: 多参数做笛卡尔乘积模式爆破
如果是用户名和密码,可以用第四种方式进行爆破
设置token参数
1.修改线程为1
2.下拉找到Grep--extract,勾选“从响应中提取以下项目”(这里是为了从我们的请求中提取token,分辨特征,以便为每个密码找到对应的token
3.点击添加,在弹出的界面里点击获取回复,从回复的数据里找到token的值,双击选中,上半部分的页面会自动分辨填值,得到token的特征,方便从回复中找到token,这里的token要复制一遍,方便在后面直接填充
4.选取value
5.回到有效载荷界面,设置第二个参数。有效载荷类型改为递归搜索,英文为recursive grep。
在第一个请求的初始有效负载部分把我们复制的token粘贴上去
设置完毕,开始爆破
发现字长不一样的就是成功登录了
第二关 Command Injection
打开界面之后 输入ip地址,我们尝试输入自己的ip地址:127.0.0.1
发现返回的结果与ping命令类似 ,本关卡的题目是命令注入,那么可能我们有机会在输入框执行系统命令
源码分析
这里执行的ping命令
这里需要一下命令连接符的知识
&:前面一个命令无论是否执行,后面的命令都能执行,两个命令都能执行
&&:前面一个命令执行成功后,才能执行后面一个命令,两个命令都执行
|:前面一个命令无论是否执行,后面的命令都能执行且只执行后面一个
||:前面一个命令不能正常执行,才能执行后面一个命令
源码中对这些连接符进行了一个过滤,我们仔细审计代码,发现 '| ' 是过滤的|+空格,所以过滤其实是无效的,我们不加空格就不会被过滤。
我们输入127.0.0.1 |ls
第三关 CSRF
题目的要求是更改管理员密码,我们抓包看看数据情况
发现有password_new ,password_conf ,新密码以及新密码确认,change状态,以及一个token
这里还有一个referer数据
那么我们可以构造一个页面,里面放一个a标签,链接为更改密码的url,当受害者点击时就会触发更改密码的操作,我们只需要把这个页面html的位置放在和网站同一个目录下,即在自己的电脑上构造一个能够访问目标网站域名的html文件。
设计的url:http://127.0.0.1:8001/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#
把设计的html页面名字改为网站的ip地址,里面的a标签就是更改密码的操作
但是我们这里还有一个token的验证,每次登录都会校验token是否正确,
获取用户token的方式有两种:
1.构造一个页面让用户点击,点击之后偷偷读取用户登录网站的token,把token加到自己构造的更改密码的表单上做让用户点击完成攻击,但由于同源策略,一般无法获得token
2.如果用户网站上存在存储型漏洞,可以利用存储型漏洞与CSRF漏洞相结合,即通过存储型漏洞获得token再结合csrf漏洞完成攻击
源码:
第四关 文件包含
点击三个文件看看,我们发现三个文件都返回了不同的数据,并且传递了一个参数给page
查看后端代码
关键代码为 使用fnmatch()函数对page参数进行过滤,要求page必须以“file”开头,服务器才会包含文件。
可利用file协议进行读文件
file://
有点问题,我读不出来文件
先做文件上传
第五关 文件上传
首先我们准备一个一句话木马文件
<?php phpinfo();?> a.php
先上传试试,发现被拦截
查询后端源代码
strrpos(string , find ,start): 查找find字符在string字符中的最后一次出现的位置,start参数可选,表示指定从哪里开始
substr(string,start,length): 返回string字符中从start开始的字符串,length参数可选,表示返回字符的长度
strtolower(string): 返回给定字符串的小写
我们发现源码中对字符串进行截断,白名单验证
它接受jpg文件,那我们可以制作图片马
copy 1.jpg/b + 1.php/a 2.jpg
这里要注意的是png文件是/a
文件上传成功!
第六关 sql注入
简单模式
进行的尝试
这里注意的是,在1位置进行的注入语法错误,我们选择在2位置尝试注入
成功获取到用户名以及密码,密码md5解密
中等难度
我们发现不同的id中 没有在url中传参,抓包试一试
发现·数据是以post的格式传输的,我们在burpsuit中进行注入
发现可以,那么按照上次的步骤进行注入,查询到用户名和密码
高级难度
提示我们要点击一个链接去查询
SQL盲注
low
使用sqlmap
python sqlmap.py -u "http://192.168.1.109:8001/vulnerabilities/sqli_blind/?id=1%27&Submit=Submit#" -cookie="PHPSESSID=b7sj8oj9r1qadbuq646eu4vp15; security=low" -current-db
参数解析:加cookie是因为dvwa需要登陆
得到当前的database
python sqlmap.py -u "http://192.168.1.109:8001/vulnerabilities/sqli_blind/?id=1%27&Submit=Submit#" -cookie="PHPSESSID=b7sj8oj9r1qadbuq646eu4vp15; security=low" -current-db -D dvwa -tables
python sqlmap.py -u "http://192.168.1.109:8001/vulnerabilities/sqli_blind/?id=1%27&Submit=Submit#" -cookie="PHPSESSID=b7sj8oj9r1qadbuq646eu4vp15; security=low" -current-db -D dvwa -tables -T users -columns
获取数据信息
python sqlmap.py -u "http://192.168.1.109:8001/vulnerabilities/sqli_blind/?id=1%27&Submit=Submit#" -cookie="PHPSESSID=b7sj8oj9r1qadbuq646eu4vp15; security=low" -current-db -D dvwa -tables -T users -columns -C user,password -dump
Medium
在get数据栏中没有发现参数传递,我们猜测是通过post传参。抓包验证一下
那我们的思路就是写一个文本,然后用sqlmap进行爆破
将当前页面的数据包信息,复制到本地的txt文本里面,并在id=处标记*号
将文本保存到sqlmap的根目录
进行爆破python sqlmap.py -r 1.txt -current-db 获取数据库名
爆破代码同上
爆破成功
High
与sql注入高级一样,是一个链接
这里输入一个url但是相应的是另一个url
故使用参数 -second-url(设置二阶响应的结果显示界面的url)
传参为id=1&Submit=Submit
代码为
python sqlmap.py -r 1.txt -second-url=http://192.168.1.109:8001/vulnerabilities/sqli_blind/ -current-db -C dvwa -tables
XSS(Reflected)
Low --直接在输入框输入
<script>alert(1)</script>
Medium
肯定是过滤了,我们查看一下源码
‘