DVWA靶场(Medium)通关笔记

DVWA靶场(Medium)通关笔记

在上一篇难度为Low级别的wp中,我主要是直接上工具干就完事了。从Medium难度开始,我打算从代码层面去分析漏洞原理。对于和low中重复的方法步骤,我就在不再赘述了,可以看前一篇文章。

  • 暴力破解

我们对比low和medium的代码,发现对参数进行了一些过滤。但是依然没有防爆破,所以直接用bp爆破即可。

通过代码发现在low的时候,我们还可以利用sql注入,也就是万能密码来绕过登录。

此时的sql语句为"SELECT * FROM `users` WHERE user = 'admin' # AND password = '$pass';"

后面的password就被注释掉了。medium的代码多了过滤,还是爆破,没什么好说的。

  • 命令执行

那么我们只用一个&即可绕过,没什么难度。

  • CSRF

此时我们再用burp抓包生成的csrf页面触发就不能成功了。

stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写),如果没有找到字符串则返回 FALSE。

这里需要补充一点,PHP中的$_SERVER['HTTP_HOST']与$_SERVER['SERVER_NAME']的区别

1、变量HTTP_HOST和SERVER_NAME都是获取当前域名

2、当满足以下3个条件的时候,两者会输出相同的信息

A、服务器端口号为80

B、Apache中的conf中的ServerName设置正确

C、HTTP/1.1协议规范

3、不同点

A、$_SERVER['HTTP_HOST']:在HTTP/1.1协议下,会根据客户端的HTTP请求输出信息;

$_SERVER['SERVER_NAME']:默认情况下会直接输出Apache的配置文件httpd.conf中的ServerName的值

B、当服务器的端口号不是80时

$_SERVER['HTTP_HOST']会输出端口号,例如“zgao.top:8080”

$_SERVER['SERVER_NAME']直接输出ServerName的值,例如“zgao.top”

在这种情况下,可以理解成HTTP_HOST = SERVER_NAME:SERVRE_PORT
所以上面代码中$_SERVER['SERVER_NAME']获取到的就是cdtu.fun。

也就是说我们referer头中需要出现cdtu.fun即可,但是我们知道表单提交时无法控制http头的。但是Referer中是包含当前文件名的,那么我们可以在文件名上修改。

  • 文件包含

可见是过滤了远程文件包含,那还是包含本地即可 /vulnerabilities/fi/?page=/etc/passwd

  • 文件上传

这里我们还是直接上传一句话木马,只不过需要用bp改包。

改为 Content-Type: image/jpeg 即可绕过

  • 不安全的验证码

Medium级别的代码在第二步验证时,参加了对参数passed_captcha的检查,如果参数值为true,则认为用户已经通过了验证码检查,然而用户依然可以通过伪造参数绕过验证,本质上来说,这与Low级别的验证没有任何区别。

  • sql注入

前端页面设置了下拉选择表单,希望以此来控制用户的输入。

可以看到,Medium级别的代码利用mysql_real_escape_string函数对特殊符号\x00,\n,\r,\,’,”,\x1a进行转义。

虽然前端使用了下拉选择菜单,但我们依然可以通过hackbar改参数,提交恶意构造的查询参数。

说明存在数字型注入。由于是数字型注入,服务器端的mysql_real_escape_string函数就形同虚设了,因为数字型注入并不需要借助引号。

那么接下来的注入和low级别的就没什么区别了。

  • sql盲注

和上面一样,Medium的代码利用mysql_real_escape_string过滤,由于是数字型注入,不影响。和low的方法就一样了,sqlmap一把梭。

  • XSS(反射型)

只是过滤了<script>标签,但是仅仅是关键字的替换,大小写就可绕过了。

payload:<Script>alert("zgao");</script>

  • XSS(存储型)

可见代码对message的限制非常严格,不过对name的限制仅有<script>标签的过滤。

而用前端来限制了name的长度输入,抓包绕过即可。

还是用之前的标签大小写绕过。

虽然我们用name参数去xss了,不过还是需要了解message中用到的几个函数。

zgao

如果有什么技术上的问题,可以加我的qq 1761321396 一起交流。