我正在使用一些旧代码,据报道这些旧代码容易受到跨站点脚本的攻击。代码行是
document.write("<input type=hidden name=field1 value='" + getCookieValue('fieldval') + "' />");
该报告还给出了以下示例,说明如何将恶意代码注入页面。通过将 cookie 值更新为
fieldval='><img src=x onerror=alert(1)>
任何人都可以提供有关如何修复此漏洞的见解吗?
我正在使用一些旧代码,据报道这些旧代码容易受到跨站点脚本的攻击。代码行是
document.write("<input type=hidden name=field1 value='" + getCookieValue('fieldval') + "' />");
该报告还给出了以下示例,说明如何将恶意代码注入页面。通过将 cookie 值更新为
fieldval='><img src=x onerror=alert(1)>
任何人都可以提供有关如何修复此漏洞的见解吗?
您将需要验证来自 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 并不是特别令人担忧。但是,任何导致这种情况的编码实践都可能存在于其他地方。我建议您查看您的来源,并确保所有来自用户的输入都被视为不受信任并进行了适当的清理。
您的代码包含两个错误:
document.write
将纯 HTML 插入 DOM(这为 DOM XSS 攻击打开了大门)在重新发明轮子之前,您应该查看 OWASP 备忘单以纠正错误:
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.