当前位置:网站首页>PHP反序列化漏洞
PHP反序列化漏洞
2022-08-02 03:25:00 【CHIAJ176】
什么是序列化和反序列化
序列化 serialize()
将对象转换成字符串
当在php中创建了一个对象后,可以通过serialize()把这个对象转变成一个字符串,保存对象的值方便之后的传递与使用。
反序列化 unserialize()
将特定格式的字符串转换成对象
与serialize()对应的,unserialize()可以从已存储的表示中创建PHP的值,单就本次所关心的环境而言,可以从序列化后的结果中恢复对象(object)。
魔术方法
__construct() #类的构造函数。但在unserialize()时是不会自动调用的。
__destruct() #类的析构函数,在对象被销毁时执行该函数
__call() #在对象中调用一个不可访问方法时调用
__callStatic() #用静态方式中调用一个不可访问方法时调用
__get() #获得一个类的成员变量时调用
__set() #设置一个类的成员变量时调用
__isset() #当对不可访问属性调用isset()或empty()时调用
__unset() #当对不可访问属性调用unset()时被调用。
__sleep() #执行serialize()时,先会调用这个函数
__wakeup() #执行unserialize()时,先会调用这个函数
__toString() #类被当成字符串时的回应方法
__invoke() #调用函数的方式调用一个对象时的回应方法
__set_state() #调用var_export()导出类时,此静态方法会被调用。
__clone() #当对象复制完成时调用
__autoload() #尝试加载未定义的类
__debugInfo() #打印所需调试信息序列化结构

漏洞原理
未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。
在反序列化的过程中自动触发了某些魔术方法。
触发条件
unserialize函数的变量可控,php文件中存在可利用的类,类中有魔法函数
漏洞利用方式
__wakeup()
对应的CVE编号:CVE-2016-7124
存在的php版本: PHP5.6.25之前版本和7.0.10之前的7.x版本
漏洞成因:当对象的属性(变量)数大于实际的个数时,
__wakeup可以被被绕过
PHP session反序列化
漏洞成因:其主要原理就是利用序列化的引擎和反序列化的引擎不一致时,引擎之间的差异产生序列化注入漏洞。
php 存储session的三种模式
| php_serialize | 经过serialize()函数序列化数组 |
|---|---|
| php | 键名+|+经过serialize()序列化处理后的值 |
| php_binary | 键名长度对应ASCII字符+键名+serialize()序列化的值 |
三种存储模式的区别
<?php
ini_set("session.serialize_handler", "php"); //修改session存储类型为php类型
//ini_set("session.serialize_handler", "php_serialize");
//ini_set("session.serialize_handler", "php_binary");
session_start(); //访问页面时会返回session
$_SESSION['ykingh'] = $_GET['ykingh'];
echo $_SESSION['ykingh'];
?>
第一种,php类型生成的session文件为:ykingh|s:3:"123";
第二种,php_serialize类型生成的session文件为:a:1:{s:6:"ykingh";s:3:"123";}
第三种,php_binary类型生成的session文件为:ykinghs:3:"123";
phar 反序列化
phar在网上已经有很多解释了,这里就不过多赘述,简单来说phar就是php压缩文档,不经过解压就能被 php 访问并执行
前提条件
php.ini中设置为phar.readonly=Off
php version>=5.3.0漏洞成因:phar存储的meta-data信息以序列化方式存储,当文件操作函数(file_exists()、is_dir()等)通过phar://伪协议解析phar文件时就会将数据反序列化,并且可以不依赖unserialize()直接进行反序列化操作。
字符逃逸
PHP 在反序列化时,底层代码是以
;作为字段的分隔,以}作为结尾(字符串除外),并且是根据长度判断内容的 .当长度不对应的时候会出现报错
可以反序列化类中不存在的元素
漏洞成因:利用序列化后的数据经过过滤后出现字符变多或变少,导致字符串逃逸
根据漏洞类型分为两大类:
- 字符串变多
- 字符串变少
Pop chain
后序补充......
边栏推荐
- [campo/random-user-agent]随机伪造你的User-Agent
- 关于tp的apache 的.htaccess文件
- Warzone: 3 (Exogen) vulnhub walkthrough
- [symfony/mailer] An elegant and easy-to-use mail library
- (2) Thinkphp6 template engine ** tag
- Pycharm打包项目为exe文件
- The roll call system and array elements find maximum and minimum values for sorting of objects
- GreenOptic: 1 vulnhub walkthrough
- hackmyvm: controller walkthrough
- 稳定好用的短连接生成平台,支持API批量生成
猜你喜欢

(1) introduction to Thinkphp6, installation view, template rendering, variable assignment

Stable and easy-to-use short connection generation platform, supporting API batch generation

(7) superficial "crawlers" process (concept + practice)

(3)Thinkphp6数据库

IP门禁:手把手教你用PHP实现一个IP防火墙

PHP8.2的版本发布管理员和发布计划

Phpstudy安装Thinkphp6(问题+解决)

Kali install IDEA

(1) print()函数、转义字符、二进制与字符编码 、变量、数据类型、input()函数、运算符

4.表单与输入
随机推荐
Alibaba Cloud MySQL 5.7 installation and some major problems (total)
(4) 函数、Bug、类与对象、封装、继承、多态、拷贝
After the mailbox of the Pagoda Post Office is successfully set up, it can be sent but not received.
[campo/random-user-agent] Randomly fake your User-Agent
(6) Design of student information management system
hackmyvm-bunny walkthrough
17.JS条件语句和循环,以及数据类型转换
SQL:DDL、DML、DQL、DCL相应介绍以及演示
Thread Pool (Introduction and Use of Thread Pool)
(3) 字符串
Phonebook
Various ways of AES encryption
Phpstudy installs Thinkphp6 (problem + solution)
MySql高级 -- 约束
What will be new in PHP8.2?
4.PHP数组与数组排序
(1)Thinkphp6入门、安装视图、模板渲染、变量赋值
Orasi: 1 vulnhub walkthrough
PHP8.2将会有哪些新东西?
Alfa: 1 vulnhub walkthrough