一种DOM Based XSS自动检测雏形

0x00

DOM Based XSS由于其基于流量隐蔽的特点使很多人在制定检测策略的时候会把它单独提出来。

关于漏洞和自动化检测策略详见参考链接,直奔主题吧,在漏洞挖掘中关于DOM Based的XSS自动化检测,有两个想法。第一是基于webkit检测数据包中的dom节点值的变化。第二是基于浏览器插件的被动检测,在浏览过程中使用JS代码提交带有特征的payload并监控dom节点中值的变化。先记录一下第一种的测试经过。

0x01

首先写一个简单的测试页面,点击write按键调用test()函数把cin框中内容写到t标签里。这里没有做任何过滤策略,显然可以触发一个dom型的XSS。

<html>
<body>
<div id = "t"></div>
<input type = "text" id = "cin" value = ""/>
<input type = "button" id = "s" value = "write" onclick="test()"/>
<script>
function test(){
    var str = document.getElementById("cin").value;
    document.getElementById("t").innerHTML=str;
}
</script>
</body>
</html>
 qq%e6%88%aa%e5%9b%be20161011105328

首先试一下一般爬虫,这里对上面代码做一个简单修改,不需要点击提交直接将内容写入div标签。根据漏洞原理也易知,直接从response中是无法检测到我们插入的代码,从下图也可以看到dom based xss的特点。

qq%e6%88%aa%e5%9b%be20161011111634

因此可以考虑使用程序中调用webkit来进行JavaScript解析,然后对返回内容进行检测。python可以使用QTwebkit或者phantomJS来实现。贴一下phantomJS的测试过程吧(QT有很多api包括遍历dom树等非常方便,但是写的时候发现pyload有很多在标签中的,直接通过api来获取有一些小问题)

使用selenium来操作phantomJS

from selenium import webdriver
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
driver = webdriver.PhantomJS(executable_path='/usr/bin/phantomjs') 
driver.get("http://xxx/dom1.html")
#print driver.current_url
js = 'document.getElementById("test").value = "<img src>";'
driver.execute_script(js)
driver.find_element_by_id("s").click()
print driver.page_source
#print driver.find_element_by_id("t").text
driver.quit

程序中execute_script()函数执行JS代码在input框中填入payload,然后调用click()函数点击write button。

qq%e6%88%aa%e5%9b%be20161011111110

从上图可以看到我们写入页面的标签<img >。

0x02

那么可以编写一个思路如下的自动检测雏形:检测response中是否存在domxss漏洞特征函数(如innerHTML/document.wirte等等) -> 生成JS给可控点value赋值为特征pyload -> 生成JS触发关键函数 -> 正则匹配执行后的内容。

具体的一些等git上贴出来再讨论吧,不过细分规则方面我并不拿手(一般是看看某z起头大牛某M起头大牛等偶像们开源出来的程序然后。。偷师,这里再次感谢> <)

这个是最开始调试和编写雏形。当然,经常发现程序写着改着就有很多地方和最初设想的非常不一样。暂时就是这些,更多记录留待后续,有不对的地方或者更好的方法望大家多多指教~

 

发表评论

电子邮件地址不会被公开。