当前位置:网站首页>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
后序补充......
边栏推荐
猜你喜欢

Several interesting ways to open PHP: from basic to perverted

hackmyvm: juggling walkthrough

IO stream, encoding table, character stream, character buffer stream

Kali环境下Frida编写脚本智能提示

PHP8.2中字符串变量解析的新用法

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

12.什么是JS

(5) 模块与包、编码格式、文件操作、目录操作

PHP入门(自学笔记)

Praying: 1 vulnhub walkthrough
随机推荐
Shuriken: 1 vulnhub walkthrough
(2) 顺序结构、对象的布尔值、选择结构、循环结构、列表、字典、元组、集合
Warzone: 3 (Exogen) vulnhub walkthrough
Phonebook
(2)Thinkphp6模板引擎**标签
DVWA靶机安装教程
Alfa: 1 vulnhub walkthrough
Phonebook
Orasi: 1 vulnhub walkthrough
PHP基金会三月新闻公告发布
16.JS事件, 字符串和运算符
hackmyvm-hopper预排
IO streams, byte stream and byte stream buffer
[mikehaertl/php-shellcommand] A library for invoking external command operations
IP access control: teach you how to implement an IP firewall with PHP
Introduction to PHP (self-study notes)
线程池(线程池介绍与使用)
VIKINGS: 1 vulnhub walkthrough
[league/flysystem] An elegant and highly supported file operation interface
Eric靶机渗透测试通关全教程