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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章