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
相关推荐
Martin -Tang7 分钟前
vite和webpack的区别
前端·webpack·node.js·vite
迷途小码农零零发8 分钟前
解锁微前端的优秀库
前端
王解1 小时前
webpack loader全解析,从入门到精通(10)
前端·webpack·node.js
我不当帕鲁谁当帕鲁1 小时前
arcgis for js实现FeatureLayer图层弹窗展示所有field字段
前端·javascript·arcgis
那一抹阳光多灿烂1 小时前
工程化实战内功修炼测试题
前端·javascript
放逐者-保持本心,方可放逐2 小时前
微信小程序=》基础=》常见问题=》性能总结
前端·微信小程序·小程序·前端框架
毋若成4 小时前
前端三大组件之CSS,三大选择器,游戏网页仿写
前端·css
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
Black蜡笔小新5 小时前
网页直播/点播播放器EasyPlayer.js播放器OffscreenCanvas这个特性是否需要特殊的环境和硬件支持
前端·javascript·html
秦jh_6 小时前
【Linux】多线程(概念,控制)
linux·运维·前端