PHP反序列化漏洞——pikachu

PHP 序列化

serialize() 函数

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

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

示例:
php序列化代码:


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

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

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

PHP反序列化

unserialize() 对单一的已序列化的变量进行操作,将其转换回 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);
?>

或者


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

显示结果如下所示:
PHP反序列化漏洞——pikachu_第2张图片

PHP反序列化漏洞(pikachu)

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

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


class S{
    var $test = "";
}

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

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

你可能感兴趣的:(反序列化)