明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

QQ空間的DOM XSS

[摘要]傳統(tǒng)的依靠特征碼探測的Web漏洞掃描器是掃不到DOM XSS的, 為了更好的發(fā)現(xiàn)和修復(fù)漏洞, 所以有必要研究下DOM XSS的檢測。 一年多以前, 針對(duì)公司一些帶參數(shù)的HTML頁面我寫了...

傳統(tǒng)的依靠特征碼探測的Web漏洞掃描器是掃不到DOM XSS的, 為了更好的發(fā)現(xiàn)和修復(fù)漏洞, 所以有必要研究下DOM XSS的檢測。

     一年多以前, 針對(duì)公司一些帶參數(shù)的HTML頁面我寫了一個(gè)vbs腳本來實(shí)現(xiàn)DOM XSS檢測。 大體思想是先使用爬蟲抓一些含有參數(shù)的HTML頁面(例如Google Hacking:inurl:html?url= site:xxx.com.cn), 然后在vbs中創(chuàng)建IE對(duì)象(InternetExplorer.Application)修改url中的參數(shù)訪問頁面, url參數(shù)的字符是“javascript:window.status="xsstest"”, 然后在vbs中調(diào)用IE對(duì)象的StatusTextChange事件, 如果StatusText等于xsstest就可以判斷出基于DOM的XSS。

    這個(gè)方案不是很好, 所以公司的DOM XSS一直沒有解決, 參考了一些業(yè)界的商業(yè)/免費(fèi)漏洞掃描器, 這個(gè)問題都沒有解決。

    所以今天又舊話重提, 繼續(xù)來改進(jìn)該方案。

    嗯, 請(qǐng)先學(xué)習(xí)一下預(yù)備知識(shí), JavaScript的函數(shù)重載。 我們新的思路是利用函數(shù)重載, 自己構(gòu)造代碼替換掉造成XSS的幾個(gè)JS函數(shù), 然后檢查函數(shù)中的參數(shù)值, 發(fā)現(xiàn)特殊字符就大叫一聲:It is DOM XSS!

    先看一段模擬代碼:

<title>DOM XSS Detect Demo</title>

<script>

//保存原來的document.getElementById

sss = document.getElementById;

//保存原來的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.getElementById = _getElementById;

this.navigate = hooknavigate;

}

function _getElementById(s){

vs = s;

setTimeout("GetinnerHTML();", 1000);

return sss(s);

}

function GetinnerHTML(){

var tmpString = sss(vs).innerHTML;

if(tmpString.toLowerCase().indexOf("<hacker>")!=-1){

   alert("沒有過濾<>, 或許有XSS");

}

}

function hookecho(s){

var tmpString = s;

if(tmpString.toLowerCase().indexOf("<hacker>")!=-1){

   alert("沒有過濾<>, 或許有XSS");

}

_echo(tmpString);

}

function hookeval(s){

if(s.toLowerCase().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;

document.getElementById = mydocument.getElementById;

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>

<script>eval( g_url);</script>

    嗯, 很好, 自己看代碼, url里面要構(gòu)造我們的關(guān)鍵字哦。 我們實(shí)現(xiàn)了對(duì)函數(shù)document.write、document.writeln、eval的重載, 一旦代碼中調(diào)用這些函數(shù)就會(huì)先進(jìn)入我們的代碼檢查是否被XSS。 innerHTML是屬性, 沒法重載, 所以我們先放過它, 然后用setTimeout查看改變?yōu)槲覀兊奶卣髯址麤]有。

    等等, 轉(zhuǎn)向的函數(shù)window.navigate、屬性document.location等沒法重載啊, 沒關(guān)系, 前面不是說了用IE對(duì)象嗎, 在關(guān)聯(lián)的事件中檢查要轉(zhuǎn)向的值。

    最后一個(gè)問題, 這段JS要在整個(gè)頁面之前執(zhí)行, 怎么弄?簡單, 你一定見過ARP劫持會(huì)話插入一段HTML代碼在頁面最前面吧——不是叫你ARP欺騙, 可以自己架一個(gè)HTTP道理, 把通過代理的HTTP請(qǐng)求都加一段script。

    基本上就是這樣, 效率肯定不敢保證, 也不敢保證一定能夠解決所有造成XSS的JS函數(shù), 其實(shí)解析JS才是王道, 呃, 或許你以后可以再看到我或者別人寫這個(gè)題目。


上面是電腦上網(wǎng)安全的一些基礎(chǔ)常識(shí),學(xué)習(xí)了安全知識(shí),幾乎可以讓你免費(fèi)電腦中毒的煩擾。




標(biāo)簽:QQ空間的DOM XSS