XEE 的防御
XXE 误写为了 XEE,请谅解。
外部实体
外部实体表示外部文件的内容,用 SYSTEM 关键词表示。
参数实体
参数实体只用于 DTD 和文档的内部子集中,XML的规范定义中,只有在DTD中才能引用参数实体. 参数实体的声明和引用都是以百分号%。并且参数实体的引用在DTD是理解解析的,替换文本将变成DTD的一部分。该类型的实体用“%”字符(或十六进制编码的%)声明,并且仅在经过解析和验证后才用于替换DTD中的文本或其他内容
<!DOCTYPE a [
<!ENTITY % name SYSTEM “file:///etc/passwd”>
%name;
]>
参数实体在DTD中解析优先级高于xml内部实体
实体相当于变量 “file:///etc/passwd”赋值给name
具体手法
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
disallow-doctype-decl
不允许文档类型声明(DOCTYPE),设置了这个特性后将可以防御大部分 xxe 攻击
external-general-entities
设置为 false。xml 出现外部普通实体不会解析。
external-parameter-entities
设置为 false。禁用外部参数实体。
参考
https://github.com/Maskhe/javasec/blob/master/16.XXE%E4%B9%8BsetFeature%E9%98%B2%E5%BE%A1.md
https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.md