目录
1.dom型xss平台
第一关 Ma Spaghet !:
(1):当get参数中存在somebody时,h2回显
(2):当get参数中不存在somebody时,h2回显
第二关Jefff:
第三关:Ugandan Knuckles
编辑第四关:Ricardo Milos
1.dom型xss平台
XSS Game - Learning XSS Made Simple! | Created by PwnFunctionXSS Game: Learn Cross Site Scripting (XSS) by completing challenges!https://xss.pwnfunction.com/
第一关 Ma Spaghet !:
<h2 id="spaghet"></h2>
<script>
spaghet.innerHTML = (new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!"
</script>
new URL(location) 创建了一个表示当前页面 URL 的 URL 对象。 .searchParams 是这个 URL 对象的一个属性,它返回一个 URLSearchParams 对象,这个对象包含了 URL 中的查询参数(例如 ?somebody=John 中的 somebody 及其对应的值)。 .get('somebody') 方法用于从查询参数中获取名为 "somebody" 的参数值。如果该参数存在,则返回其值;如果不存在,则返回 null。 || "Somebody" 是一个逻辑或操作符的运用。如果前面 get('somebody') 返回了一个真值(非空字符串),那么就使用这个值;如果返回 null 或者空字符串等假值,就使用 "Somebody" 这个默认值。
(1):当get参数中存在somebody时,h2回显
Somebody Toucha Ma Spaghet! | XSS Warmups
(2):当get参数中不存在somebody时,h2回显
当?somebody=<script>alert(1)</script>时,并没有弹窗,正常在h2标签中会执行,但是这里不能执行的原因为:
spaghet.innerHTML = (new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!"
h2的id为spaghet,我们使用innerHTML将我们get参数传递到h2标签中。
在html 5中指定不执行由 innerHTML
插入的 <script></script>标签
标签代码:name = "<script>alert('I am John in an annoying alert!')</script>";
innerHTML
只过滤了<script>,我们可以写其他的来触发:当传递其他的可以触发js的时就不能过滤
实现网页:https://sandbox.pwnfunction.com/warmups/ma-spaghet.html?somebody=<img%20src=1%20οnerrοr="alert(1337)">
第二关Jefff:
<!-- Challenge -->
<h2 id="maname"></h2>
<script>
let jeff = (new URL(location).searchParams.get('jeff') || "JEFFF")
// 这行代码首先通过 `new URL(location)` 获取当前页面的 URL 对象,然后使用 `searchParams.get('jeff')` 尝试获取 URL 中名为 `jeff` 的查询参数的值。
// 如果没有获取到该参数或者获取到的值为 `null` 或 `undefined`,则将 `jeff` 的值设置为 `"JEFFF"` 。
let ma = ""
eval(`ma = "Ma name ${jeff}"`)
// 这里使用了 `eval` 函数,这是一种不安全且不推荐的做法。`eval` 函数会将传入的字符串作为 JavaScript 代码来执行。
// 在这个例子中,它将字符串 `"Ma name ${jeff}"` 进行求值,并将结果赋给变量 `ma` setTimeout(_ => { maname.innerText = ma }, 1000)
// `setTimeout` 函数用于在指定的毫秒数(这里是 1000 毫秒,即 1 秒)后执行一个回调函数。 // 回调函数中,将变量 `ma` 的值设置为具有 `id` 为 `maname` 的 `h2` 元素的文本内容。 </script>
分析:我们可以看到给h2传参使用的是innerText,所以我们想在maname.innerText = ma上面做基本不可能了。
我们只能考虑在eval中做。
https://sandbox.pwnfunction.com/warmups/jefff.html?jeff=aaa";alert(1337);"
尝试闭合双引号,之后在其中闭合单引号。所以我们需要在传递的变量jeff上做
第三关:Ugandan Knuckles
闭合双引号
https://sandbox.pwnfunction.com/warmups/da-wey.html?wey=aaaaaa "onfocus = alert(1337) autofocus="
第四关:Ricardo Milos
这段代码的意思为在2秒后对from表单进行提交,提交的位置就是ricardo.action 接收到的路径,路径由get参数中的ricardo提供。
在action中可以识别js伪协议,那么就好办了。
https://sandbox.pwnfunction.com/warmups/ricardo.html?ricardo=javascript:alert(1337)