两个寻找php反序列化链的tips
前言
分析复现moodle的shibboleth插件未授权反序列化rce漏洞时,学习到两个php反序列化技巧
迭代器
最初想着自己寻找反序列化链,结果没成,查找到moodle有过一个反序列化漏洞CVE-2018-14630,其中用到了迭代器的知识
在php代码中,可以使用foreach遍历某个数组获取key
和value
,同样也可以用来遍历一个对象的所有可见属性
如果被遍历的对象是一个迭代器时(实现Iterator接口),则会依次执行迭代器中的几个方法:rewind
,valid
,current
,key
,next
,可以用来拓展反序列化利用链,具体参看php文档
moodle代码中\core\dml\recordset_walk
的current()
便存在这样的危险操作:
间接加载目标类
既然CVE-2018-14630已经给出了反序列化链,为什么不直接使用呢?实际上可能是因为该CVE是授权后的漏洞,而该案例在未授权情况下其中有两个类,没有在反序列化触发点前加载,导致无法利用
这时候,可通过反序列化某个特定类,该特定类已经加载过目标类或包含过目标类所在文件,达到间接加载目标类的效果
大概类似这样:php自动注册机制无法加载Flag
,但可加载Bridge