django/CVE-2017-12794XSS漏洞复现

2023-11-05

docker搭建漏洞复现环境

漏洞原理看帮助文档

# Django debug page XSS漏洞(CVE-2017-12794)分析

Django发布了新版本1.11.5,修复了500页面中可能存在的一个XSS漏洞,这篇文章说明一下该漏洞的原理和复现,和我的一点点评。

## 0x01 补丁分析

因为官方说明是500页面中出现的BUG,所以我们重点关注的就是`django/views/debug.py`。

Github上有Django的仓库,下载下来,用1.11.4和1.11.5进行比较:

```bash
git clone https://github.com/django/django.git
cd django
git diff 1.11.4 1.11.5 django/views/debug.py
```

![sp170908_035017](img/django/sp170908_035017.png)

可见,外部关闭了全局转义,然后在这两个地方增加了强制转义。那么,漏洞肯定是在这个位置触发的。

## 0x02 功能点探索

如果要触发这两个输出点,就必须进入这个if语句:`{% ifchanged frame.exc_cause %}{% if frame.exc_cause %}`。

首先我们来想一下,正常情况下,这个位置是干嘛用的,也就是说,功能点是什么。

作为一个老年Django开发,看到上图画框的这个关键句子`The above exception was the direct cause of the following exception:`,我是有印象的:一般是在出现数据库异常的时候,会抛出这样的错误语句。

我们可以做个简单的测试,在Django命令行下,我们创建一个username为phith0n的用户,然后再次创建一个username为phith0n的用户,则会抛出一个`IntegrityError`异常:

![sp170908_040738](img/django/sp170908_040738.png)

见上图,原因是触发了数据库的Unique异常。

为什么Django会引入这样一个异常机制?这是为了方便开发者进行SQL错误的调试,因为Django的模型最终是操作数据库,数据库中具体出现什么错误,是Django无法100%预测的。那么,为了方便开发者快速找到是哪个操作触发了数据库异常,就需要将这两个异常回溯栈关联到一块。

我们可以看看代码,`django/db/utils.py`的`__exit__`函数:

```python
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__`被输出。

## 0x03 漏洞复现

经过我的测试,我发现在使用Postgres数据库并触发异常的时候,psycopg2会将字段名和字段值全部抛出。那么,如果字段值中包含我们可控的字符串,又由于0x02中说到的,这个字符串其实就会被设置成`__cause__`,最后被显示在页面中。

所以我们假设有如下场景:

1. 用户注册页面,未检查用户名
2. 注册一个用户名为`<script>alert(1)</script>`的用户
3. 再次注册一个用户名为`<script>alert(1)</script>`的用户
4. 触发duplicate key异常,导致XSS漏洞

我将上述流程整理成vulhub的一个环境:https://github.com/phith0n/vulhub/tree/master/django/C

http://your-ip:8000/create_user/?username=<script>alert(1)</script>`创建一个用户,成功;再次访问`http://your-ip:8000/create_user/?username=<script>alert(1)</script>`,触发异常:

因为被kali的浏览器拦截了,用本机的浏览器实验

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

django/CVE-2017-12794XSS漏洞复现 的相关文章

随机推荐

  • 南大通用GBase8s 常用SQL语句(267)

    SET PDQPRIORITY 语句 SET PDQPRIORITY 语句启用一应用来在例程之内动态地设置查询优先级别 SET PDQPRIORITY 语句是对 SQL 的 ANSI ISO 标准的扩展 语法 元素 描述 限制 语法 res
  • 打不开文件"F:\vmware -副本\Ubuntu 16.vmdk":该虚拟机的磁盘已经由虚拟机或者快照使用

    1 打不开文件 F vmware 副本 Ubuntu 16 vmdk 该虚拟机的磁盘已经由虚拟机或者快照使用 解决办法 1 删除虚拟机配置文件下面的 lck文件 2 删除类型为快照的 vmsn vmsd文件 然后重启虚拟机即可 父虚拟磁盘在
  • Latex 报错:The font cannot be found.

    Latex报错 Package fontspec Error The font KaiTi GB2312 cannot be found 解决方法 给系统安装 KaiTi GB2312 字体 step1 下载 KaiTi GB2312 字体
  • 关于虚拟机(CentOS 7 )远程连接超时(SecureCRT 软件)、网络服务启动失败的解决方法

    问题 开启虚拟机后 用CRT软件连接虚拟机发现 总是连接超时 connection time out 返回VM 尝试ping一下百度 发现ping不通 然而在windows上ping百度可以ping通 并且在虚拟机上直接ping百度的ip
  • 【R】【数据采集、抽样和预处理实验】

    文章目录 实验思维导图 实验一 1 1 启动 Rstudio 1 2 新建 R Script 文件 1 3 read csv 函数导入数据 1 4 剔除冗余变量 1 5 缺失值处理 1 6 异常值处理 实验二 2 1 启动 Rstudio
  • 解决idea识别不出来项目中某些Maven模块,显示模块为“灰色”

    解决idea识别不出来项目中某些Maven模块 显示模块为 灰色 背景 打开一个Maven多模块项目 发现有些Maven子模块显示为 灰色 解决方式 点击右侧怕 Maven gt 点击 加号 gt 选择灰色模块对应的 pom 文件 本步骤主
  • OpenSSL中文手册之ASN1库详解(未完待续)

    openssl之ASN 1系列之1 引言和ASN 1概述 引言 ASN 1全称为Abstract Syntax NotationOne 是一种描述数字对象的方法和标准 openssl的编码方法就是基于该标准的 目前 很多其他软件的编码方法也
  • vue321

    component切换 div class dashboard container div
  • [PHP面试题]跳槽面试必背-自己最近5年的整理(二)

    看完这些还怕进不了大厂 PHP面试题 跳槽面试必背 自己最近5年的整理 一 PHP面试题 跳槽面试必背 自己最近5年的整理 三 PHP经典面试题集 含答案 面试12家公司 收获9个offer 2020年PHP 面试问题 100 个常见的 P
  • 图解OAuth 2.0协议族(一):授权码 auth code

    最近学习了OAuth 2 0的协议族 获益匪浅 对认证 授权都有了新的 进一步认识 在这里做用序列图记录与总结所有的场景 以共勉 系列全文以资源拥有者授权客户端访问受保护照片访问为例 模拟了多个场景 Oauth是一个授权协议框架 包含多个协
  • NVIDIA-smi

    上图是服务器上 GeForce GTX 1080 Ti 的信息 下面一一解读参数 上面的表格中的红框中的信息与下面的四个框的信息是一一对应的 GPU GPU 编号 Name GPU 型号 Persistence M 持续模式的状态 持续模式
  • 剑指offer-10 二进制数字1的个数

    输入一个int型数字 输出它作为二进制的1的个数 如9的二进制为1001 有2个1 则输出2 法一 因为int型有4个字节 一共32位 每次将输入右移1 并和1进行 与 操作 将结果累加 则为1的个数 public class Test10
  • 二维各向同性介质弹性波数值模拟(交错网格有限差分法)

    一 一阶速度 应力弹性波方程 在二维各向同介质xoz平面内 假定体力为0 从上面方程当中 我们为了得到各点的应力和速度值 就需要得到关于对时间t和空间x z的偏导 二 时间上的2M阶差分 由Taylor公式得 三 空间2N阶近似差分 由一阶
  • 【2023】Python安装教程

    一 Python下载 1 进入Python官网 官网地址 https www python org 2 点击 Downloads 展开后点击 Windows 跳转到下载python版本页面 选择 Stable Releases 稳定版本 我
  • 尤其抖音,不如学习

    什么是我们最宝贵的资源 是钱吗 不不不 我们最宝贵的资源是时间 与其把时间耗费在刷抖音 或者其他没多少价值的事情上 不如多学习一些有用的技能 今天 小灰给大家推荐几个有用的公众号 这些公众号有些是IT相关 有些是教我们如何穿衣打扮 有些是讨
  • 超出表空间"users"的空间限额

    这是因为用户被数据库限制了在建表的表空间 执行一下下面的语句后 再执行建表语句 alter user 用户名 quota unlimited on 表空间名字
  • shell中if多重条件

    if a aa a b bb c cc a d dd then echo success fi
  • APP自动化之weditor工具

    由于最近事情颇多 许久未更新文章 大家在做APP自动化测试过程中 可能使用的是Appium官方提供的inspect进行元素定位 但此工具调试不方便 于是今天给大家分享一款更好用的APP定位元素工具 weditor weditor基于web网
  • linux查看可执行文件的编译器版本

    一部分可执行程序 可以使用这个方法快速确认 strings a program name grep i gcc 输出 GCC Debian 4 8 4 1 4 8 4
  • django/CVE-2017-12794XSS漏洞复现

    docker搭建漏洞复现环境 漏洞原理看帮助文档 Django debug page XSS漏洞 CVE 2017 12794 分析 Django发布了新版本1 11 5 修复了500页面中可能存在的一个XSS漏洞 这篇文章说明一下该漏洞的