说在开头:文章是我通过查询资料后按照自己的理解总结出来的,所以如果有说法不对的地方,欢迎大佬指正~
DVWA是一款非常好的web漏洞练习平台,也是一款非常好的学习php代码审计的一个平台。我们可以利用它来学习XSS漏洞。
安装环境
平台搭建好以后,登录账号:admin,密码:password。
设置安全级别
一共有四个级别:Low、Medium、High、impossible。
我们依次测试每个级别,先从Low开始。
我们输入上面的payload,可以看到出现弹窗,说明存在反射型XSS漏洞:
我们查看一下源码,可以看到它对输入没有任何过滤:
因此,在Low下执行XSS 漏洞非常简单,无需绕过。
在Medium下在执行上面的payload,会发现没有出现弹窗, 而是直接把弹窗语句输出了出来:
我们查看源码,可以看到,它将< script >替换成空了,即过滤掉了< script >标签:
绕过方法:
1.双写绕过:
2.大小写绕过:
出现弹窗,弹窗内容显示的是cookie:
前面两种绕过方法都还是被拦截:
于是我们看一下源码,发现这里使用了正则表达式:
我上网查了一下正则表达式的语法,试着来分析一下这个过滤语句的的含义:
查看源码:
htmlspecialchars( $_GET[ ‘name’ ] ) : 最安全的防护,将所有的输入全部转化为HTML的静态文本,不做执行。
在上一篇的原理讲解中,我们已经知道存储型的攻击方式多见于论坛博客和留言板。
所以这里也可以看出,有一个可以留言的地方,我们在其中输入payload:
成功出现带有cookie的弹窗:
这一条留言就是刚才我们添加的,可以看到由于我们的留言内容是payload,所以它就不能像上面那条正常留言一样显示出来:
这种存储型XSS,只要你一去访问,都会被执行一次。
设置完安全级别再点回XSS(Stored)页面,先执行刚才存储在数据库中的XSS,即弹出带有cookie的弹出,将弹窗关闭以后,才会显示正常页面。
为了避免对本次实验结果的影响,我们可以去数据库里把刚才那条留言删除:
为了和刚才区别,我们这次让它弹出111:
但结果发现并没有出现弹窗,留言信息也被正常打印出来了:
查看源码:
message值的处理中,在其第二次调用trim()函数时还内嵌了两个函数,先是使用addslashes()
函数、返回在预定义字符之前添加反斜杠的字符串,然后调用strip_tags()函数来剥去字符串中的HTML、XML 以及 PHP的标签,在最后再调用htmlspecialchars() 函数、把预定义的字符转换为 HTML实体,对输入的内容先进行HTML的编码然后再存储进服务器中,从而使message的SQL和XSS漏洞几乎不存在。
可以看出,我们在这里,只能对name进行利用和绕过,方法和反射型一样。
查看源码:
方法和上面一样,修改maxlength,然后在name处插入一种HTML标签绕过:
impossible级别的name和message的过滤机制都是绝对安全的了。
我目前知道的有两种场景的DOM型XSS漏洞,一种是在页面的输入框中输入payload、一种是在URL上进行传参,看起来和反射型XSS很像,但它其实并没有把数据传递到后台数据库,只是在前端页面显示。
这里演示的在DVWA中,我们使用的是在URL中进行传参。
当我们直接点击【Select】,它就会选择默认选项English,然后可以看到在URL的末尾自动传参“default=English”:
我们修改default后面的值,改为payload,出现弹窗:
查看源码,发现没有做任何过滤: