DOM Based XSS: 通过修改页面的DOM节点形成的XSS。
实例:点击write按钮后,会在当前页面插入一个超链接,其地址为文本框的内容。
在test()函数中,修改了页面的DOM节点。通过innerHTML把一段用户数据当做HTML写入到页面中,这就造成了DOM Based XSS。
1 <!DOCTYPE html> 2 <html> 3 <body> 4 5 <script> 6 function test(){ 7 var str = document.getElementById("test").value; 8 document.getElementById("t").innerHTML="<a href ='"+str+"'>testLink</a>"; 9 10 } 11 </script> 12 13 <div id = "t"></div> 14 <input type = "test" id = "test" value = ""/> 15 <input type = "button" id = "s" value = "write" onclick="test()"/> 16 17 </body> 18 </html>
构造如下数据输入: ' onclick=alert(/xss/) //
此时第8行页面代码变成:document.getElementById("t").innerHTML= "<a href = ' ' onclick=alert(/xss/) // '>testLink</a>";
首先用一个单引号闭合掉href的第一个单引号,然后插入一个onclick事件,最后再用注释符”//" 注释掉第二个单引号。之后点击这个新生成的链接,脚本将被执行:
另一种方式:除了构造一个新事件外,还可以选择闭合掉<a>标签,并插入一个新的HTML标签,如输入: ' ><img src=# onerror=alert(/xss2/) />< '
页面代码变成了:
document.getElementById("t").innerHTML="<a href =' '>< img src=# onerror = alert(/xss2/) />< '' >testLink</a>";
点击write按钮,脚本被执行:
(使用 onerror 事件是一种老式的标准的在网页中捕获 Javascript 错误的方法。http://www.w3school.com.cn/js/js_onerror.asp)