session反序列化漏洞是怎么回事,如何产生的
Admin 2022-08-03 群英技术资讯 835 次浏览
session反序列化的漏洞是由三种不同的反序列化引擎所产生的的漏洞
其中
session.serialize_handler string--定义用来序列化/反序列化的处理器名字。默认使用php
若使用如下设置:
<?php //ini_set('session.serialize_handler', 'php'); //ini_set("session.serialize_handler", "php_serialize"); ini_set("session.serialize_handler", "php_binary"); phpinfo();
则改变了序列化的引擎
save_path则是session的存放路径 我们可以通过改变ini_Set来查看不同引擎下的序列化的类型
三种引擎的存储格式:
php : a|s:3:"wzk"; php_serialize : a:1:{s:1:"a";s:3:"wzk";} php_binary : as:3:"wzk";
漏洞产生在于
php引擎的存储格式是键名 |serialized_string,而php_serialize引擎的存储格式是serialized_string。如果程序使用两个引擎来分别处理的话就会出现问题。
session_start() 会创建新会话或者重用现有会话。 如果通过 GET 或者 POST 方式,或者使用 cookie 提交了会话 ID, 则会重用现有会话。
所以如果存在两种不同的引擎,就可以利用session_start()的自动反序列化,把我们想要传输的数据传输到服务器中:
eg:
<?php ini_set("session.serialize_handler", "php_serialize"); session_start(); $_SESSION['swaggyp'] = $_GET['a']; echo var_dump($_SESSION);
代码1:用来保存在本地一个session
代码2:
<?php ini_set('session.serialize_handler', 'php'); session_start(); echo var_dump($_SESSION); class student{ var $name; var $age; function __wakeup() { // TODO: Implement __wakeup() method. echo "wzk".$this->name; } }
用于读取session然后进行反序列化 若wakeup方法被调用则说明反序列化成功
<?php class student{ var $name; var $age; } $a = new student(); $a->nage = "swaggyp"; $a->age = "1111"; echo serialize($a); //O:7:"student":3:{s:4:"name";N;s:3:"age";s:4:"1111";s:4:"nage";s:7:"swaggyp";}
该代码用于生成一个一个序列
参考于:
生成后,在1中传入这段序列化的值并在开头加入 | 则在第二个文件被解析的时候,就会把|后的内容直接当成一个类去解析 实现我们的目的
成功了
php 这个session.serialize_handler
将 | 后的字符串反序列化,导致产生恶意对象。
upload过程中会产生session,存在一个键值对的值为filename(可控),如果filename被我们修改为|+序列化对象字符串(特殊字符记得转义),filename |后的内容就会被认为是序列化的内容,进而反序列化产生恶意对象(实际上PHP中session是写到文件中的,我们暂且忽略这一中间步骤对此处并无影响),在对象自毁时去执行__destruct()内的语句
<form action =“ upload.php” method =“ POST” enctype =“ multipart / form-data”> <input type =“ hidden” name =“ PHP_SESSION_UPLOAD_PROGRESS” value =“ ryat” /> <input type =“ file” name =“ file” /> <input type =“ submit” /> </ form>
S E S S I O N 中 的 键 值 就 会 为 _SESSION中的键值就会为 SESSION中的键值就会为_SESSION[“upload_progress_ryat”]
,在会话上传过程中,将对会话数据进行序列化/反序列化,序列化格式由php.ini中的session.serialize_handler
选项设置。 这意味着,如果在脚本中设置了不同的serialize_handler
,那么可以导致注入任意session数据
题目:
<?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')); } ?>
构造登录框和payload
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
PHP中实现对文件排序的方法和代码是什么?下文的讲解详细,步骤过程清晰,对大家进一步学习和理解相关知识有一定的帮助。有这方面学习需要的朋友就继续往下看吧!
php想调用swoole时必须要开启Swoole扩展。Swoole是C语言编写,采用编译安装的方式。Swoole是php的服务器异步方案之一。
php中kohana框架:1、定义,是相对较少使用的php框架,它是一个由开放源码组织开发的mvc框架;2、特点,HMVC主要依靠Cotroller、View和模型,拥有加密、认证、数据库访问等常用的附加工具。
本篇文章给大家带来了关于thinkphp的相关知识,其中主要根据示例来看一下使用中间件记录行为日志的问题,包括了使用日志通道暂存行为日志、使用定时任务将日志内容定时写入数据库等,下面一起来看一下,希望对大家有帮助。
设置时区的方法:1、在“php.ini”配置文件中设置时区,更改“date.timezone”项的内容并将项目前的“;”去掉即可;2、利用“date_default_timezone_set()”函数设置时区,在参数内规定指定的时区即可。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008