CVE-2025-13372CVE-2025-13372是Django框架中的一个高危SQL注入漏洞,影响Django 5.2之前5.2.9版本、5.1之前5.1.15版本以及4.2之前4.2.27版本。该漏洞存在于Django的FilteredRelation功能中,当使用PostgreSQL作为数据库后端时,通过QuerySet.annotate()或QuerySet.alias()方法传递精心构造的字典作为**kwargs参数时,可导致列别名发生SQL注入攻击。攻击者无需认证即可利用此漏洞,但需要诱导用户交互(如点击恶意链接或访问特制页面)来触发注入代码执行。该漏洞主要影响使用Django ORM进行复杂查询且依赖FilteredRelation功能的Web应用程序。攻击成功可能导致敏感数据库信息泄露,包括用户数据、配置信息或其他机密内容。Django官方已于2025年12月2日发布安全更新修复此漏洞,并建议所有用户立即升级到最新版本。早期不支持的Django系列(如5.0.x、4.1.x、3.2.x)虽然未被正式评估,但可能同样存在风险。
该SQL注入漏洞源于Django ORM在处理FilteredRelation的列别名时对用户输入的不当验证。在Django的QuerySet.annotate()和QuerySet.alias()方法中,当开发者传递字典作为**kwargs参数时,这些键值会被直接用于生成SQL列别名。在PostgreSQL数据库后端下,Django未对字典键进行充分的输入过滤和转义处理,导致攻击者可以通过构造包含SQL特殊字符和注入语句的键名来实现SQL注入。具体攻击场景中,攻击者需要创建一个精心设计的字典,其键包含SQL片段如"test\"; DROP TABLE users;--",当Django将此键作为列别名插入SQL查询时,未经转义的特殊字符会破坏SQL语法结构并执行攻击者注入的恶意SQL代码。由于Django的ORM通常期望接收安全的Python对象而非直接SQL片段,这种注入发生在查询构建阶段而非直接字符串拼接,因此绕过了常见的参数化查询保护。漏洞利用的关键在于PostgreSQL对列别名的特殊处理方式,允许使用某些在MySQL等数据库中被禁止的字符组合。攻击者利用此漏洞可实现数据读取、修改或删除,具体取决于应用程序的数据库权限配置。