题目地址:https://xss-game.appspot.com
刷完了题会发现,其实这个 XSS小练习 并没有通过很严格的过滤来考察 XSS 的一些 Bypass 手段和不同浏览器的一些特性。但它通过六道题基本概括了一些 XSS 的类型和常见的触发点以及触发方式。其实还是有很多地方值得我们深思。
Level 1: Hello, world of XSS
XSS类型:Reflected XSS
过滤情况:无过滤
影响范围: 点击恶意链接的用户
触发XSS位置: 搜索框
payload: <script>alert('P2hm1n')</script>
Level 2: Persistence is key
XSS类型:Stored XSS
过滤情况:过滤 <script>
标签
Bypass: 利用其他标签
影响范围: 所有能看见帖子的用户
触发XSS位置:留言板
扩展思路:发送帖子等存储位置
payload: <img src=x onerror=alert('P2hm1n')>
Level 3: That sinking feeling…
XSS类型:DOM XSS
过滤情况:无过滤
影响范围: 点击恶意链接的用户
触发XSS位置:选择浏览图片处
扩展思路:通过 JS 选择图片
简单分析如下
漏洞代码:
var html = "Image " + parseInt(num) + "<br>"; |
如果不看代码盲测会发现 #
后面的东西都会被闭合到 <img src="">
里面的 src
属性中。想要逃逸出来的话只能添加 '
一个单引号,来闭合前面的语句
逃逸单引号之后,利用事件弹窗,或者闭合之前标签。均可触发 XSS
payload1: 1' onerror=alert('P2hm1n') '
payload2: 1' <img src=x onerror=alert('P2hm1n')><
Level 4: Context matters
XSS类型:DOM XSS
过滤情况:过滤分号
Bypass: 利用 URL 编码
影响范围: 点击恶意链接的用户
触发XSS位置:计时器;
扩展思路:所有可能自定义JS函数的位置
简单分析如下
自定义了一个JS函数,前端输入的值类似一个计时器。到了响应的秒数会提示到时间了。
输入的数字会进入 JS 函数的变量。为了方便进行代码分析,将输入的数字调大,输入 123
相应 JS 输出位置 <img src="/static/loading.gif" onload="startTimer('123');">
核心思路:1. 闭合 ('
2. 利用分号 3. 利用 ||
payload1: 123') || alert('P2hm1n
payload2: 1')%3Balert('P2hm1n
Level 5: Breaking protocol
XSS类型:Reflected XSS
过滤情况:无过滤
影响范围: 点击恶意链接的用户
触发XSS位置:注册用户
扩展思路:所有链接跳转位置
简单分析如下
首页没有可以和用户交互的点,点击 Sign up 跳转至注册页面。观察 URL 为 https://xss-game.appspot.com/level5/frame/signup?next=confirm
查找 confirm
响应 JS 输出位置 <a href="confirm">
直接利用 JS 伪协议
payload: javascript:alert('P2hm1n')
Level 6: Follow the 🐇
这类 XSS 是我在之前没有遇到过的。一开始盲测时也没有思路
题目中的任务说明告诉我们这里采用动态加载 JS 的方式
这题看了一个歪果仁的 writeup: XSS-game by Google exercises 4, 5 and 6
第一个 payload 是直接利用 DATA URI Scheme 来执行 js 代码
第二个 payload 是利用的 google 的一个 api 来调用 js 代码
payload1: data:text/javascript,alert(1);
payload2: www.google.com/jsapi?callback=alert