第一关
要求: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