异常文本重新解释为 HTML¶
ID: js/xss-through-exception
Kind: path-problem
Security severity: 6.1
Severity: warning
Precision: high
Tags:
- security
- external/cwe/cwe-079
- external/cwe/cwe-116
Query suites:
- javascript-code-scanning.qls
- javascript-security-extended.qls
- javascript-security-and-quality.qls
直接将错误消息写入网页而无需清理,如果错误消息的某些部分可以由用户影响,则会导致跨站脚本攻击漏洞。
建议¶
为了防止跨站脚本攻击,请考虑在将用户输入写入页面之前使用上下文输出编码/转义,或者使用参考资料中提到的其他解决方案之一。
示例¶
以下示例显示将异常直接写入文档,并且此异常可能受页面 URL 的影响,从而使网站容易受到跨站脚本攻击。
function setLanguageOptions() {
var href = document.location.href,
deflt = href.substring(href.indexOf("default=")+8);
try {
var parsed = unknownParseFunction(deflt);
} catch(e) {
document.write("Had an error: " + e + ".");
}
}
示例¶
第二个示例显示使用 JSON 模式验证器 ajv
验证输入,并在发生错误时,将错误消息直接发送回响应中。
import express from 'express';
import Ajv from 'ajv';
let app = express();
let ajv = new Ajv();
ajv.addSchema({type: 'object', additionalProperties: {type: 'number'}}, 'pollData');
app.post('/polldata', (req, res) => {
if (!ajv.validate('pollData', req.body)) {
res.send(ajv.errorsText());
}
});
这是不安全的,因为错误消息可能包含输入的一部分。例如,输入 {'<img src=x onerror=alert(1)>': 'foo'}
将生成错误 data/<img src=x onerror=alert(1)> should be number
,从而导致反射型 XSS。
参考资料¶
OWASP:基于 DOM 的 XSS 防御速查表.
OWASP:XSS(跨站脚本攻击)防御速查表.
OWASP 基于 DOM 的 XSS.
OWASP 跨站脚本攻击类型.
维基百科:跨站脚本攻击.
常见弱点枚举:CWE-79.
常见弱点枚举:CWE-116.