CodeQL 文档

XML 外部实体扩展

ID: js/xxe
Kind: path-problem
Security severity: 9.1
Severity: error
Precision: high
Tags:
   - security
   - external/cwe/cwe-611
   - external/cwe/cwe-827
Query suites:
   - javascript-code-scanning.qls
   - javascript-security-extended.qls
   - javascript-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

使用配置较弱的 XML 解析器解析不受信任的 XML 文件可能会导致 XML 外部实体 (XXE) 攻击。这种类型的攻击使用外部实体引用访问系统上的任意文件,执行拒绝服务 (DoS) 攻击或服务器端请求伪造。即使解析结果没有返回给用户,DoS 攻击仍然可能发生,并且带外数据检索技术可能允许攻击者窃取敏感数据。

建议

防止 XXE 攻击的最简单方法是在解析不受信任的数据时禁用外部实体处理。如何做到这一点取决于所使用的库。请注意,某些库,例如最新版本的 libxml,默认情况下会禁用实体扩展,因此,除非您明确启用了实体扩展,否则无需采取进一步措施。

示例

以下示例使用 libxml XML 解析器解析字符串 xmlSrc。如果该字符串来自不受信任的来源,则此代码可能容易受到 XXE 攻击,因为解析器使用 noent 选项设置为 true 来调用。

const app = require("express")(),
  libxml = require("libxmljs");

app.post("upload", (req, res) => {
  let xmlSrc = req.body,
    doc = libxml.parseXml(xmlSrc, { noent: true });
});

为了防止 XXE 攻击,应省略 noent 选项或将其设置为 false。这意味着根本不会进行实体扩展,即使是 &> 等标准内部实体也是如此。如果需要,可以使用库(如 underscorelodashhe)提供的实用函数在单独的步骤中扩展这些实体。

const app = require("express")(),
  libxml = require("libxmljs");

app.post("upload", (req, res) => {
  let xmlSrc = req.body,
    doc = libxml.parseXml(xmlSrc);
});

参考文献

  • ©GitHub, Inc.
  • 条款
  • 隐私