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中用到的几个函数。
赞赏微信赞赏支付宝赞赏
发表评论