Django JSONField SQL注入 CVE 2019 14234漏洞复现
漏洞描述 Django是一个由Python编写的开源Web框架,采用MTV框架模式。 该漏洞需要开发者使用JSONField/HStoreField且用户可控queryset查询时的键名,在键名的位置实现SQL注入。 Django通常结合PostgreSQL数据库进行使用,而JSONField是该数据库的一种数据类型,漏洞成因在于Django中JSONField类的实现,Django的model的本质作用在于生成SQL语句,但Django在通过JSONField生成SQL语句时仅通过简单字符串拼接,通过JSONField类获得KeyTransform类并生成SQL语句: class KeyTransform(Transdform): 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....