All in One SEO Pack v4.1.0.1存在RCE漏洞CVE-2021-24307,WordPress用户需警惕
最近一直都在对 WordPress 的核心框架以及主流插件中一些有趣的漏洞进行查看。今天,要继续给小伙伴们分享一个主流 SEO 插件所存在的 RCE 漏洞。
漏洞信息
All in One SEO Pack 是一个从 2007 年开始的原始 WordPress SEO 插件。有超过 300 万智能网站所有者使用 AIOSEO 来正确设置 WordPress SEO。因为他们这样做了,所以他们的网站能够在搜索引擎中获得更高的排名。
All in One SEO Pack v4.1.0.1 及其以下版本存在一个 PHP 反序列化漏洞,该漏洞被编号为 CVE-2021-24307,其漏洞信息具体如下:
CVE-2021-24307
反序列化触发分析
下载插件:
all-in-one-seo-packv4.1.0.1
安装并激活:
环境搭建完毕后,我们就可以开始愉快的漏洞分析之旅。
All in One SEO Pack 插件对一套 Restful API 接口(`AIOSEO\Plugin\Common\Api`)进行了自定义。
接口的前缀规则为“aioseo/v1”,并且有一组路由规则是由“$routers”所定义的。
关注一个 POST 请求规则,即“setting/import”。
'settings/import'=> [ 'callback' => [ 'Settings', 'importSettings' ], 'access' => 'aioseo_tools_settings' ]
处理代码处于`AIOSEO\Plugin\Common\Api\Settings`这个函数中,即`importSettings`函数。
这是一个用于处理文件上传请求的接口。若`Content-Type`的类型为`application/octet-stream`,那么处理代码呈现如下情况:
进入`importIniData`函数:
对请求数据包进行分割处理,如通过`\r\n`等方式,同时整理其格式。经过一系列处理步骤之后,会通过`foreach`循环来调用`convertAndSanitize`。
这里有反序列化的处理过程,并且进入了函数“maybe_unserialize”。
回顾上述参数的处理过程,经调试后我们能够构造出如下请求,其中可控参数最终被输入到了`unserialize`函数中。
完整调用栈如下:
上面的请求对应的用户操作界面如下所示:
从上面的分析能够看出,引发反系列化处理的数据是可以完全掌控的。接下来需要做的事情便是去寻觅一条反序列化 Gadget 链。
Gadget构造
WordPress 的核心框架没有可以直接被利用的利用链,因此我们的主要关注点在插件自身的代码上:
All in One SEO Pack 插件将 Monolog 进行了集成,能够借鉴 PHPGGC 工具来构造 gadget。
这里需要注意的是,All in One SEO Pack 里的 Monolog 以特定方式进行了自加载定义。具体而言,它通过 PSR-4 来定义自身的自加载方式。
因此我们构造恶意类时,需要修改namespace:
生成载荷的代码如下:
如果有小伙伴对完整生成命令执行载荷的代码怀有兴趣,那么请关注公众号,之后再私聊本人以进行交流。最终达成了成功触发 RCE 的结果。
修复方式
把`maybe_unserialize`这个函数替换成了`maybeUnserialize`。
public function maybeUnserialize( $string ) {
if ( ! is_string( $string ) ) {
return $string;
}
$string = trim( $string );
if ( is_serialized( $string ) && false === $this->stringContains( $string, 'O:' ) ) {
我们希望为大于 5.6 的 PHP 版本添加额外的加固措施。
return version_compare( PHP_VERSION, '7.0', '<' )
? @unserialize( $string )
: @unserialize( $string, [ 'allowed_classes' => false ] ); 去掉最前面的序号,将长句拆分成多个小分句,使分句尽量简短,同时保持原文风格,禁止修改专有名词,禁止穿插英文单词。
}
return $string;
}
对序列化字符串加强了检查。
使用此文档提供的信息进行传播或利用后,所产生的任何直接或间接的后果及损害,都由使用本人来承担,同时听安全团队以及文章作者不会为此承担任何责任。
文章评论