当前位置: 首页 > article >正文

PHP反序列化6(session反序列化)

考点6:session反序列化

<aside> 💡

session的一些基础知识

</aside>

Directive含义
session.save_handlersession保存形式。默认为files
session.save_pathsession保存路径。
session.serialize_handlersession序列化存储所用处理器。默认为p h p。
session.upload_progress.cleanup一旦读取了所有POST数据,立即清除进度信息。默认开启
session.upload_progress.enabled将上传文件的进度信息存在session中。默认开启

session的反序列化有三种处理引擎

处理器名称存储格式
p h p键名 + 竖线 + 经过 serialize() 函数序列化处理的值
p h p_binary键名的⻓度对应的 ASCII 字符 + 键名 + 经过 serialize() 函数序列化处理的值
p h p_serialize经过serialize()函数序列化处理的数组

实例:(默认查看路径:/var/lib/p h p x/sess_xxxxxxxxxxxxx)

**php_serialize的数据 

a:1:{s:4:"name";s:3:"Ten";}

//上面的a指的是数组

php的数据

name|s:3:"Ten";

php_binary的数据

a:1:{s:4:"name";s:15:"chickenmushroom";}**

<aside> 💡

这有什么问题?

PHP中的Session的实现是没有的问题,危害由于程序员的Session使用不当而引起的。

如:使用不同引擎来处理session文件。

php引擎的存储格式是键名 | serialized_string,而php_serialize引擎的存储格式是serialized_string

如果程序使用两个引擎来分别处理的话就会出现问题。

</aside>

实例:创建一个会话

  1. 先以php_serialize的格式存储,从客户端接收参数并存入session变量,接收页面 1. p hp
<?php
ini_set("session.serialize_handler", "php_serialize");
session_start();
$_SESSION['name']=$_GET['a'];
var_dump($_SESSION);
?>
  1. 对输入值以及session变量就行处理,输出页面 2. p hp
<?php
ini_set("session.serialize_handler", "php");
session_start();
class student{
	var $name;
	var $age;
	function __wakeup(){
		echo "hello".$this->name."!";
	}
}
?>

攻击思路

1.首先访问1. p hp,在传入的参数前面加一个’|’ ,由于1. p hp使用的是p hp_serialize引擎,

因此会把’|’当作一个正常字符处理。

2.接着访问2. p hp,由于用的是p hp引擎,因此遇到’|’会当作分隔符(键名与键值之间的分隔符),

从而造成逃逸,直接对’|’后的值进行反序列化。

<aside> 💡

payload

</aside>

<?php
class student{
	var $name;
	var $age;
}
$o=new student();
$o->name="chickenmushroom";
$o->age="22";
$o='|'.serialize($o);
echo($o);
?>
|O:7:"student":2:{s:4:"name";s:15:"chickenmushroom";s:3:"age";s:2:"22";}

1.将payload传入1. p hp可以看到payload以及写入存储文件

2.访问2.p hp,可以看到我们希望的字符串已经成功触发student类的wake up方法,所以思路是可以行得通的。

<aside> 💡

扩展知识

</aside>

没有$_SESSION变量赋值

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

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

这里不展开试验了。详情参考https://www.jianshu.com/p/fba614737c3d


http://www.kler.cn/a/329116.html

相关文章:

  • Java基础夯实——2.4 线程的生命周期
  • 安全平行切面的概念以及对安全行业影响
  • 【Pythonr入门第二讲】你好,世界
  • 小鹏汽车大数据面试题及参考答案
  • vue2动态导出多级表头表格
  • go-zero(七) RPC服务和ETCD
  • 确保架构与业务一致性和合规性的成功转型之路:理论与实践的全面解读
  • VR视频怎样进行加密和一机一码的使用?--加密(一)
  • Spring Boot 进阶- Spring Boot日志框架介绍
  • Python面向对象基础:属性动态添加
  • Java 编码系列:并发集合详解与面试题解析
  • C语言_字符函数和字符串函数
  • 网络原理-TCP协议
  • 使用 Docker 制作 YashanDB 镜像:深度解析与实战指南
  • 优秀博客:小程序通信方法在 Vue 3 中的对应技术
  • 分页查询前后端代码
  • 怎么在FTP服务器上配置SSL/TLS?
  • Python知识点:如何使用Spark与PySpark进行分布式数据处理
  • Linux——K8s pod调度
  • 用 API 实现 AI 视频摘要:动手制作属于你的 AI 视频小助手
  • docker的harbor仓库登录问题
  • Linux设备上cifx板卡作为ethercat从站的调试记录
  • 【Android 13源码分析】Activity生命周期之onCreate,onStart,onResume-1
  • 计算机网络:计算机网络概述 —— 初识计算机网络
  • 盒子是什么? -- 第四课
  • Meta推出Llama 3.2 AI模型,支持多模态和边缘计算;OpenAI首席技术官穆拉蒂宣布离职