目录
第一关
源码分析
payload
第二关
源码分析
payload
第三关
源码分析
payload
第四关
源码分析
payload
第五关
源码分析
payload
第六关
源码分析
第七关
源码分析
方法一:构造函数
方法二:parseInt
方法三:location.hash
第八关
源码分析
思考
实现
靶场地址:XSS Game - Learning XSS Made Simple! | Created by PwnFunction
第一关
源码分析
他的接收参数是somebody,如果有参数就将它放进我们的innerHTML,第一关比较简单,因为innerHTML只限制了一个标签
所以我们可以利用其他标签比如img
payload
somebody=<img src=1 onerror="alert(1337)">
第二关
源码分析
这是使用jeff传参,通过eval进行一个执行,有一个定时器在一秒以后执行,它将ma name赋值给ma,然后在定时器里将ma赋值给maname.innerText,这里的漏洞出自于eval,我们可以尝试闭合的方法去执行
payload
jeff=aaa";alert(1337);"
第三关
源码分析
用wey传参,它过滤了尖括号,但是它没有过滤双引号,input里面的value值是我们用户进行上传的所以我们还是可以尝试用闭合的方式逃逸出来,这里我们可以利用onclick标签,但是这里是不允许用户交互的,所以我们可以利用onfocus焦点,但这个标签也是需要用户自己去对焦的,不过input还有一个标签叫autofocus自动对焦
payload
wey=aaaa" onfocus=alert(1337) autofocus="
第四关
源码分析
它获取一个form表单的id,两秒以后会进行action的自动提交,而form表单里的action会触发伪协议事件
payload
ricardo=JavaScript:alert(1337)
第五关
源码分析
这里它过滤了括号,反斜杠,转义字符,这里也用来innerHTML,这里过滤了括号所以我们不能用那个函数了,于是想到可以用%28和%29进行编码来运行,但是发现并不能实现,因为js是不允许编码符号的,所以想到利用location将payload变成字符串再进行编码
payload
markassbrownlee=<img src=1 onerror=location="javascript:alert%25281337%2529">
第六关
源码分析
这里过滤掉了字母和数字,这就有点难办了,我们好像前面所有的都需要字母和数字,那么我们是否可以尝试使用编码的方式进行绕过
这里有一个网站可以看到编码:JSFuck - Write any JavaScript with 6 Characters: []()!+ (kamil-kielczewski.github.io)
这里就没有数字和字母了,但是我们不能直接就拿过来用,我们还得进行urlcode编码才能使用
第七关
源码分析
这里也是过滤很多的东西,限制了长度50字符,过滤了alert这个函数,但我们可以利用其他的函数比如confirm依然可以
不过这么做就没什么意义,作者的考点也不在这
方法一:构造函数
Function(/ALERT(1337)/.source.toLowerCase())()
这里我们利用构造函数的方法将大写转换为小写后面的()立即执行
方法二:parseInt
但是必须是30以后才能转换回来10才是A,11是B依次类推到30才是t
mafia=eval(8680439..tostring(30))(1337)
方法三:location.hash
他会将#后面的值给取出来,sllice是截取函数所以可以不将#截取出来
mafia=eval(location.hash.slice(1))#alert(1337)
第八关
源码分析
这里也用到了innerHTML,那我们还是先尝试之前的img标签
发现不行他会将我们后面的给删掉,原因是这里有一个过滤框架
DOMPurify这里就很难办了,这个框架不好绕过,我们只能考虑有没有其他的方式了,那我们只能考虑下面这个函数了,它两秒会执行一个ok但又执行不了
思考
我们发现可以利用id或者name方法将标签取出来,那么这里的ok也许可以出现
他会将这个a标签的值给拿出来,所以我们用a标签里面的href他会自动调用tostring方法把他的字符串输出,而如果我们用object的继承方法它会输出的是对象
这道题我们是需要将我们输出的字符串放到我们第一个参数ok里面去
这函数可以当作字符串放进去,而a标签的href可以自动替换成字符串
boomer=<a id=ok href="javascript:alert(1337)">
但是我们并没有实现
难道我们的思路有问题?
其实并没有,而是我们并没有绕过那个框架
我们这里已经是进来了的只是后面被删了
有些白名单是他允许的,他不会删掉