一、介绍
PHP反序列化漏洞,源于对用户提供的序列化数据缺乏充分的安全检查和不当使用PHP的“魔术方法”,从而允许攻击者通过构造的序列化字符串来操纵程序逻辑,甚至执行任意代码。
这里要提前认识一下php中serialize(),unserialize()这两个函数,靶场中已经介绍的比价详细了,简单说,序列化就是把传入的数据按照某种格式进行规范书写,反序列化就是把上面的内容翻译回来。
如果用户可以自行控制传入unserialize()的序列化内容,同时又调用了魔术方法,就可能导致安全问题。
二、PHP反序列化漏洞
不会序列化?可以直接用下面的php代码在在线php平台跑下。
<?php
class S{
public $test="KURIA";
}
$s=new S(); //$s可以不是对象,可以是简单的数字、字符串等
echo serialize($s);
?>
这里提供两个已经序列化的内容。
# 正常的序列化内容
O:1:"S":1:{s:4:"test";s:5:"KURIA";}
# XSS payload
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
使用正常的序列化内容。
这里显示了反序列化对象中第一个属性test对应的值,既然可以控制显示内容,就可尝试XSS。
使用XSS的payload。
三、修复方法
检验传入的反序列化内容:在反序列前先对传入内容检验,如存在敏感字符则需要进行进一步的过滤处理。
限制魔术方法的使用:避免在敏感类中使用易受攻击的魔术方法,或者确保这些方法内的代码执行安全且无副作用。
避免直接反序列化不受信任的数据:永远不要直接反序列化来自用户输入或不受信任来源的序列化字符串。
最小权限原则:运行应用程序的用户账户应拥有尽可能少的权限,以减少漏洞被利用时可能造成的损害。
四、后记
这里比较重要的是理解序列化后的格式,明白了每个位置的具体作用后,在实际的攻击渗透测试场景中就可以快速的手搓反序列化内容了。
Comments | NOTHING