PHP反序列化漏洞——pikachu
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;
?>
运行结果如下图所示:
数组(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)
第一步:打开目标网站,输入任意内容,测试
使用firebug插件查看发现数据是使用POST方式传递,传递接收的参数是O
代码审计,查看源码,发现存在问题
注意:
反序列化漏洞一般通过代码审计的方式发现
实验步骤:
第一步:先输出显示XSS漏洞利用代码的序列化内容
利用代码如下:
<?php
class S{
var $test = "<script>alert('xss')</script>";
}
echo '<br>';
$a = new S();
echo serialize($a);
?>
访问页面时会弹窗XSS,但问题不大,确定即可
右键查看页面源代码结果如下,复制图中标记内容(图中标记内容为的序列化内容)
将复制内容粘贴到目标网站,并访问
反序列化成功,XSS成功弹窗
危害:可以输入任意代码,经过反序列化漏洞带入服务器执行。