php反序列化
php反序列化漏洞
一、php面向对象基础
1.面向过程
面向过程是一种以“整体事件”为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数;
2.面向对象
面向对象是一种以“对象”为中心的编程思想,把要解决的问题分解成各个“对象”;对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象;
对象的三个特征:对象的行为,对象的形态,对象的表示
3.类的定义
类是定义了一件事物的抽象特点,它将数据的形式以及这些数据上的操作封装在一起;对象是具有类类型的变量,是对类的实例;
类的定义包括定义类名、定义成员属性、定义成员方法;
内部构成:成员属性(变量)+成员方法(函数)
4.继承
继承性是子类自动共享父类数据结构和方法的机制,是类之间的一种关系;
在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把一个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容;
父类:一个类被其它类继承,可将该类成为父类,或基类,超类;
子类:一个类继承其他类称为子类,也可称为派生类;
5.类的访问权限修饰符
public:公共的,在类的内部、子类和类的外部中都可以被调用;
protected:受保护的,在类的内部和子类可以被调用,在类的外部不可调用;
private:私有的,只能在类的内部调用,在子类和类的外部不可调用;
二、序列化基础
1.概述
序列化是将对象或数组转化为方便存储、传输的字符串,php使用serialize()函数将对象序列化;
序列化只作用于对象的成员属性,不序列化成员方法;
2.序列化值
各类型值的serialize序列化:
空字符 null -> N;
整型 123 -> i:123;
浮点型 1.5 -> d:1.5;
boolean型 true -> b:1;
boolean型 false -> b:0;
字符串 “haha” -> s:4:”haha”;
3.对象序列化
//对象序列化
1 | |
//输出为:
O:4:”test”:5:{s:8:” test a1”;s:4:”haha”;s:5:” * a2”;s:4:”dada”;s:2:”a3”;s:4:”sasa”;s:1:”b”;b:1;s:1:”c”;i:123;}
//解释:大写字母O表示对象,4是类名长度,test为类名,5表示该类有5个成
//员属性,注意private私有属性序列化的属性名格式为“%00类名%00属性名”,
//%00为空格,如上的“ test a1”,protected受保护属性序列化的属性名格
//式为“%00*%00属性名”,如上的“ * a2”,对于存在这两种类型的成员属性的
//类在写payload时通常会使用urlencode()函数编码;其他都是正常的序列化
Public(公有):被序列化时属性值为:属性名
Protected(受保护):被序列化时属性值为:\x00*\x00属性名
Private(私有):被序列化时属性值为:\x00类名\x00属性名
4.pop链序列化
//pop链序列化
1 | |
//输出:
O:5:”test2”:2:{s:1:”h”;s:3:”hhh”;s:1:”d”;O:5:”test1”:3:{s:1:”a”;s:4:”haha”;s:1:”b”;b:1;s:1:”c”;i:123;}}
//对象的成员属性为另一个对象,序列化值出现如上嵌套
5.数组序列化
//数组序列化
//输出:
a:4:{i:0;s:4:”haha”;i:1;i:123;i:2;b:1;i:3;s:3:”ggg”;}
//解释:a表示这是一个数组的序列化,成员属性名为数组的下标,格式”i:数组下标;”
//其他与正常序列化一致
三、反序列化
1.概述
反序列化是将序列化得到的字符串转化为一个对象的过程;
反序列化生成的对象的成员属性值由被反序列化的字符串决定,与原来类预定义的值无关;
反序列化使用unserialize()函数将字符串转换为对象,序列化使用serialize()函数将对象转化为字符串;
//反序列化
1 | |
//输出:
object(test)#1 (2) {
[“a”]=> string(3) “666”
[“b”]=> int(6666)
}
//如上将字符串转换为对象,且对象的值与类预定义的值无关,取决于被反序列化的字符串
2.反序列化漏洞的成因
反序列化过程中unserialize()函数的参数可以控制,传入特殊的序列化后的字符串可改变对象的属性值,并触发特定函数执行代码;
//反序列化漏洞简单案例
1 | |
//如上反序列化的内容是GET方法获得的,是可控的,传入上图注释中的cmd
//内容,可实现执行php代码:phpinfo();
————————————————
原文链接:https://blog.csdn.net/m0_73185293/article/details/131353031