XSS Game闯关

第一关

要求:1、弹出1337;2、不能实现用户交互;3、不能使用https://sandbox.pwnfunction.com/?html=&js=&css=.

分析代码,somebody接收参数,赋值给spaghet,在h2标签中输出,输出到页面。

还有一条限制就是,innerHTML中,是被禁止使用<script>标签的,所以以<script>为首的xss都无法使用。

可以使用<img>标签。

https://sandbox.pwnfunction.com/warmups/ma-spaghet.html?somebody=\<img src=1 οnerrοr="alert(1337)">

第二关

要求一样。

分析代码:jeff接收参数,没有参数就默认为JEFF,eval中进行赋值给ma,再在setTimeout中一秒后执行一次,将ma的值赋值给maname,再在h2标签中输出到页面上;值得注意的一点是,这次使用了innerText,而不是innerHTML,前者比后者的过滤更严格,所以用不到第一关的方法了。

但这关的eval是破局点。

eval这个函数就是执行括号中的命令,那么我们可以通过闭合的方式,多执行一些命令。

复制代码
https://sandbox.pwnfunction.com/warmups/jefff.html?jeff=aaaa";alert(1337);"

第三关

分析代码:wey接收参数,默认为do you know da wey?,然后wey还被进行了过滤,过滤掉了标签符号<>。

那么破局点在哪呢?在input中,有很多事件,onclick点击事件,onfocus焦点事件,autofocus自动焦点事件,这里因为要求是不能进行用户交互,所以选择在onfocus后添加autofocus;如何实现呢?就是使用双引号进行闭合,逃逸出来后添加事件。

复制代码
https://sandbox.pwnfunction.com/warmups/da-wey.html?wey=aaa" onfocus=alert(1337) autofocus="

第四关

代码分析:ricardo接收参数,然后ricardo在from表单中,ricardo.action是代表from表单的提交的位置,默认是#,代表当前位置;setTimeout设置了两秒后自动提交。

那么破局点就在from表单的action功能上,在action功能中可以使javascript:alert(1337),然后再根据自动提交功能,执行该xss代码。

复制代码
https://sandbox.pwnfunction.com/warmups/ricardo.html?ricardo=javascript:alert(1337)

第五关

分析代码:markassbrownlee接收参数,赋值给smith,然后smith进行过滤,过滤了括号、单引号、斜杠,然后进入了innerHTML中,赋值给will,这样<script>标签又不能使用了。

但是又过滤了空格,那么alert(1337)就会被过滤,我们就要想办法绕过。

想法是对括号进行编码,编译成%25%28,%25%29,但是编译了符号,会报错,这时我们可以使用location这个语句将这一串代码变成字符串,再进行编译就可以了。

复制代码
https://sandbox.pwnfunction.com/warmups/thats-hawt.html?markassbrownlee=<img src=1 onerror=location="javascript:alert%25281337%2529">

第六关

代码分析:balls接收参数,并过滤掉了字母和数字,这个过滤就太狠了,只能通过编码的方式。

做这一关需要用到一个工具:jsfuck

JSFuck - Write any JavaScript with 6 Characters: []()!+

对alert(1337)进行编码。

然后再在url中进行编码。

第七关

代码分析:mafia接收参数,过滤了单引号、双引号、+、-、!、中括号和alert,最后由eval执行命令。

三种解法:

1、用类来绕过,比如Fuction()(),就可以直接执行,但因为过滤了alert,我们可以使用ALERT来绕过,但js严格过滤了大小写,大写的话,js识别不了,所以我们可以在后面将它绕过过滤后再转变为小写就行了。

复制代码
https://sandbox.pwnfunction.com/warmups/mafia.html?mafia=Function(/ALERT(1337)/.source.toLowerCase())()

2、利用parselnt函数来绕过,parseInt('alert',30),括号中的第一个参数是你要进行转换的字符,后面的参数是你选择的进制,该进制范围为2-36,而且需要注意的是,后面的进制必须比你要转译的字符位数大,比如alert的最大的位数是t,从0-9也就是第九位开始,以字母表的顺序数到t,t是29位,那么你的进制就必须比29大,否则在使用toString转换回来时会少一个字母。

解法:

复制代码
https://sandbox.pwnfunction.com/warmups/mafia.html?mafia=eval(8680439..toString(30))(1337)

3、我们还可以使用location.hash来绕过,location.hash可以把#后面的值给取出来。

不要#的话,就需要在后面再加上slice(1)。

解法:

复制代码
https://sandbox.pwnfunction.com/warmups/mafia.html?mafia=eval(location.hash.slice(1))#alert(1337)

井号后面的值不会进入到代码中,所以可以绕过过滤。

第八关

代码分析:boomer在innerHTML中接收传参,但是我们发现,我们用<img>去xss时,时执行不了的,那是因为DOMPurify这个框架,将所有标签给过滤了,那么我们就不用在这一行代码上找破局点了,我们看setTimeout中,但是发现代码中根本没有ok这这个变量。

那我们就想办法去创建ok这个变量,通过<a id=ok href="tel:alert(1337)">,我们就在代码中插入了这个变量,然后setTimeout在取的时候会把href中的代码当作字符串取出来然后进行执行,为什么不用javascript呢,因为DOMPurify将其过滤了,我们只能使用DOMPurify里的白名单,tel就在其中。

复制代码
https://sandbox.pwnfunction.com/warmups/ok-boomer.html?boomer=%3Ca%20id=ok%20href=%22tel:alert(1337)%22%3E
相关推荐
GISer_Jing2 小时前
前端面试通关:Cesium+Three+React优化+TypeScript实战+ECharts性能方案
前端·react.js·面试
落霞的思绪3 小时前
CSS复习
前端·css
咖啡の猫5 小时前
Shell脚本-for循环应用案例
前端·chrome
百万蹄蹄向前冲7 小时前
Trae分析Phaser.js游戏《洋葱头捡星星》
前端·游戏开发·trae
朝阳5818 小时前
在浏览器端使用 xml2js 遇到的报错及解决方法
前端
GIS之路8 小时前
GeoTools 读取影像元数据
前端
ssshooter9 小时前
VSCode 自带的 TS 版本可能跟项目TS 版本不一样
前端·面试·typescript
Jerry9 小时前
Jetpack Compose 中的状态
前端
dae bal10 小时前
关于RSA和AES加密
前端·vue.js
柳杉10 小时前
使用three.js搭建3d隧道监测-2
前端·javascript·数据可视化