CVE-2021-47811Grocery Crud是一个广泛使用的开源PHP库,用于快速生成CRUD(创建、读取、更新、删除)操作界面。该库为开发者提供了简洁的API来构建数据库管理后台,无需编写大量重复性代码。然而,Grocery Crud 1.6.4版本中存在一个严重的SQL注入漏洞,攻击者可以利用该漏洞无需任何认证即可对数据库进行未授权访问。该漏洞位于处理排序功能的order_by参数中,攻击者通过构造恶意的POST请求到ajax_list端点,可以在order_by[]参数中注入任意SQL代码。由于该参数直接参与到SQL查询构建过程中且未经过充分的输入过滤和参数化处理,导致攻击者可以操纵数据库查询逻辑。此漏洞的CVSS评分高达9.1,属于严重级别,攻击成功后可导致敏感数据泄露、数据库内容篡改,甚至在某些配置下可能实现远程代码执行。鉴于Grocery Crud在全球范围内被大量Web应用使用,该漏洞可能影响数千个依赖该库构建后台管理系统的应用。
漏洞根源在于Grocery Crud的ajax_list端点对order_by参数的处理方式。当用户发起POST请求到ajax_list端点时,程序会接收order_by[]数组参数并直接将其值拼接到SQL查询的ORDER BY子句中。具体来说,攻击者可以在POST请求中构造类似order_by[]=id; DROP TABLE users--的恶意载荷。由于该参数未经过任何输入验证或SQL转义处理,恶意SQL代码会被直接执行。攻击者可以利用UNION SELECT语句提取数据库中的敏感信息,如用户凭证、管理员账号等;也可以使用INSERT/UPDATE语句修改数据库内容;甚至在特定数据库配置下可以通过 INTO OUTFILE 或 xp_cmdshell 等方式实现系统级攻击。漏洞的利用不需要任何认证,因为ajax_list端点在设计时允许匿名访问。攻击者只需构造一个带有恶意order_by参数的HTTP POST请求即可触发漏洞,无需任何前置条件或特殊权限。