什么是反序列化漏洞
也叫PHP对象注入,漏洞形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell等一系列不可控的后果。这个漏洞并不是PHP特有,在Java、Python其他语言也存在,原理基本相通。
比较典型的PHP反序化漏洞可能会用到的魔术方法
1.void __wakeup(void)
2.void __construct ([ mixed $args [, $... ]])
具有构造函数的类会在每次创建新对象时先调用此方法。
3.void __destruct ( void )
析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
4.public string __toString ( void )
5.__toString( ) 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj;应该显示些什么。
漏洞利用过程
1.有一个漏洞触发点 unserialize($_GET['input']);
2.漏洞的效果取决于_destruct这个魔术函数内的操作
3.构建poc.php,利用程序,先序列化后,从可控输入$_GET['input']输入进去。
原理
1.通过serialize来修改类变量,因为serialize序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
2.实际能达到什么效果,要取决于类中的魔术方法了。
Yii2 反序列化漏洞
受影响版本 < Yii2.0.38版本
BatchQueryResult.php 文件中的BatchQueryResult类
所有版本
DiskKeyCache.php 文件中的Swift_KeyCache_DiskKeyCache类
RunProcess.php 文件中的RunProcess类
修复方案:
在类中加入以下方法
public function __sleep()
{
throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
}
public function __wakeup()
{
throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
}
参考以下网址:
https://github.com/yiisoft/yii2/security/advisories/GHSA-699q-wcff-g9mj
https://blog.csdn.net/he_and/article/details/108684623