【XXE漏洞安全-全网最详细讲解】-CSDN博客
XXE是什么?XXE漏洞原理及案例讲解(从0到1完全掌握XXE)_什么是xxe-CSDN博客
关于XXE
XXE(XML External Entity)(XML外部实体注入)是一种针对应用程序处理XML数据的方式的攻击。在这种攻击中,攻击者利用应用程序对XML输入的处理不当,引入或“注入”恶意内容。这可能导致未授权的数据访问、服务拒绝攻击甚至执行远程代码。
XXE(XML External Entity)漏洞是一种安全漏洞,出现在使用XML解析器的应用程序中。它允许攻击者利用可信任的XML扩展功能来执行恶意操作,如读取本地文件、发起远程网络请求或执行任意命令。
XXE漏洞的发生通常是由于应用程序在解析XML输入时未正确验证或限制实体引用。攻击者可以通过构造恶意的XML输入,将外部实体(external entity)引用进来,然后利用这些实体来获取敏感信息或进行其他攻击。其中最常见的一种攻击是利用DTD(Document Type Definition)来读取本地文件,通过将file://协议和可访问的文件路径嵌入到XML中,攻击者可以读取服务器上的敏感文件内容。
漏洞成因:
解析时未对XML外部实体加以限制,导致攻击者将恶意代码注入到XML中,导致服务器加载恶意的外部实体引发文件读取,SSRF,命令执行等危害操作。
特征:
在HTTP的Request报文出现一下请求报文,即表明此时是采用XML进行数据传输,就可以测试是否存在XML漏洞。
Content-type:text/xml application/xml
攻击原理:
1.攻击者构造恶意的 XML 数据,其中包含对外部实体的引用。
2.XML 解析器无法正确处理这些外部实体引用,导致攻击者可以读取任意文件、进行 SSRF 攻击等。
3.攻击者通过修改 XML 数据,获取敏感信息或进行远程请求。
XXE
关于XML
XML(可扩展标记语言)是一种用于表示和传输数据的标记语言,被设计为传输和存储数据,其焦点是数据的内容 XML 被设计用来结构化、存储以及传输信息,具有跨平台和跨语言的特性。XML 允许创作者定义自己的标签和自己的文档结构
XML和HTML很相似,但它们也有不同的地方:html的目的是显示数据,但是xml的目的是传输数据,他没有预定义,他是纯文本,他是不会做任何事情的。可以自己定义标签。说到底他就是一个储存数据传输数据的东西
XML语法
1. 所有的 XML 元素都必须有一个关闭标签
2. XML 标签对大小写敏感
3. XML 必须正确嵌套
4. XML 属性值必须加引号
5. 实体引用
6. 在 XML 中,空格会被保留
XML特点:
1. 可扩展性:XML允许用户自定义标签和数据结构,因此可以适应各种不同的应用领域和需求。
2. 自我描述性:XML文档具有自我描述性,标签和属性可以提供关于数据的含义和结构的信息。
3. 平台和语言无关性:由于XML采用纯文本格式,因此可以在任何操作系统和编程语言中解析和处理。
4. 可读性:XML文档使用具有可读性的标记和缩进,易于理解和阅读。
XML常用于数据交换和存储,尤其在Web服务、配置文件、数据传输和文档的表示中广泛应用。它提供了一种通用且灵活的方式来组织和传输结构化数据。
关于XXE注入攻击
XML注入攻击和SQL注入攻击的原理一样,利用了XML解析机制的漏洞,如果系统对用户输入"<",">"没有做转义的处理,攻击者可以修改XML的数据格式,或者添加新的XML节点,就会导致解析XML异常,对流程产生影响。
例如:
<?xml version="1.0" encoding="UTF-8" ?>
<user user="guest">用户输入</user>
XML是用于注册访问用户,其中用户名是由用户自己输入的。
攻击者在输入用户的时候,可以构造" user1 < /user> < user role=“admin”>user2"数据去拼接XML,之后整个XML字符串将会变成如下格式。这样就添加了一个管理员权限的用户。
<?xml version="1.0" encoding="UTF-8" ?>
<user role="guest">user1</user>
<user role="admin">user2</user>
关于XML外部实体注入攻击
原理:
XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击,由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。大概意思呢就是程序在解析的时候同时也把攻击者构造的外部实体也解析了
利用外部实体的引用功能实现对任意文件的读取
<?xml version="1.0" encoding="UTF-8" ?>//XML声明
<!DOCTYPE updateProfile [
<!ENTITY admin SYSTEM "file:///etc/password"> ]>
<user><username>&admin;</username><password>123456</password></user>//XML部分,一开始就有的
这个是一个xml文件,我们定义了一个通用实体,并且在文件中去引用这个实体,通过实体去访问敏感信息
&admin:这里的admin类似于css中的id和class,资源定位器,代表一个名为"admin"的实体,和<!ENTITY admin这里的admin相互对应 ,实体被定义为<!ENTITY admin SYSTEM "file:///etc/password">
,它将本地文件/etc/password
的内容定义了一个名为"admin"的实体。
所以,当XML文档中包含&admin;
时,它实际上被替换为/etc/password
文件的内容。这种情况下,它是一个XML外部实体(XXE)攻击的示例,因为它试图通过XML实体引用来访问系统文件。
&和;
在XML中,`&`和`;`符号用于界定实体引用。这是XML的语法规则,用于将实体引用标识为一个实体,以便解析器能够正确地将其替换为对应的实体内容。
例如,当你写 `&admin;` 时,解析器会识别 `&` 和 `;` 之间的部分为一个实体引用。在解析XML时,它会查找相应的实体定义,并将实体引用替换为对应的实体内容。
因此,`&admin;` 不是直接表示 "admin" 这个字符串,而是一个实体引用,它会在解析过程中被替换为对应的实体内容。
[NCTF 2019]Fake XML cookbook
打开环境,输入admin | 123456,使用BP抓包,题目已经提示了XML(其实之前以为是SQL注入。。。。)
我们可以看见在 X-Requested-With里提到了XML
我们就直接进行XML实体注入
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY admin SYSTEM "file:///etc/passwd">]>
<user><username>&admin;</username><password>123456</password></user>
&admin;这里的admin类似于css中的id和class,资源定位器,和<!ENTITY admin这里的admin相对应
得到passwd里的信息,那我们看看能不能直接得到flag
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY admin SYSTEM "file:///flag">]>
<user><username>&admin;</username><password>123456</password></user>