行业知识
ctf web-部分
**
web基础知识
**
*一.反序列化
在PHP中,反序列化通常是指将序列化后的字节转换回原始的PHP对象或数据结构的过程。PHP中的序列化和反序列化通过serialize()和unserialize()函数实现。
1.序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:
class S{
public $test=“pikachu”;
}
s = n e w S ( ) ; / / 创建一个对象 s e r i a l i z e ( s=new S(); //创建一个对象 serialize( s=newS();//创建一个对象serialize(s); //把这个对象进行序列化
序列化后得到的结果是这个样子的:O:1:“S”:1:{s:4:“test”;s:7:“pikachu”;}
O:代表object
1:代表对象名字长度为一个字符
S:对象的名称
1:代表对象里面有一个变量
s:数据类型
4:变量名称的长度
test:变量名称
s:数据类型
7:变量值的长度
pikachu:变量值
2.反序列化unserialize()
就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
$u=unserialize(“O:1:“S”:1:{s:4:“test”;s:7:“pikachu”;}”);
echo $u->test; //得到的结果为pikachu
3.PHP常见魔法函数
(1)__wakeup()
在PHP中如果需要进行反序列化,会先检查类中是否存在_wakeup()函数,如果存在,则会先调用此类方法,预先准备对象需要的资源。
(2)__sleep()
使用serialize时触发
(3)__destruct()
在对象的所有引用都被删除或类被销毁时自动调用
(4)__construct()
此函数会在创建一个类的实例时自动调用
(5)__toString()
此函数会在类被当作字符串时调用
(6)__get()
在读取不可访问的属性值时自动调用,例如读取私有变量
(7)__call()
调用未定义的方法时调用,例如调用实例化类中未定义的方法
4.序列化其属性
序列化对象:
private变量会被序列化为:\x00类名\x00变量名
protected变量会被序列化为: \x00*\x00变量名
public变量会被序列化为:变量名
5.__wakeup()绕过
版本限制
PHP5:
查找文件:?c=data://text/plain,
利用编码:data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
4.file协议
file伪协议
file 伪协议用于访问本地文件系统中的文件,可以在 web 页面中链接到本地文件,或者读取本地文件中的数据。
上一篇:服务器怎么设置访问限制?