搜启网站建设,百度开发者中心,wordpress app 服务端,wordpress自己做模板文章目录 1. PHP反序列化1.1 反序列化代码审计1.2 漏洞防御 1. PHP反序列化
可参考我写的另一篇博客#xff1a;反序列化漏洞及漏洞复现。
序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的字符串#xff0c;比如下面是一个对象#xff1a;
class S{publi… 文章目录 1. PHP反序列化1.1 反序列化代码审计1.2 漏洞防御 1. PHP反序列化
可参考我写的另一篇博客反序列化漏洞及漏洞复现。
序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的字符串比如下面是一个对象
class S{public $testpikachu;
}$snew S(); //创建一个对象serialize($s); //把这个对象进行序列化序列化后得到的结果是这个样子的:O:1:S:1:{s:4:test;s:7:pikachu;}O:代表object1:表示该对象的类名的字节数即类名长度为1S:对象的名称1:表示该对象有 1 个属性。s:数据类型4:变量名称的长度test:变量名称s:数据类型7:变量值的长度pikachu:变量值反序列化unserialize()
就是把被序列化的字符串还原为对象然后在接下来的代码中继续使用。
$uunserialize(O:1:S:1:{s:4:test;s:7:pikachu;});echo $u-test; //得到的结果为pikachu注意序列化和反序列化本身没有问题但是如果反序列化的内容是用户可以控制的且后台不正当的使用了PHP中的魔法函数就会导致安全问题。
常见的几个魔法函数:
__construct()当一个对象创建时被调用。__destruct()当一个对象销毁时被调用。__toString()当一个对象被当作一个字符串使用。__sleep()在对象在被序列化之前运行。__wakeup将在序列化之后立即被调用。漏洞举例
class S{var $test pikachu;function __destruct(){echo $this-test;}
}
$s $_GET[test];
$unser unserialize($a);payload:O:1:S:1:{s:4:test;s:29:scriptalert(xss)/script;}开始闯关 输入正常的序列化字符串
O:1:S:1:{s:4:test;s:7:pikachu;}因为这里没有对输入的数据进行过滤。可以结合XSS漏洞来构造我们的攻击字符串。
O:1:S:1:{s:4:test;s:30:scriptalert(wuhu)/script;}1.1 反序列化代码审计
表单接受序列化后的数据进行传递。 注意PHP中的__construct()这个函数虽然在对象创建时会被调用但反序列化unserialize()的时候并不会被调用。当使用 unserialize() 函数从序列化的字符串中恢复对象时构造函数 __construct() 不会被调用。这是因为在反序列化过程中对象是从已有的数据恢复出来的不需要再进行初始化。所以这里的__construct()没有启动任何作用 下面的代码是对输入的值进行判断当输入的值为序列化后的值时unserialize()可以对其进行反序列化if条件判断为假进入else。并没有对用户输入的序列化字符串进行过滤以及识别。 反序列化后的对象 u n s e r 调用其属性 t e s t 并且将值赋值给了 unser调用其属性test并且将值赋值给了 unser调用其属性test并且将值赋值给了html然后输出显示$html。
1.2 漏洞防御
对反序列化数据进行校验在反序列化操作前对输入的序列化字符串进行校验过滤和验证判断数据是否合法。限制应用程序运行账户的权限降低攻击者在利用反序列化漏洞的影响范围。所以安全序列化机制采用安全稳定的序列化协议安全开发规范。