(转)⼀种DOMXSS检测思路
传统的依靠特征码探测的Web漏洞扫描器是扫不到DOM XSS的,为了更好的发现和修复漏洞,所以有必要研究下DOM XSS的检测。
⼀年多以前,针对公司⼀些带参数的HTML页⾯我写了⼀个vbs脚本来实现DOM XSS检测。⼤体思想是先使⽤爬⾍抓⼀些含有参数的HTML页⾯(例如Google Hacking:inurl:html?url= site:xxx),然后在vbs中创建(InternetExplorer.Application)修改url中的参数访问页⾯,url参数的字符是“javascript:window.status="xsstest"”,然后在vbs中调⽤IE对象的StatusTextChange事件,如果StatusText等于xsstest就可以判断出基于DOM的XSS。
这个⽅案不是很好,所以公司的DOM XSS⼀直没有解决,参考了⼀些业界的商业/免费漏洞扫描器,这个问题都没有解决。
所以今天⼜旧话重提,继续来改进该⽅案。
先看⼀段模拟代码:
<title>DOM XSS Detect Demo</title>
<script>
//保存原来的ElementById
sss = ElementById;
//保存原来的document.write(ln)
_echo = document.write;
_echoln = document.writeln;
//保存原来的eval
_eval = eval;
//保存原来的window.navigate
_navigate = window.navigate
var vs;
function _document(){
this.write = hookecho;
this.writeln = hookecho;
this.location = hooklocation;
this.navigate = hooknavigate;
}
function _getElementById(s){
vs = s;
setTimeout("GetinnerHTML();", 1000);
return sss(s);
}
function GetinnerHTML(){
var tmpString = sss(vs).innerHTML;
LowerCase().indexOf("<hacker>")!=-1){
alert("没有过滤<>,或许有XSS");
}
}
function hookecho(s){
var tmpString = s;
LowerCase().indexOf("<hacker>")!=-1){
alert("没有过滤<>,或许有XSS");
}
_echo(tmpString);
}
function hookeval(s){
LowerCase().indexOf("securitytest")!=-1){
alert("eval可控,存在XSS");
}
_eval(s);
}
function hooknavigate(s){
alert(s);
}
var mydocument = new _document();
document.write = mydocument.write;
document.writeln = mydocument.writeln;
eval = hookeval;
window.navigate = hookeval;
</script>
<div id="hi">ss</div>
<script language="javascript">
var g_url;
function QueryList()
{
var url = window.location.href;
var pos = url.indexOf("?");
var suburl= url.substring(pos+1,url.length);
var pos1 = suburl.indexOf("=");
g_url = suburl.substring(pos1+1,url.length);
}
QueryList();
</script>
html实现用户注册登录代码<script>eval( g_url);</script>
嗯,很好,⾃⼰看代码,url⾥⾯要构造我们的关键字哦。我们实现了对函数document.write、document.
writeln、eval的重载,⼀旦代码中调⽤这些函数就会先进⼊我们的代码检查是否被XSS。innerHTML是属性,没法重载,所以我们先放过它,然后⽤setTimeout查看改变为我们的特征字符没有。
等等,转向的函数window.navigate、属性document.location等没法重载啊,没关系,前⾯不是说了⽤IE对象吗,在关联的事件中检查要转向的值。
最后⼀个问题,这段JS要在整个页⾯之前执⾏,怎么弄?简单,你⼀定见过ARP劫持会话插⼊⼀段HTML代码在页⾯最前⾯吧——不是叫你ARP欺骗,可以⾃⼰架⼀个HTTP道理,把通过代理的HTTP请求都加⼀段script。
基本上就是这样,效率肯定不敢保证,也不敢保证⼀定能够解决所有造成XSS的JS函数,其实解析JS才是王道,呃,或许你以后可以再看到我或者别⼈写这个题⽬。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论