3

我正在使用一些旧代码,据报道这些旧代码容易受到跨站点脚本的攻击。代码行是

document.write("<input type=hidden name=field1 value='" + getCookieValue('fieldval') + "' />");

该报告还给出了以下示例,说明如何将恶意代码注入页面。通过将 cookie 值更新为

fieldval='><img src=x onerror=alert(1)>

任何人都可以提供有关如何修复此漏洞的见解吗?

4

2 回答 2

2

您将需要验证来自 getCookieValue 的数据。如果您需要一个数字,请确保返回的值是数字。还要确保该字段中不存在任何转义字符(例如,超出您的 javascript 的引号)。对此的修复如下所示:

function is_valid(value) {
     // Do some check here depending on what you're expecting.
     // I also recommend escaping any quotes (i.e. " becomes \")
     // Ideally, you'd just whitelist what is acceptable input (A-Z0-9 or whatever,
     // and return false from this function if something else is present in 
     // value!)
}

var cookie_value = getCookieValue('fieldval');

if(is_valid(cookie_value)) {
    document.write('<input type="hidden name="field1" value="' + cookie_value + '" />');
}

长话短说,在你 document.write 之前清理数据,否则你最终会得到一个反射的 XSS。

正如上面评论中提到的,源自用户自己的 cookie(他们自己修改的东西)的 XSS 并不是特别令人担忧。但是,任何导致这种情况的编码实践都可能存在于其他地方。我建议您查看您的来源,并确保所有来自用户的输入都被视为不受信任并进行了适当的清理。

于 2013-02-07T19:27:11.900 回答
2

您的代码包含两个错误:

  1. 您在未正确编码的情况下将不受信任的数据插入到输出中(这为反射 XSS 攻击打开了大门)
  2. 您用于document.write将纯 HTML 插入 DOM(这为 DOM XSS 攻击打开了大门)

在重新发明轮子之前,您应该查看 OWASP 备忘单以纠正错误:

  1. OWASP XSS 预防检查表 - 规则 2
  2. 基于 OWASP DOM 的 XSS 预防备忘单 - 规则 2

As you can see, your problem is not fixed by only escaping the quotes. Whitelisting your untrusted data is always the preferred way and a valid advice. For further reading about XSS in general the links contain many references.

于 2013-02-07T20:59:25.967 回答