前言

分析复现moodle的shibboleth插件未授权反序列化rce漏洞时,学习到两个php反序列化技巧

迭代器

最初想着自己寻找反序列化链,结果没成,查找到moodle有过一个反序列化漏洞CVE-2018-14630,其中用到了迭代器的知识

在php代码中,可以使用foreach遍历某个数组获取keyvalue,同样也可以用来遍历一个对象的所有可见属性

如果被遍历的对象是一个迭代器时(实现Iterator接口),则会依次执行迭代器中的几个方法:rewindvalidcurrentkeynext,可以用来拓展反序列化利用链,具体参看php文档

moodle代码中\core\dml\recordset_walkcurrent()便存在这样的危险操作:

间接加载目标类

既然CVE-2018-14630已经给出了反序列化链,为什么不直接使用呢?实际上可能是因为该CVE是授权后的漏洞,而该案例在未授权情况下其中有两个类,没有在反序列化触发点前加载,导致无法利用

这时候,可通过反序列化某个特定类,该特定类已经加载过目标类或包含过目标类所在文件,达到间接加载目标类的效果

大概类似这样:php自动注册机制无法加载Flag,但可加载Bridge