漏洞概述
Lazy Blocks 是一款 WordPress Gutenberg 插件,允许用户通过可视化界面创建自定义块,并支持在块模板中直接编写 PHP 代码作为渲染逻辑。
该漏洞的核心问题在于对用户输入缺乏严格的类型检查与过滤,特别是在 REST API 接口及自定义块构建器模块中,导致已认证用户可通过构造恶意参数触发代码执行。(网宿评分:高危、CVSS 3.1 评分:8.8)
目前该漏洞POC状态已在互联网公开,建议用户尽快做好自查及防护。
受影响版本
Lazy Blocks <= 4.2.0
漏洞分析
从危险函数出发,classes/class-blocks.php这里有一个显眼的eval

$code直接拼进eval,没有任何过滤。接着思考$code能不能被外部控制?
全局搜索php_eval的调用,只有一处,位于render_callback():

触发条件很清晰,需要同时满足两点:
- $code['output_method'] 等于 'php'
- $code[$custom_render_name] 有值,这就是最终传入eval的内容
继续往上追,$code从哪来:
![]()
$block['code']在marshal_block_data_with_controls()里组装:

继续搜索marshal_block_data(封装了marshal_block_data_with_controls)的调用方,找到classes/class-rest.php的 block_builder_preview:


这个接口的作用在于,用户在后台编辑块时,编辑器调它来即时看效果,所以它接收的是还没存库的原始配置,直接走渲染流程。导致code_output_method和code_editor_html会原样流入marshal_block_data,最终到达php_eval,全程没有经过数据库,所以也不经过任何保存时的校验。
那么触发这个接口需要什么权限?

显然,请求里不带post_id时,系统只检查edit_posts。而WordPress里的Contributor角色默认就有edit_posts,即注册用户就能申请到的最低编辑权限。
漏洞复现

修复方案
目前官方已有可更新版本,建议受影响用户升级至最新版本:
https://wordpress.org/plugins/lazy-blocks/
产品支持
网宿全站防护-WAF已支持对该漏洞利用攻击的防护,并持续挖掘分析其他变种攻击方式和各类组件漏洞,第一时间上线防护规则,缩短防护“空窗期”。
&spm=1001.2101.3001.5002&articleId=161396336&d=1&t=3&u=31d9704129bf411fbc09c2ff85c8f2c2)
1610

被折叠的 条评论
为什么被折叠?



