欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP反序列化漏洞——pikachu

程序员文章站 2022-03-09 14:26:43
...

PHP 序列化

serialize() 函数

作用:
serialize() 函数用于序列化对象或数组,并返回一个字符串。
serialize() 函数序列化对象后,可以很方便的将它传递给其他需要它的地方,且其类型和结构不会改变。

注意:
如果想要将已序列化的字符串变回 PHP 的值,可使用 unserialize()。
PHP 版本要求: PHP 4, PHP 5, PHP 7

示例:
php序列化代码:

<?php
$sites = array('Google', 'Runoob', 'Facebook');
$serialized_data = serialize($sites);
echo  $serialized_data;
?>

运行结果如下图所示:
PHP反序列化漏洞——pikachu
数组(array)通常被序列化为:
a::{<key 1><value 1><key 2><value 2>…}
其中 表示数组元素的个数,<key 1>、<key 2>…… 表示数组下标,<value 1>、<value 2>…… 表示与下标相对应的数组元素的值。
下标的类型只能是整型或者字符串型,序列化后的格式跟整型和字符串型数据序列化后的格式相同。
数组元素值可以是任意类型,其序列化后的格式与其所对应的类型序列化后的格式相同。

a:表示array 数组的意思
3:数组元素个数为3个
i:0:数组中的第一个元素
s:6:表示是一个字符串占了6个字节
“Google”:表示第一个元素的值
剩下的以此类推,详细内容请参考https://www.cnblogs.com/wayne173/p/3747465.html

PHP反序列化

unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。

<?php
$str = 'a:3:{i:0;s:6:"Google";i:1;s:6:"Runoob";i:2;s:8:"Facebook";}';
$unserialized_data = unserialize($str);
print_r($unserialized_data);
?>

或者

<?php
$u = unserialize('a:3:{i:0;s:6:"Google";i:1;s:6:"Runoob";i:2;s:8:"Facebook";}');
print_r ($u);
?>

显示结果如下所示:
PHP反序列化漏洞——pikachu

PHP反序列化漏洞(pikachu)

第一步:打开目标网站,输入任意内容,测试
PHP反序列化漏洞——pikachu
使用firebug插件查看发现数据是使用POST方式传递,传递接收的参数是O
PHP反序列化漏洞——pikachu
代码审计,查看源码,发现存在问题
PHP反序列化漏洞——pikachu
注意:
反序列化漏洞一般通过代码审计的方式发现

实验步骤:
第一步:先输出显示XSS漏洞利用代码的序列化内容
利用代码如下:

<?php
class S{
    var $test = "<script>alert('xss')</script>";
}

echo '<br>';
$a = new S();
echo serialize($a);
?>

访问页面时会弹窗XSS,但问题不大,确定即可
PHP反序列化漏洞——pikachu
右键查看页面源代码结果如下,复制图中标记内容(图中标记内容为的序列化内容)
PHP反序列化漏洞——pikachu
将复制内容粘贴到目标网站,并访问
PHP反序列化漏洞——pikachu
反序列化成功,XSS成功弹窗
PHP反序列化漏洞——pikachu
危害:可以输入任意代码,经过反序列化漏洞带入服务器执行。

相关标签: 反序列化