xss挑戰賽writeup

xss挑戰賽writeup

原文地址 http://www.cnxhacker.com/2014/09/22/1978.html

Posted by: admin 2014年9月22日 Web安全 留下評論

職業在線教育極客學院獲2200萬美元B輪投資

挑戰地址:http://prompt.ml/0

from:https://github.com/cure53/xss-challenge-wiki/wiki/prompt.ml

規則:

  1. 成功執行prompt(1)
  2. payload不需要用戶交互
  3. payload必須對下述瀏覽器有效:
  • Chrome(最新版) – Firefox(最新版) – IE10 及以上版本(或者IE10兼容模式) 4. 每個級別至少給出兩種瀏覽器的答案 5. 字符越少越好

Level 0


代碼

答案

這個payload 24個字符。還有一個比較不常用的技巧,在IE10下,當頁面第一次加載時,會調用resize事件,這個payload只有20個字符

背景知識

resize事件在IE10及以下版本有效,IE11沒有用。並且不需要用戶交互。 更多信息:http://msdn.microsoft.com/en-us/library/ie/ms536959%28v=vs.85%29.aspx

Level 1


該級別實際是簡單的過濾了>,需要繞過以下即可。

代碼

答案

注:譯者使用js改版http://sectest.sinaapp.com/xss/level1.php,測試答案爲

Level 2


該級別過濾了=(兩種符號。

代碼

答案

Firefox 和IE下的答案(29個字符)

Chrome下需要script閉合標籤,所以上述payload不成功。最短的答案如下(35個字符)

未來所有的瀏覽器支持ES6,還可以使用下述編碼:

或者

背景知識

由於xml編碼特性。在SVG向量裏面的<script>元素(或者其他CDATA元素 ),會先進行xml解析。因此&#x28(十六進制)或者&#40(十進制)或者&lpar;(html實體編碼)會被還原成

Level 3


過濾了->。但是2012已經公佈,html5的註釋標籤不僅可以使用-->,還可以使用--!>

代碼

25個字符通殺三個瀏覽器如下:

Level 4


這個題目是利用url的特性繞過,瀏覽器支持這樣的url:http://user:[email protected]。但是http://user:password/@attacker.com是不允許的。由於這裏的正則特性和decodeURIComponent函數,所以可以使用%2f繞過,如下:http://prompt.ml%[email protected]。所以域名越短,答案就越短。

代碼

答案

Level 5


過濾了>,過濾了onXXX=,過濾了focus,所以不能使用autofocus。但是可以使用js的換行\n繞過onXXX=,IE下依然可以使用onresize

代碼

答案: 一種答案是,可以提交設置typeimage,後面的type不能覆蓋前面的設置。
IE下可以使用更短的答案:

Level 6


雖然有過濾,但是可以將輸入插入到form表單的action中。

代碼

答案

33個字符

IE下可以使用vbscript減少字符

Level 7


可以使用js註釋繞過。如下:

代碼

答案

34個字符:

IE下31個字符

背景知識

小技巧:IE下可以使用##async##來加載不需要閉合的script文件。如下:

Level 8


這題使用的兩個技巧

  • <LS>是U+2028,是Unicode中的行分隔符。
  • <PS>是U+2029,是Unicode中的段落分隔符。

另外-->,也可以在js中當註釋使用,資料:https://javascript.spec.whatwg.org/#comment-syntax,因此我們構造答案如下:

代碼

答案

Chrome和Firefox下 14個字符

背景知識

比較奇怪的是,js中的換行符跟unicode中的不一致。另外,HTML代碼的註釋可以在Javascript中使用

Level 9


該題使用正則<([a-zA-Z]),導致無法注入HTML標籤。但是toUpperCase()函數是支持Unicode函數。字符ſ經過函數toUpperCase()處理後,會變成ASCII碼字符”S”。

代碼

答案

26個字符通殺瀏覽器的答案

或者使用async

Level 10


這個題目使用兩個正則過濾。比較容易

代碼

答案

Level 11


這個題目直接允許注入數據到script標籤裏面,但是過濾了特殊符號。這裏的技巧是使用一個數據或者字母擁有操作符的功能,就是in

代碼

答案

背景知識

"test"(alert(1))雖然會提示語法錯誤, 但是還是會執行js語句。類似的alert(1)in"test"也是一樣。可以在控制檯下使用F12執行

Level 12


該題主要是利用toString()解答。eval可以直接執行字符串。如下:

因此,

  • 可以使用eval((1558153217).toString(36))(1)
  • 還可以eval(1558153217..toString(36))(1)
  • 還可以eval(630038579..toString(30))(1)

代碼

答案

32個字符通殺所有瀏覽器

還有一種比較暴力的方法是,通過循環執行self裏面的函數,來查找prompt執行(firfox下測試有效)

Level 13


這個題目涉及到js中的__proto__,每個對象都會在其內部初始化一個屬性,就是__proto__,當我們訪問對象的屬性時,如果對象內部不存在這個屬性,那麼就會去__proto__裏面找這個屬性,這個__proto__又會有自己的__proto__,一直這樣找下去。可以再Chrome控制檯中測試:

輸入

返回

還有一個技巧是,replace()這個函數,他還接受一些特殊的匹配模式https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Description 翻譯如下:

舉個例子就是:

返回

代碼

答案

59個字符,通殺所有瀏覽器

Level 14


這個題目使用base64繞過。

代碼

答案

firfox下94個字符

IE下

背景知識

這裏再次使用了Unicode字符繞過。

Level 15


過濾了,所以不能使用js註釋/,但是前面也提到了,html裏面的<!--,-->同樣可以在js中使用,如下

代碼

答案

57個字符

在Firefox和IE下,</script>不需要,可以減少到42個字符
在最新的Firefox Aurora版本上,還可以如下(譯者未測試):

Hidden Level

這裏主要使用了兩個非常有用的技巧,第一個是javascript的變量提升,以下語法可以在chrome下F12執行

還有一個技巧就是第13題提到的replace()的匹配技巧,使用$&,測試如下:
所以可以構造下面的代碼

code

答案

總共2704個字母

發佈了96 篇原創文章 · 獲贊 22 · 訪問量 58萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章