技术博客 > 正文

漏洞分析 | WordPress Bricks Builder远程代码执行漏洞

2024-04-22

漏洞概述
Bricks Builder 是WordPress上的一款功能强大的主题编辑插件。近日,网宿演武安全实验室发现,在WordPress小于1.9.6版本的默认配置中存在远程代码执行漏洞,导致用户可以绕过权限检查,并最终实现远程代码执行,获取服务器权限。该漏洞利用条件简单,影响范围甚广,建议广大企事业单位检查WordPress版本并修复相关漏洞,或引入Web防护方案,阻止针对该漏洞的利用行为。

受影响版本
Bricks Builder <= 1.9.6

漏洞分析
根据公开的漏洞概述以及poc,首先全局定位到/bricks/v1/render_element路由,在bricks/includes/api.php文件中注册了该REST API路由,定义了请求方式,回调函数render_element以及权限检查回调函数render_element_permissions_check。

三度蝉联!网宿科技再获2019行业影响力品牌等双殊荣

我们在源码上打上断点,动态调试,进一步分析。在服务器收到请求后,会先调用权限检查回调函数。

三度蝉联!网宿科技再获2019行业影响力品牌等双殊荣

跟入bricks/includes/api.php,其权限检查回调函数render_element_permissions_check中,发现其通过nonce的值来进行权限校验。

三度蝉联!网宿科技再获2019行业影响力品牌等双殊荣

然而在bricks中,它将有效的nonce包含进入了前端,刷新wordpress主页,可在前端源码中全局查找到nonce。这意味着这个权限检查回调函数完全失效,任何未授权的用户都可以在该api执行操作。

三度蝉联!网宿科技再获2019行业影响力品牌等双殊荣

在从前端提取的nonce值通过有效验证后,接着跟入到回调函数render_element中,在其中调用了Ajax::render_element函数,并将我们请求体中的参数传入。

三度蝉联!网宿科技再获2019行业影响力品牌等双殊荣

接着跟入bricks/includes/ajax.php的render_element函数中,在该函数中主要是根据参数查找出Element_Code类,并进行实例化。

三度蝉联!网宿科技再获2019行业影响力品牌等双殊荣

实例化后调用init(),接着在bricks/includes/elements/base.php中跟进该函数。

三度蝉联!网宿科技再获2019行业影响力品牌等双殊荣

在其中关注this->render()函数,继续在bricks/includes/elements/code.php跟进,发现其主要是进行一些危险函数调用检查后,以异常处理的方式用eval函数执行配置里面用户提交的code代码。在这里code参数用户可控,可配合采用的方式实现代码执行。

三度蝉联!网宿科技再获2019行业影响力品牌等双殊荣

最后从当前缓冲区的内容得到代码执行的结果,一步一步回调完成请求。

三度蝉联!网宿科技再获2019行业影响力品牌等双殊荣

三度蝉联!网宿科技再获2019行业影响力品牌等双殊荣

三度蝉联!网宿科技再获2019行业影响力品牌等双殊荣

漏洞复现
采用wordpress6.4.3+bricks builder1.9.4本地搭建。在wordpress首页查看源码全局搜索nonce的值。

三度蝉联!网宿科技再获2019行业影响力品牌等双殊荣

用Burpsuite在http://127.0.0.1/wordpress/?rest_route=/bricks/v1/render_element下构造请求,并且以post的方式提交以下数据执行命令“python --version”。在返回的结果中可以成功查看到当前主机的python版本。

三度蝉联!网宿科技再获2019行业影响力品牌等双殊荣

受影响资产
从fofa上查询相关资产有25000多个,fofa语句:body="/wp-content/themes/bricks/"

三度蝉联!网宿科技再获2019行业影响力品牌等双殊荣

修复方案
尽快使用最新wordpress bricks builder theme版本,不采用nonce作为权限检查回调函数鉴权以及对用户提交输入进行严格的检查过滤。

本文内容的版权持有者为网宿科技股份有限公司(“网宿科技”),未经许可,不得转载。