【当然实际上,现在更加常见的是java的序列化漏洞,包括各种模板的漏洞居多】
序列化与反序列化的作用
- 序列化
:将一个对象的状态转换为可以存储或传输的字符串形式。 - 反序列化
:将序列化后的字符串还原为原始对象。
serialize() 序列化(输出是序列化的内容)
unserualize() 反序列化(括号中是序列化的内容)
class User {
public $name;
public $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}
$user = new User("Alice", 25);
$serialized = serialize($user); // 序列化对象
echo $serialized; // 输出类似 O:4:"User":2:{s:4:"name";s:5:"Alice";s:3:"age";i:25;}
$unserialized = unserialize($serialized); // 反序列化
var_dump($unserialized); // 还原为 User 对象
unserialize()
的数据时,他们可以通过构造恶意的序列化字符串来触发代码执行、文件操作或其他危险行为。这种攻击通常依赖于 PHP 的魔术方法(Magic Methods)__construct 对象创建时调用 【序列化创建时候不会调用】
__destruct 对象销毁时调用
__toString 对象被当作字符时调用
__call 调用不存在的方法的时候调用
_inwoke 对象当作函数的时候调用
__wakeup 反序列化时自动调用,里面一般是防火墙
如果要突破__wakeup,把参数的数量+1(使反序列化异常)
unserialize()
时没有严格验证输入数据,则可能导致安全漏洞,称为 反序列化漏洞。本质:
强行不让程序执行正常的业务逻辑,
进入其他的类,进一步执行其他类里面的带有安全隐患的函数;
或者填入违规的参数执行危险命令
如eval system
private 序列化之后: %00类名%00属性名称
protected 序列化之后: %00*%00属性名称
{s:4:"name";s:6:"xiaoli";s:3:"sex";s:6:"female";s:3:"age";i:17;}
不进行private protected 的结果:
O:6:"people":3:{s:4:"name";s:8:"xiaoming";s:3:"age";i:10;s:3:"job";s:7:"student";}
进行private protected 的结果:
O:6:"people":3:{s:4:"name";s:8:"xiaoming";s:6:"*age";i:10;s:11:"peoplejob";s:7:"student";}
原文始发于微信公众号(week网安热爱者):运送违规物资:php反序列化
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论