Google XSS game
这是谷歌的XSS靶场,每一关的过关条件是能够弹出alert()
即可。
地址:https://xss-game.appspot.com/ (需要科学上网)
Level 1
这是一个反射型XSS,直接输入最基本的XSS代码即可:
1 | <script>alert(/xss/)</script> |
Level 2
留言板应用,显然是一个存储型XSS,尝试<script>
标签无果,尝试使用<img>
标签:
1 | <img src=x onerror=alert(/xss/)> |
Level 3
这是一个页面嵌套,没有可见的可以利用的点,只能从源码入手
1 | <script> |
- 函数解释
parseInt():parseInt() 函数可解析一个字符串,并返回一个整数。
unescape():对通过 escape() 编码的字符串进行解码。
querySelectorAll():返回文档中匹配指定 CSS 选择器的所有元素,返回 NodeList 对象。NodeList 对象表示节点的集合。可以通过索引访问,索引值从 0 开始。
location.hash :hash 属性是一个可读可写的字符串,该字符串是 URL 的锚部分(从 # 号开始的部分)。也就是说,他的作用是把URL的#
以及#
后面的数据取出来,
window.onload():方法用于在网页加载完毕后立刻执行的操作,即当 HTML 文档加载完毕后,立刻执行某个方法。
element.addEventListener(event, function, useCapture):方法用于向指定元素添加事件句柄。第一个参数是事件的类型 (如 “click” 或 “mousedown”)。第二个参数是事件触发后调用的函数。第三个参数是个布尔值用于描述事件是冒泡还是捕获。该参数是可选的。
html():方法设置或返回被选元素的内容(innerHTML)。当该方法用于返回内容时,则返回第一个匹配元素的内容。当该方法用于设置内容时,则重写所有匹配元素的内容。
- 利用方法
我们知道页面会调用chooseTab函数,将url中#后面的字符串做为参数传入。我们需要构造一个字符串,使img标签加载的时候执行我们的代码。这里我们可以把 src 截断,这样他的图片肯定会报错,然后添加一个 onerror 事件执行alert(),最后还要把 img 标签后面的 >
补齐
1 | ' onerror=alert()> |
Level 4
- 查看源码
1 |
|
当我们在 index.html 页面输入时间后,就会把timer
参数传递到 timer.html 页面中,在onload时间时就会触发startTimer函数,我们可以从这个onload事件进行利用,把前一句话闭合,加上自己构造的语句,最后还要把后面的给注释掉,这就是dom xss的利用方法:
1 | ');alert();// |
Level 5
这里有3个页面,分别是welcome,注册和确定
查看源码
- welcome.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<html>
<head>
<!-- Internal game scripts/styles, mostly boring stuff -->
<script src="/static/game-frame.js"></script>
<link rel="stylesheet" href="/static/game-frame-styles.css" />
</head>
<body id="level5">
Welcome! Today we are announcing the much anticipated<br><br>
<img src="/static/logos/level5.png" /><br><br>
<a href="/level5/frame/signup?next=confirm">Sign up</a>
for an exclusive Beta.
</body>
</html>这里可以看到,下面的a标签的链接带了一个
next
参数到signup页面- signup.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<!-- Internal game scripts/styles, mostly boring stuff -->
<script src="/static/game-frame.js"></script>
<link rel="stylesheet" href="/static/game-frame-styles.css" />
</head>
<body id="level5">
<img src="/static/logos/level5.png" /><br><br>
<!-- We're ignoring the email, but the poor user will never know! -->
Enter email: <input id="reader-email" name="email" value="">
<br><br>
<a href="{{ next }}">Next >></a>
</body>
</html>在signup页面把welcome页面传过来的
next
参数直接解析放到了下面的a标签的链接中利用方法
我们可以直接在next
参数中构造攻击语句,当用户点击a标签的时候该语句就能被执行
1 | https://xss-game.appspot.com/level5/frame/signup?next=javascript:alert() |
Level 6
- 查看源码
1 |
|
题目说得很清楚,利用外部js脚本执行alert()。但是对参数做了过滤,不能输入带有http://
开头的参数,这里可以利用大小绕过:
1 | Https://www.google.com/jsapi?callback=alert |
也可以利用data类型的url代替http://
1 | data:text,alert() |
参考资料
- Post title:Google XSS game
- Post author:John_Frod
- Create time:2021-03-10 12:01:12
- Post link:https://keep.xpoet.cn/2021/03/10/Google XSS game/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.