源代码: Lib/xml/
用于处理XML的python接口分组在 xml
包裹。
警告
XML模块对错误或恶意构造的数据不安全。如果需要分析不可信或未经身份验证的数据,请参阅 XML漏洞 和 这个 defusedxml 包裹 部分。
重要的是要注意 xml
包要求至少有一个符合SAX的XML解析器可用。expat解析器包含在python中,因此 xml.parsers.expat
模块始终可用。
文件 xml.dom
和 xml.sax
包是DOM和SAX接口的python绑定的定义。
XML处理子模块包括:
xml.etree.ElementTree
:elementtree API,一个简单而轻量级的XML处理器
xml.dom
:dom api定义xml.dom.minidom
:最小的DOM实现xml.dom.pulldom
:支持构建部分DOM树
xml.sax
:sax2基类和方便函数xml.parsers.expat
:expat分析器绑定
XML漏洞
对恶意构造的数据不安全。攻击者可以利用XML功能执行拒绝服务攻击、访问本地文件、生成与其他计算机的网络连接或绕过防火墙。
下表概述了已知的攻击以及各种模块是否容易受到攻击。
友善的 |
萨克斯 |
埃特里 |
微型计算机 |
普拉多姆 |
XMLRPC |
---|---|---|---|---|---|
十亿笑声 |
Vulnerable |
Vulnerable |
Vulnerable |
Vulnerable |
Vulnerable |
二次放大 |
Vulnerable |
Vulnerable |
Vulnerable |
Vulnerable |
Vulnerable |
外部实体扩展 |
Safe (4) |
Safe (1) |
Safe (2) |
Safe (4) |
Safe (3) |
DTD 检索 |
Safe (4) |
保险柜 |
保险柜 |
Safe (4) |
保险柜 |
减压炸弹 |
保险柜 |
保险柜 |
保险柜 |
保险柜 |
Vulnerable |
xml.etree.ElementTree
不展开外部实体并引发ParserError
当实体发生时。xml.dom.minidom
不展开外部实体,只逐字返回未展开的实体。xmlrpclib
不展开外部实体并忽略它们。自Python3.7.1以来,默认情况下不再处理外部常规实体。
- 亿笑/指数实体扩张
这个 Billion Laughs 攻击——也称为指数实体扩展——使用多层嵌套实体。每个实体多次引用另一个实体,最终的实体定义包含一个小字符串。指数级扩展会导致数GB的文本,并消耗大量的内存和CPU时间。
- 二次放大实体展开
二次爆破攻击类似于 Billion Laughs 攻击;它也滥用实体扩展。它不是嵌套的实体,而是一次又一次重复一个具有几千个字符的大型实体。这种攻击不如指数级攻击有效,但它避免触发禁止深度嵌套实体的解析器对策。
- 外部实体扩展
实体声明不能只包含用于替换的文本。它们还可以指向外部资源或本地文件。XML解析器访问资源并将内容嵌入到XML文档中。
- DTD 检索
一些XML库,比如python的
xml.dom.pulldom
从远程或本地位置检索文档类型定义。该功能与外部实体扩展问题具有相似的含义。- 减压炸弹
减压炸弹(又名 ZIP bomb )适用于所有可以解析压缩XML流的XML库,如gzip HTTP流或lzma压缩文件。对于攻击者来说,它可以将传输的数据量减少三个数量级或更多。
文件 defusedxml 关于pypi有更多关于所有已知攻击向量的信息,包括示例和参考。
这个 defusedxml
包裹
defusedxml 是一个纯python包,包含所有stdlib xml解析器的修改子类,可以防止任何潜在的恶意操作。建议对解析不受信任的XML数据的任何服务器代码使用此包。该包还附带示例漏洞和更多XML漏洞(如XPath注入)的扩展文档。