学习DOM型XSS前,先搞清楚什么是DOM
通过 Javascript,可以重构整个 HTML 文档。您可以添加、移除、改变或重排页面上的项目。
要改变页面的某个东西,Javascript 就需要获得对HTML 文档中所有元素进行访问的入口。这个入口,连同对 HTML 元素进行添加、移动、改变或移除的方法和属性,都是通过文档对象模型来获得的(DOM)。
所以,你可以把DOM理解为一个可以访问HTML的标准编程接口。
举个栗子来理解一下DOM
这是标题
点击标题,会提示出它的值。
#From w3school#
这个例子是从w3school拖下来的,我们直接去w3school看一下,因为上面有具体演示的页面,http://caibaojian.com/w3c/example/hdom_examples.html
这里有一个document对象,点击getelementbyid()
首先我们先把js代码给删掉
那这段就是纯HTML代码,显示出来就是上边这样子
我们再把js代码给添进去
function这个地方其实是js的函数,它定义了一个变量x,通过document.getElementById去获取HTML里面,id等于myHeader标签的这个值,那实际上x的值就是这是标题,这是个字符,document.getElementById这个方法,其实就是document提供的方法,当它获取到值后,把这个值给alert出来
这是标题
点击标题,会提示出它的值。
在这个标题里面,有onclik,当我们点击这个标题的时候,会去调用getValue()这个方式,然后把这个值复制给x,弹出来
看到了吧,弹出来了,DOM有一个比较大的特征,这一整个弹窗的过程,其实都是在前端完成的,这一整个过程是没有跟我们的后台交互的,数据并没有通过get、post的方式提交到后台,所以说,DOM是一个前端的操作接口
我们打开pikachu,也就是我们今天要演示的靶场
输入框那边,我们可以输入一个字符,来看一下,我们点提交
点提交之后,弹出来一个what do you see?,看起来好像是一个A标签,我们看一下源码,它到底是做了什么操作,搜索一下what
我们看到这个地方有一段js的代码,我们来读一下它是什么意思
首先,它用document.getElementById的一个方法,来获取id等于text这个标签的值
function domxss(){var str = document.getElementById("text").value;document.getElementById("dom").innerHTML = "what do you see?";}
实际上这个text就是input,也就是我们输入的内容,它把我们输入的内容赋值给了str,通过字符串拼接的方式,写到了A标签的href属性里面,整个的意思是说,当我们在text标签里面输入字符串之后,它就会把字符串,通过dom方法,把它拼接到a标签里面,这个a标签会被写到id等于dom。这么一个div标签里面来
我们首先确认它的输入点,输入点就是在input里面,通过document.getElementById把数据给获取到了之后,在div里面,把它输出了,直接通过innerHTML把它写到了div里面
我们可以看到,它的输入和输出是没有做任何转义的操作的,我们把这段给复制出来,构造一个闭合,来看一下
what do you see?
中间这个str其实就是我们输入的内容,就是一个变量,我们要做的其实就是通过构造一个闭合,来执行我们预期的代码,我们把中间这部分变量,我们可以控制的这部分给删掉,我们首先在这个地方,去把前面的a标签给闭合掉,我们在这里随便输个字符串,或者一个#号,单引号,把前面的href给闭合掉,然后我们在这里用onclick,弹一个窗,然后我们alert,111,然后我们要把前面的a标签给闭合掉,在这里输一个右尖括号,然后
这一整段就是我们前面的a标签,因为它后面本身自带了一个a标签,所以这a标签就是一个正确的a标签
'>what do you see?
后面这一段,我们不用管他,我们把我们刚刚输入的那个部分,把它复制出来
#' onclick="alert(111)">
这其实就是我们构造的payload,就是一旦我们输入这个内容,按照我们的预期,它应该会在我们的div标签里面,通过我们的dom方法,来获取到这个输入,然后把它输出到div里面,我们来试一下
理论上,这个a标签点一下,就会弹出111
这就说明,这个地方是存在dom型xss漏洞的
我们接下来讲一下don型漏洞的利用,这一串输入既不会在url里面,也不会在后台存储下来,刷新一下,这个东西就没了,其实在我们场景下,这个例子确实是比较鸡肋的,但是不能不说,它是个问题,只能说这个地方是出现了比较低危的dom型xss
它的原因,其实是前端的输入被dom给获取到了,也就是对dom进行了操作,然后通过dom又在前端输出了,它是不经过后台输出的
因为前端的写法千奇百怪,层级也非常复杂,谁都不知道程序员会怎么去写前端的dom操作,我们来看一下,下一个dom型xss的案例
我们看到这个地方,有输入框,我们随便输入一串字符串,点一个提交,他弹了一句话,我们看一下后端的源码,看一下,他的逻辑是怎么样的,我们搜一下,定位一下
我们看到这个地方,也有一段js代码
function domxss(){var str = window.location.search;var txss = decodeURIComponent(str.split("text=")[1]);var xss = txss.replace(/\+/g,' ');
// alert(xss);document.getElementById("dom").innerHTML = "就让往事都随风,都随风吧";}
他在这个地方,定义了一个function,用window.location.search这个dom方法,来获取浏览器的参数,他会把url传参的参数,给获取下来,然后对他进行一个url的解码,用一个字符串进行分割,来获取到对应的内容
var str = window.location.search;var txss = decodeURIComponent(str.split("text=")[1]);var xss = txss.replace(/\+/g,' ');
这一段其实就是从框里面,获取到完整的内容,然后把这个赋值的内容,赋值给xss这么一个变量,然后,他就把xss跟我们刚看到的dom型xss一样,他把他写到了a标签里面,他的输入其实是从浏览器的url里面去获取的,跟我们上面一关不一样的地方,这个场景跟我们反射性的xss,就很像了
我们来构造一下闭合,跟刚刚一样,我们复制一下,然后我们点提交
有些费尽心机想要忘记的事情,后来真的就忘掉了
我们点一下a标签,就会去执行function,function会把a标签的内容,写到div里面
这种情况也是dom型的xss,他只需要把这一段url发送给需要攻击的用户
http://192.168.42.236/pikachu/vul/xss/xss_dom_x.php?text=#'+onclick="alert(111)">#
他只需要打开这个链接,这段恶义的代码,就会被插入到xss里面去,那这个就跟反射型的xss一样了,这个就比我们刚刚讲的dom型xss危害高很多
如果是从url里面获取的参数,那就意味着,我们可以通过js来注入恶意的代码