DOM是什么
我们可以把DOM理解为一个一个访问HTML的标准的编程接口。DOM是一个前端的接口,并没有和后端做任何的交互。
F12的命令控制台里可以操作DOM的接口,控制HTML元素。dom型也是一种反射型。可能触发dom xss的地方有:
document.referer
window.name
location
innerHTML
documen.write
漏洞演示
首先我们在输入框中随便输入一串字符。可以看到弹出一个hello! 的提示。我们查看一下源码看到底做了一个什么样的操作。直接F12元素定位。
我们可以看到 a标签的href属性被置换进了我们输入的内容。如果此时我们开个脑洞,会如何? 试想,我输入的内容,怎么样才可以触发运行一个js代码? 我们把代码在a标签里完善一下,不就可以了吗? html的基础形式,大家要熟知。于是强硬的输入一些内容去闭合当前屏幕上面看到的东西。比如现在是
href=”hello!” onmouseover=”alert(1)” “

带入以后,发现效果不满意!那我们就要分析一下,这个hello到底是怎么来的。是本地处理的,还是提交到服务器去过滤处理的。通过对本地html代码的查看,我们看到这么一段代码:
一点提交,就触发了domxss这个函数。那么我们查查domxss函数到底是怎么个神。搜索定位一下,我们看到:
我们先不要去看答案,直接看核心语句:
function domxss(){var str = document.getElementById("text").value;document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";}//试试:'><img src="#" onmouseover="alert('xss')">//试试:' onclick="alert('xss')">,闭合掉就行
代码的逻辑是重新把dom这个元素里面的html代码给重新改写了。那我们的目标是要闭合href里面的单引号。
代码如下:
hi!!!!’ onmouseover=”alert(‘i am coming!’)”>
这个漏洞如果是服务器端过滤的,就另当别论了。我们最终都可以从单引号和双引号2个方面去分析。
再看看pikachu的第二个例子,我们直接输入一段文字:
大家也可以看我点的效果。同理,我不得不又去看看domxss这个函数有什么不同。看看是不是单引号闭合或者其他的什么幺蛾子。
果然,这跟之前的代码又不同了,我把代码捞出来。
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 = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";}//试试:'><img src="#" onmouseover="alert('xss')">//试试:' onclick="alert('xss')">,闭合掉就行
解释一下,不会的可以百度一下,结合解释。多多少少对javascript的代码要有点了解的。 代码从地址栏后面的问号部分提取出字符串出来。不懂的同学可以这样在F12里看到:
取出来这个字符串以后,对其进行拆分和url解码。然后做一个替换,把+号替换为空格。最终还是要去闭合innerhtml里面的href标签的单引号。
感觉核心还是没变,直接用上一节的内容来试试。
hi!!!!’ onmouseover=”alert(‘i am coming! again!’)”
总结
在时间充裕的情况下,统观全局也是个明智的选择。
