【问题标题】:XSS javascript, exploit checkXSS javascript,漏洞检查
【发布时间】:2023-05-10 05:52:02
【问题描述】:

我目前正在处理一个页面,我需要用户输入几个变量,这些变量在提交时会显示在整个页面中。

问题是,它需要是 100% 安全的代码,虽然我可以使用 PDO/mysql 等,但 javascript 并不是我非常流利的东西。

目前,我有以下内容:

<script language="JavaScript">
function showInput() {
    document.getElementById('var1').innerText = 
                document.getElementById("user_var1").value;
    document.getElementById('var2').innerText = 
                document.getElementById("user_var2").value;
}
</script>

用html

<form>
     your variable 1 is = <input type="text" name="message" id="user_var1"><br />
     your variable 2 is = <input type="text" name="message" id="user_var2"><br />
</form>
 <input type="submit" onclick="showInput();">
  <p>var1 = <span id='var1'></span></p>
  <p>var2 = <span id='var2'></span></p>

据我所知,使用“.innerText”应该会停止使用任何 html 等,并且我已经使用

进行了测试
<script>alert(document.cookie);</script>

这导致上面的内容只是按原样打印(不运行)。

例如

your variable 1 is = <script>alert(document.cookie);</script>

您还有什么其他建议可以确保它是安全的(XSS 或其他)?只有 / 和 A-Z 0-9 是需要输入的字符

提前致谢:)

编辑

澄清一下,唯一的代码就是上面的代码,页面没有从数据库等中提取数据(你在上面看到的实际上是完整的 php 页面,只是缺少 html 头部标签等)。

【问题讨论】:

  • 100% secure code 是什么意思 JS 不安全,它在机器上运行,你无法控制。这里最简单的“攻击”是用我想要的任何东西覆盖showInput,或者如果我只想禁用它,从节点中删除id,弄乱按钮,或者更改按钮上的点击处理程序。这才刚刚开始,那么安全是什么意思?
  • 承认 100% 安全可能是错误的术语。这样,我的意思是用户将无法向主机注入或添加任何内容或使用它来遍历另一个目录(例如使用 ../../../)。例如对于一些使用 mysql 的页面,我不得不更改为 PDO 等以停止注入。
  • 这就是我的意思,用户只需在浏览器中按 F12 即可在您的页面中执行几乎任何他/她想要的。就像showInput = null;document.getElementById('var1').innerHTML = "...whatever..." 或......你(几乎)没有任何控制权。
  • 所以检查元素等意味着您无法控制,您如何建议让用户安全地将变量添加到 html 页面?

标签: javascript xss


【解决方案1】:

仅根据您在上面所做的事情,您不会有 XSS。 innerText 会进行适当的转义。

让您的网站 100% 安全是一项艰巨的任务。我要看的一些东西是通过HTTPSHSTS 运行您的网站,以防止网络级别的对手篡改网站parameterizing your SQL queries,并在提交表单时根据需要添加CSRF 令牌。

特别是关于 XSS,人们获得 XSS 的最常见方式之一是因为他们执行不安全的 DOM 操作。如果您担心安全性,我强烈建议您将 JS 移植到 React,因为您正在操作“虚拟 DOM”,这允许 React 执行上下文相关的转义。它还减轻了开发人员必须进行适当转义的负担。

一个快速的安全胜利是将CSP policy 添加到您的站点并将script-src 指令设置为self。 CSP 策略建立了某些内容可以在您的站点上运行的上下文。因此,例如,如果您将 script-src 设置为 self(这意味着您的 JS 被加载到 &lt;script&gt; 标记的 src 属性中,该标记指向与提供 HTML 的域相同的域,而不是在页面)如果有人进行 XSS,它将(很可能*)不会运行。

这些只是您可以使用的不同安全解决方案的一些示例,以及深入安全实践的简要介绍。很高兴您认真对待安全问题!

*在某些情况下(例如,如果您正在动态生成脚本)它们的代码可以运行。

【讨论】:

  • 谢谢。由于时间将是其中的一个因素,很明显我需要做很多阅读。我正在考虑做的一个选择是使用 iframe 并将上述代码放在不同的托管页面 + 域上。据我所知,任何漏洞利用都应该被困在新的托管包中(从而限制损害)。
  • 当然,这就是利用同源策略 (developer.mozilla.org/en-US/docs/Web/Security/…) 作为防御,只要 iframe 的域上没有敏感信息,这是好的(大部分情况下)跨度>
  • 谢谢 :) 基本上新的托管包只有上面的代码(没有别的)。
  • 是的,有了安全性,您总有办法进一步锁定某些东西。 100% 安全几乎是不可能的,但就您的目的而言,您提出的建议应该没问题:)
  • 谢谢,我已经标记并勾选了,因为我还是新人,我认为我还没有代表来计算它:)
【解决方案2】:

这里没有漏洞(请在投票前阅读)。

只是为了澄清,唯一的代码是上面的,页面不是 从数据库等中提取数据(您在上面看到的实际上是 完整的 php 页面,只是缺少 html 头体标签等)。

因此,以下两个字段不能由当前用户以外的任何人填充:

<input type="text" name="message" id="user_var1">
<input type="text" name="message" id="user_var2">

因为没有填充这两个字段的代码。

代码填充的两个DOM元素如下:

<span id='var1'></span>
<span id='var2'></span>

执行此操作的代码是

document.getElementById('var1').innerText = 
                document.getElementById("user_var1").value;
document.getElementById('var2').innerText = 
                document.getElementById("user_var2").value;

它使用非标准的innerText而不是textContent,但是innerText会设置文本内容而不是HTML内容,阻止浏览器呈现任何标签或脚本。

但是,即使它改为设置innerHTML 属性,用户所能做的就是攻击自己(就像他们在浏览器中打开开发者工具一样)。

但是,为了正确的功能行为和互联网标准,我会使用textContent 而不是innerTextinnerHTML

注意

<script>alert(document.cookie);</script>

无论如何都行不通,它必须是

<svg onload="alert(document.cookie)" />

或类似的。 HTML5 规定不应执行通过 innerHTML 插入的 &lt;script&gt; 标记。

【讨论】:

  • :) 感谢您的意见。真的开始感到困惑,如果通过“检查元素”进行编辑是一种安全风险(因为它的客户端),它怎么可能是安全的。
  • 请注意,此答案部分不正确。虽然问题中的代码确实不容易受到攻击,但如果它使用了 innerHTML 就会受到攻击。从 XSS 的角度来看,如何 注入 javascript 并不重要。如果可能,该页面很容易受到攻击。您可以争辩说风险较小(确实如此),但它仍然容易受到 DOM XSS 的攻击。仅针对这种情况的示例攻击:用户可以在复制到页面 dom 的字段中输入内容,就像上面一样,但使用的是 innerHTML。如果一个同事“有帮助”发送了一条要插入的数据怎么办?