DOM是什么

我们可以把DOM理解为一个一个访问HTML的标准的编程接口。DOM是一个前端的接口,并没有和后端做任何的交互。
基于DOM型XSS漏洞 - 图1
F12的命令控制台里可以操作DOM的接口,控制HTML元素。dom型也是一种反射型。可能触发dom xss的地方有:
document.referer
window.name
location
innerHTML
documen.write

漏洞演示

首先我们在输入框中随便输入一串字符。可以看到弹出一个hello! 的提示。我们查看一下源码看到底做了一个什么样的操作。直接F12元素定位。
image.png
我们可以看到 a标签的href属性被置换进了我们输入的内容。如果此时我们开个脑洞,会如何? 试想,我输入的内容,怎么样才可以触发运行一个js代码? 我们把代码在a标签里完善一下,不就可以了吗? html的基础形式,大家要熟知。于是强硬的输入一些内容去闭合当前屏幕上面看到的东西。比如现在是

href=”hello!” onmouseover=”alert(1)” “

image.png
带入以后,发现效果不满意!那我们就要分析一下,这个hello到底是怎么来的。是本地处理的,还是提交到服务器去过滤处理的。通过对本地html代码的查看,我们看到这么一段代码:
image.png
一点提交,就触发了domxss这个函数。那么我们查查domxss函数到底是怎么个神。搜索定位一下,我们看到:
image.png
我们先不要去看答案,直接看核心语句:

  1. function domxss(){
  2. var str = document.getElementById("text").value;
  3. document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
  4. }
  5. //试试:'><img src="#" onmouseover="alert('xss')">
  6. //试试:' onclick="alert('xss')">,闭合掉就行

代码的逻辑是重新把dom这个元素里面的html代码给重新改写了。那我们的目标是要闭合href里面的单引号。
代码如下:
hi!!!!’ onmouseover=”alert(‘i am coming!’)”>
image.png
这个漏洞如果是服务器端过滤的,就另当别论了。我们最终都可以从单引号和双引号2个方面去分析。


再看看pikachu的第二个例子,我们直接输入一段文字:
image.png
大家也可以看我点的效果。同理,我不得不又去看看domxss这个函数有什么不同。看看是不是单引号闭合或者其他的什么幺蛾子。
image.png
果然,这跟之前的代码又不同了,我把代码捞出来。

  1. function domxss(){
  2. var str = window.location.search;
  3. var txss = decodeURIComponent(str.split("text=")[1]);
  4. var xss = txss.replace(/\+/g,' ');
  5. // alert(xss);
  6. document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
  7. }
  8. //试试:'><img src="#" onmouseover="alert('xss')">
  9. //试试:' onclick="alert('xss')">,闭合掉就行

解释一下,不会的可以百度一下,结合解释。多多少少对javascript的代码要有点了解的。 代码从地址栏后面的问号部分提取出字符串出来。不懂的同学可以这样在F12里看到:
image.png
取出来这个字符串以后,对其进行拆分和url解码。然后做一个替换,把+号替换为空格。最终还是要去闭合innerhtml里面的href标签的单引号。
image.png
感觉核心还是没变,直接用上一节的内容来试试。
hi!!!!’ onmouseover=”alert(‘i am coming! again!’)”
image.png

总结

在时间充裕的情况下,统观全局也是个明智的选择。