Xxe外部实体注入(XML External Entity Injection)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: Xxe外部实体注入(XML External Entity Injection)

原理

程序在解析XML文档输入时,没有禁止外部实体的加载,导致可加载外部的恶意文件,造成文件读取,命令执行,内网扫描,攻击内网网站等危害


危害

XML可以从外部读取DTD文件,如果将路径换成另一个文件的路径,那么服务器在解 析这个XML的时候就会把那个文件的内容赋值给SYSTEM前面的根元素中,只要我们在XML 中让前面的根元素的内容显示出来,就可以读取那个文件的内容。这就造成了一个任意文件 读取的漏洞。


Xxe防御方法

禁用外部实体


使用过滤机制


升级你的XML文档版本


禁止使用外部实体


Xml是什么

a62b936ea61f3e9701c38b08557167f4_b3815fd87de04da6b6163810ce5655a0.png


Xml是可扩展标记语言,Xml引入外部实体而XML的设计宗旨是传输数据,不是显示数据,所以XML是各种应用程序之间数据传输最常用的格式。「与HTML的区别在于一个被设计用来展示数据,一个用来传输数据」。


特点


XML 的设计宗旨是传输数据,而非显示数据


XML 标签没有被预定义,需要自行定义标签。


XML 被设计为具有自我描述性。


XML 是 W3C(www.com) 的推荐标准


Xml引入外部实体与内部实体

外部实体是xml对本服务器外的服务器进行访问的动作,内部实体就是在本服务器执行动作,一般情况下内部实体是攻击者利用不到的


xml结构

结构分为三部分声明,XML声明、DTD文档类型定义(可选)、文档元素


993842b3609a149da577aa2bd5d65f6f_2e61e802658c4c40894b3c43d692e34e.png


DTD(文档类型定义)

dtd作用是定义 XML 文档的规则模块。DTD 可以在 XML 文档内声明,也可以外部引用。


Xxe使用的伪协议

file:用来加载本地文件

http:用来加载远程文件

ftp:用来访问ftp服务器上的文件

php:用来读取php源码


利用方式

探测内网信息、攻击内网网站、读取本地文件、读取远程文件、读取php源码


无回显的xxe怎么利用

(1)使用dnslog平台进行数据外带

(2)构造远程dtd文件造成文件外泄


Xxe详细防御方法

禁用外部实体

这是防范最为严格的手段,从前面的学习我们已经知道XXE的全部利用手段基础都来源于外部实体的注入, 也就是如果禁用了外部实体,那么XXE的所有攻击手段都将失效,无法再正常利用。


代码层禁用


PHP:


libxml_disable_entity_loader(true);


JAVA:


DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();


dbf.setExpandEntityReferences(false);


.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);


.setFeature("http://xml.org/sax/features/external-general-entities",false)


.setFeature("http://xml.org/sax/features/external-parameter-entities",false);


Python:


from lxml import etree xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=


False))


使用过滤机制

在web


服务器中设置黑白名单,对用户输入的数据进行严格的限制,从而防止用户输入恶意数据,断绝产生 XXE的可能性


过滤关键词


<!DOCTYPE、<!ENTITY、SYSTEM、PUBLIC、等DTD中外部实体常用关键词


升级你的XML文档版本

这是防范最不严格的手段,他仅仅只是升级到了更新的版本,有了更加安全的默认配置。在ibxml 2.9.0以后, 默认不解析外部实体,或者禁止使用外部实体。但是依然可以通过手动开启的方式来开启对XML的解析和外 部实体的使用。


下载地址:http://www.linuxfromscratch.org/blfs/view/cvs/general/libxml2.html


工具进行自我检查

由于XXE是一种通用型漏洞,所以在他最初被发现后,经过一段时间就被人开发出了综合利用工具,包含了 基本所有常用的XXE利用手段。我们可以利用工具进行自我检查,并及时修复。


下载地址:https://github.com/enjoiz/XXEinjector/archive/master.zip


其中工具常用的功能参数有以下这些


--host 必填项– 用于建立反向链接的IP地址。(--host=192.168.0.2)


--file 必填项- 包含有效HTTP请求的XML文件。(--file=/tmp/req.txt) --path 必填项-是否需要枚举目录 – 枚举路径。(--path=/etc)


--brute 必填项-是否需要爆破文件 -爆破文件的路径。(--brute=/tmp/brute.txt)


--rhost 远程主机IP或域名地址。(--rhost=192.168.0.3) --rport 远程主机的TCP端口信息。(--rport=8080)


--phpfilter 在发送消息之前使用PHP过滤器对目标文件进行Base64编码。 --proxy 使用代理。(--proxy=127.0.0.1:8080)


--output 爆破攻击结果输出和日志信息。(--output=/tmp/out.txt)


--timeout 设置接收文件/目录内容的Timeout。(--timeout=20)

相关文章
|
XML Java 数据库连接
Mybatis使用generator逆向工程生成器生成entity、mapper、.xml模版类
今天将表建好了,但是一个一个的建实体类、Mapper接口、Mapper.xml文件就十分的麻烦,所以我就想到了MyBatis逆向,今天就操作一把!这里我们采用maven来进行操作。
311 0
|
4月前
|
XML 安全 网络安全
XXE漏洞详解(一)——XML基础
XXE漏洞详解(一)——XML基础
36 1
|
4月前
|
XML 数据格式
Xml Entity 实体互转(JAXB)
Xml Entity 实体互转(JAXB)
75 0
|
4月前
|
XML 数据格式
Xml Entity 实体互转(XStream)
Xml Entity 实体互转(XStream)
27 0
|
XML Java 数据格式
Spring 基于 xml 注入 bean 的几种方式
Spring 基于 xml 注入 bean 的几种方式
209 0
|
7月前
|
SQL Java 数据库连接
Java【付诸实践 01】使用org.apache.ibatis.plugin.Interceptor拦截器实现全局mapper.xml参数注入(可用于切换数据库实例schema)源码实例分享
Java【付诸实践 01】使用org.apache.ibatis.plugin.Interceptor拦截器实现全局mapper.xml参数注入(可用于切换数据库实例schema)源码实例分享
185 0
|
7月前
|
XML Java 数据格式
spring通过文件属性注入bean和基于xml的bean的自动装配以及spring-eel表达式的使用加代码合集
spring通过文件属性注入bean和基于xml的bean的自动装配以及spring-eel表达式的使用加代码合集
95 0
|
7月前
|
XML SQL Java
springboot 项目启动报Has been loaded by XML or SqlProvider, ignoring the injection of the SQL的错误的解决方案
springboot 项目启动报Has been loaded by XML or SqlProvider, ignoring the injection of the SQL的错误的解决方案
888 0
|
XML Java 数据格式
案例03 基于xml配置的setter方法注入案例
通过setter方法方式来演示Spring容器在应用中是如何实现依赖注入的,实现StudentService调用StudentDao的saveStudent操作。
100 0
|
XML Java 数据格式
案例02 基于xml配置的构造方法注入案例
通过构造方法方式来演示Spring容器在应用中是如何实现依赖注入的,实现Student输出学生姓名和年龄。
69 0