DVWA中等级通关指南-超详细版

1.Brute Force

上篇文章截的图太多了,这回就不给大家截题目了,重点的图还是会有的哦~

从源码可以看到,只有红框框出来的地方发生了变化。这个
mysql_real_escape_string()
是干什么的呢?


简单来说就是对一些特殊字符进行了转义,那低等级时候用到的注入就失效了吧,这回就只能老老实实爆破了,而且可以看到中等级的代码依然没有限制尝试次数,所以就存在爆破漏
洞。

具体操作与第一篇没有区别,可以参见上一篇文章。

2.命令执行


从源码可以看出,比低等级多了红框和黑框中的代码。其中红框的代码是定义了一个黑名单数组,只要在黑名单中的字符都会被替换为空值,也就是被删除。

而黑框中多了一个php函数str_replace()【http://www.w3school.com.cn/
php/func_string_str_replace.
asp】,简单来说就是从第3个参数找到第一个参数中的值,然后替换为第2个参数。这样就把target里面的黑名单字符全部删去了。不过这个黑名单写的也太敷衍了,就屏
蔽了&&和:,那这个就和低等级的还是没啥区别,直接用低等级代码无脑过。

3.CSRF(跨站请求伪造)

从源码可以看出,比低等级的多了红框中的内容。主要是多了一个HTTP_REFERER变量,利用eregi()
函数【https://www.php.net/manual/en/function.eregi.
php】进行匹配,简单说就是如果HTTP请求头存在referer字段且包含”127.0.0.1”,即可绕过验证。我们来抓包看一看访问恶意网址时的请求包。

可以看到这里的referer是当前访问网页的地址,然后返回一个重定向响应


这个数据包可以看到,host是DVWA服务器的地址,referer还是本地服务器的地址,照现在的情况是肯定无法成功的,访问一下试试

上图中可以看出密码修改并没有成功,不然会返回一个 Password Changed的标志的。

那么如何绕过限制呢?什么东西是我们可以控制的?


目前是我自己访问,所以我可以对流量进行抓包,然后修改referer,可是远程用户访问,怎么进行抓包?流量监听也是TCP层的,理论上来说是可以进行修改的,只是太难
操作了。


不知道大家注意到文件名没有,这个referer中是存在文件名的,那么直接把文件名改了不就行了,反正服务器只是看referer中有没有目标字串而已。把html文件
改成127.0.0.1.html试试,同时需要把钓鱼界面的链接地址改成127.0.0.1.html。

这回再抓包试试(先把浏览器缓存清一下,不然会缓存刚才的钓鱼界面,导致无法重定向)

可以看到referer中有了想要的字符串,那么是否能绕过限制呢?

事实证明可以,这时密码已经被修改了,可以登录试一下

确实登录不进去了,所以证明成功绕过

4.文件包含


可以看到这次对字符串进行了一定的过滤,把http和https给过滤掉了,但是咱们的本地文件包含还是没有受到影响呀~


不过也不能就此满足,因为这个还是没有防住远程文件包含。可以看到该程序并没有写循环,只是对于字符串做了一次过滤而已,那么我们构造请求为这样

发现确实把http://给过滤掉了,剩下了ip地址没有什么用了。但是想想刚才提到的,我们构造如下请求

可以看到我们双写了http://,页面执行了远程文件包含。原理就是当hthttp://tp://中间的http
://被去掉后,就剩下了一个http://,就可以进行远程文件包含了。

PHP的str_replace()
函数是区分大小写的,所以利用大小写也可以绕过。本地文件包含参考低等级通关指南。

5.SQL注入


从源码可以看出,这跟爆破题中的代码一样,都是对id进行了字符串的转义,那么现在咱们来看一看这个转义到底转义了哪些字符?利用bp的intruder模块进行sql
fuzz试试。

结果如下

可以看出,除了@,#剩下的符号基本都被过滤了,那这样还注入啥?

不要心急,sql注入除了字符型,还有一种叫数字型。刚才没有在图片中标注出来,现在再来仔细看一下


看出差别了吗?这个id前面没有单引号,所以就不需要对单引号进行闭合,也就不需要单引号了。而且#注释符还在,那么看看数字型注入怎么用呢?

A.首先看看有查询字段有几列:1 order by 2#

1 order by 3#

说明查询字段有两列。

B.查看当前数据库:1 union select 1,database() #

C.爆表名:1 union select 1,(select group_concat(table_name) from
information_schema.tables where table_schema=database())#

D.爆列名:1 union select 1,(select group_concat(column_name) from
information_schema.columns where table_name=0x7573657273) #

这里要特别注意一下,因为单引号被过滤,所以这里的表名就不能用”users”,
需要将users转换为16进制字符,然后就不需要单引号了。这种方法也适用于低等级sql注入。

E.爆字段值:1 union select 1,(select group_concat(user,password) from
users) #

获得了密码的md5值,解密一下就好了

6.SQL盲注


这个跟上一个没有任何区别,就是没有错误回显了,只要跟着上面的做就没有任何问题,也是过滤了大部分字符,但是是一个数字型注入。就不再赘述了

7.文件上传

看源码,发现多了红框中的判断,看看uploaded_type和uploaded_size是什么东西?

百度了一下,发现好像没啥具体的介绍,大概是看的文件的后缀?抓包看看

这是我上传一张正常图片时产生的请求包,看到其中有Content-
Type这个字段了没?好像跟uploaded_type是一样的啊。意思就是上传图片形式就行了

我们把上次写的trojan.php改个后缀变成trojan.jpg,然后上传试试


上传成功,但现在这种情况没有意义啊,其实可以利用文件包含对这个图片进行执行,然后再用菜刀连接。连接地址为:http://192.168.150.131/dvwa
/vulnerabilities/fi/?page=/var/www/dvwa/vulnerabilities/upload/../../hackable/
uploads/trojan.jpg,连接字段为hack,脚本类型为php,点击连接

成功连接

这道题的正统做法应该是用bp改包,将上传的文件名改成trojan.php

这样也可以,然后用菜刀连接即可。

8.反射型XSS


可以看到这个没有任何的防御效果啊,str_replace可以利用双写绕过,也可以大小写绕过,实在没有什么难度,就不写了

9.存储型XSS

这个在message和name上都做了相应的处理,试试低等级的方法

失败了,直接将信息储存起来了。

这次对message的防御比较强啊,这回可以对name字段做一些文章

首先可以用bp改包,然后改name的字段以绕过长度限制。另一种方法是修改页面中标签的值。


对输入长度进行限制的地方其实是前端的html代码限制的,而不是服务器进行的限制,从源码中也看到并没有对name的长度做限制。所以把刚才的maxlength改成1
000,然后输入xss注入语句

Sign guestbook

可以看到已经成功了

这次的就做到这里,下次再写一写高级的。

路漫漫其修远兮,吾将上下而求索

点赞
  1. OdellSlado说道:
    Google Chrome Windows 10

    Diabetes education Videos

发表评论

[2;3Rer>