跨站脚本攻击(XSS)又叫CSS,全称是Cross Site Script,为了与HTML中的层叠样式表CSS区分开所以叫做XSS。一共分为三种:存储型XSS、反射型XSS和DOM型XSS。原理是攻击者向有XSS漏洞的网站中输入恶意的HTML代码,当用户浏览该网站时,恶意代码会自动执行,从而达到攻击的目的,有点类似于SQL注入攻击。
本文所说的DOM型XSS也是一种特殊类型的反射型XSS,是基于DOM文档对象的漏洞,仅在客户端便可以触发,而存储型和反射型都是要经过后端才可以触发。
页面通过下拉框选择元素后URL链接中的default参数会改变,将default的参数修改为如下字符,便会在页面中弹出一个窗口,证明已经触发了xss漏洞。
<script>alert(/xss/)</script>
# 弹出XSS
<script>alert(document.cookie)</script>
# 弹出当前页面下的cookie
这里解释一下为什么可以用<script>弹出窗口。
<script>标签标签用于定义客户端脚本,后面的语句会按照脚本的格式去运行,而alert()方法是HTML_DOM的一种方法,作用是用于显示带有一条指定消息和一个 OK 按钮的警告框。
![DVWA | DOM型XSS DVWA | DOM型XSS]()
![DVWA | DOM型XSS DVWA | DOM型XSS]()
我们使用刚才的<script>语句进行尝试后发现未弹窗,且url会自动跳转到原地址。
查看代码后发现服务器会检测传入参数中的 “<script”字符,并使用了stripos() 函数查找字符“<script”在参数中第一次出现的位置(不区分大小写),找到后返回匹配字符串的位置,否则返回false,使用header() 函数用于发送原生的 HTTP 头去再次请求页面。
![DVWA | DOM型XSS DVWA | DOM型XSS]()
对<script>的检测导致进行双写或大小进行绕过,因此我们可以尝试使用其他标签达到相同的效果,例如img标签。
<img src=1 onerror=alert(/xss/)>
<img>标签中src属性是指向图片的地址,onerror属性是当加载出错时需要执行的语句。因为图片的地址为1显然是失败的,所以会执行后面的alert()来弹窗。
结果发现还是失败,我们按F12查看前端代码,按照如图的步骤①②定位到注入语句在前端页面的位置,发现注入的语句是在value的值中,导致<script>标签无法被正确执行,我们可以使用</option></select>标签去闭合前面的<option>h和<select>标签,成功触发弹窗。
</option></select><imgsrc=1 onerror=alert(/xss/)>
![DVWA | DOM型XSS DVWA | DOM型XSS]()
结果如图:
![DVWA | DOM型XSS DVWA | DOM型XSS]()
重复前面的步骤进行测试结果都失败了,查看代码后发现服务器使用了白名单的方式,判断参数中的值是不是所规定的四种,所以服务端是无法绕过。但还有一种方式:使用 # 。
URL栏的 # 号之后的内容并不会发送至服务器端,JS中使用该符号实现在页面创建加载过程中定向到指定的页面内容上。这样就实现了传递白名单内的值绕过验证又实现了前端加载攻击语句。
将参数改为如下的值就可以实现成功弹窗!注意 English 和 # 间有空格,不然会失败。
English #</option></select><BODYONLOAD=alert(document.cookie)>
![DVWA | DOM型XSS DVWA | DOM型XSS]()
![DVWA | DOM型XSS DVWA | DOM型XSS]()
意思是服务器端不需要做任何防御措施,防御的关键在于客户端。
我们使用payload进行尝试,发现前端对语句进行了编码,因此无法成功。
![DVWA | DOM型XSS DVWA | DOM型XSS]()
原文始发于微信公众号(仙友道):DVWA | DOM型XSS
评论