目录
第一关:
python
"""
Difficulty is Easy.
Pop an alert(1337) on sandbox.pwnfunction.com.
No user interaction.
Cannot use https://sandbox.pwnfunction.com/?html=&js=&css=.
Tested on Chrome.
"""
html
<h2 id="spaghet"></h2>
<script>
spaghet.innerHTML = (new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!"
</script>
进入页面:

首先观察代码发现参数`somebody`,第一关没有使用什么过滤,只是浏览器自动过滤了<script></script>
直接使用<img src=1 οnerrοr=alert(1)>

第二关:
python
"""
Difficulty is Easy.
Pop an alert(1337) on sandbox.pwnfunction.com.
No user interaction.
Cannot use https://sandbox.pwnfunction.com/?html=&js=&css=.
Tested on Chrome.
"""
html
<h2 id="maname"></h2>
<script>
let jeff = (new URL(location).searchParams.get('jeff') || "JEFFF")
let ma = ""
eval(`ma = "Ma name ${jeff}"`)
setTimeout(_ => {
maname.innerText = ma
}, 1000)
</script>
进入首页:

观察代码发现参数`jeef`,将值传入`ma`中,最后将`ma`的值传给`maname`,
看到eval可以发现,恶意代码可以直接在ma中执行,可以不用走到下面的延迟函数,也可以让走到后面。并且发现代码中并没有什么过滤手段,因此只需要在jeff给ma传输数据的时候,让`alert(1)`事件发生在文本外就行,使用双引号闭合之前的双引号,分号闭合前面给ma的赋值文本,最后使用双斜杠注释掉末尾的双引号
因此无论是使用`";alert(1)//`还是`";javascript:alert(1)//`都可以


第三关:
python
"""
Difficulty is Easy.
Pop an alert(1337) on sandbox.pwnfunction.com.
No user interaction.
Cannot use https://sandbox.pwnfunction.com/?html=&js=&css=.
Tested on Chrome.
"""
html
<div id="uganda"></div>
<script>
let wey = (new URL(location).searchParams.get('wey') || "do you know da wey?");
wey = wey.replace(/[<>]/g, '')
uganda.innerHTML = `<input type="text" placeholder="${wey}" class="form-control">`
</script>
进入首页:

观察代码发现参数`wey`,同时过滤了<和>符号,但是能够发现wey在input标签内。而input标签有onfocus元素焦点事件属性,这个属性可以通过点击设置此属性的元素来触发,但是这就需要与用户交互了,而autofocus可以自动触发焦点事件,与onfocus联用可以触发不需要用户交互的操作。
代码:`2" autofocus οnfοcus="alert(1)"`

第四关:
python
"""
Difficulty is Easy.
Pop an alert(1337) on sandbox.pwnfunction.com.
No user interaction.
Cannot use https://sandbox.pwnfunction.com/?html=&js=&css=.
Tested on Chrome.
"""
html
<form id="ricardo" method="GET">
<input name="milos" type="text" class="form-control" placeholder="True" value="True">
</form>
<script>
ricardo.action = (new URL(location).searchParams.get('ricardo') || '#')
setTimeout(_ => {
ricardo.submit()
}, 2000)
</script>
进入首页:

分析代码发现参数`ricardo`,最终如果ricardo有值的话`ricardo.action`会将表单form中的action改为ricardo的值。由于action的值要跳转的话只能是url或协议字符串,因此直接选用JavaScript伪协议
代码:`javascript:alert(1)`

第五关:
python
"""
Difficulty is Easy.
Pop an alert(1337) on sandbox.pwnfunction.com.
No user interaction.
Cannot use https://sandbox.pwnfunction.com/?html=&js=&css=.
Tested on Chrome.
"""
html
<h2 id="will"></h2>
<script>
smith = (new URL(location).searchParams.get('markassbrownlee') || "Ah That's Hawt")
smith = smith.replace(/[\(\`\)\\]/g, '')
will.innerHTML = smith
</script>
进入首页:

分析代码发现参数`markassbrownlee`,首先将参数赋值给smith,然后过滤掉了括号、反引号和反斜杠,本来即使过滤了括号也可以使用反引号触发执行,但是现在两个都过滤了,因此可以考虑编码了,首先了解编码形式url编码最先执行,其次是HTML实体编码,最后是js编码。在这里js编码不适用,因为js编码不能给符号编码,因此考虑url编码,但是只使用url编码或HTML实体编码,第一种会被过滤掉,第二种不会被识别。因此我选用的是先用HTML实体编码给`(1)`编码,然后使用url编码,因为再导航栏中首先解码url编码,最后再页面内解码HTML编码
代码:`<img src=1 οnerrοr=alert%26%23x0028%3b%26%23x0031%3b%26%23x0029%3b>`

第六关:
python
"""
Difficulty is Easy.
Pop an alert(1337) on sandbox.pwnfunction.com.
No user interaction.
Cannot use https://sandbox.pwnfunction.com/?html=&js=&css=.
Tested on Chrome.
"""
html
balls = (new URL(location).searchParams.get('balls') || "Ninja has Ligma")
balls = balls.replace(/[A-Za-z0-9]/g, '')
eval(balls)
进入首页:
首页什么东西都没有,观察代码发现参数balls,但是这个参数最后过滤了所有大小写字母和数字,因此想到有另外一种编码方式,JSFuck编码,因为是将balls直接放在了eval内部因此直接执行alert(1)即可触发,因此需要将此代码编码,首先编写成JSFuck编码直接写入,导航栏会无法识别,因此给JSFuck编码外部在编码一次url编码即可
