DOM型XSS详解
前言:
什么是DOM?
通过JS,可以重构整个HTML文档,可以添加,移除或者改变等页面上的项目。要改变页面的某个东西,JS就需要获得对html文档中所有元素进行访问的入口,这个入口连同对html元素进行添加.移动.改变或移除的方法和属性,都是通过文档对象模型来获得的(DOM)
所以,我们可以把DOM理解为一个访问HTML的标准接口
可以去菜鸟教程或者W3SCHOOL查看下相关的解释
演示:
首先随意输入提交
弹出一what do u see
查看前端源码,可以看到有一串JS代码
首先用DOM里的getid这个方法获取id=text的标签,也就是我们输入的内容赋值给str然后又把str用字符串拼接的方式写到了a标签里,然后a标签会写入到id=dom这个标签里,以上就是JS的代码
如何测试?
实际上思路跟我们测反射型与存储型的操作一样,先确定输入点,输入点很明显就是这个input里。反射型和存储型都是通过后端代码echo到前端的,但是DOM型是纯前端输出,通过上述解释的JS代码就输出了,且没有做任何的过滤和转义操作
1 | <a href='"+str+"'>what do u see?</a> |
对以上代码构造闭合,首先先把单引号闭合,然后选择一个能触发弹窗的属性,随后把前面第一个尖括号闭合,后面就可以不管了。
payload:
1 | <a href='#' onclick='alert(111)"> |
尝试一下,弹窗成功
以上就是简单的DOM型利用(刷新一下就没效果而且也没存进数据库,危害比较鸡肋)
其他案例:
随意输入点击提交,弹了句话,查看前端代码
可以看到也有个JS代码
首先采用window.location.search这个DOM方法获取浏览器传参的参数,然后下一行的方法对参数进行url的解码并用字符串进行分割
,然后获取到对应内容,其实就是从在这个输入框中获取输入的完整内容,然后把最后的内容复制给xss这个变量,然后把xss写入到a这个标签,由此可见形成这个漏洞主要是由于url的参数
把上一个例子的payload继续尝试,成功弹窗
over.