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

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

Django 简介

基本介绍
Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。

使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能
Django详情参考菜鸟教程

CVE-2017-12794漏洞分析

漏洞利用版本1.11.4XSS漏洞
请添加图片描述
可见,外部关闭了全局转义,然后在这两个地方增加了强制转义。那么,漏洞肯定是在这个位置触发的。

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

The above exception was the direct cause of the following exception: 一般是在出现数据库异常的时候,会抛出这样的错误语句。

做个简单的测试,在Django命令行下,我们创建一个username为phith0n的用户,然后再次创建一个username为phith0n的用户,则会抛出一个IntegrityError异常:
请添加图片描述
见上图,原因是触发了数据库的Unique异常。

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

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

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__,最后被显示在页面中。

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

  1. 用户注册页面,未检查用户名

  2. 注册一个用户名为<script>alert(1)</script>的用户

  3. 再次注册一个用户名为<script>alert(1)</script>的用户

  4. 触发duplicate key异常,导致XSS漏洞

访问http://your-ip:8000/create_user/?username=<script>alert(1)</script>创建一个用户,成功;
请添加图片描述
再次访问http://your-ip:8000/create_user/?username=<script>alert(1)</script>,触发异常:
请添加图片描述
请添加图片描述
可见,Postgres抛出的异常为
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。

摘选自 Vulhub靶详解:Django debug page XSS漏洞(CVE-2017-12794)分析

### 关于Django SQL注入漏洞 CVE-2022-28347 的背景 Django 是一种流行的 Python Web 开发框架,其设计目标之一是提供内置的安全机制来防止常见的安全威胁,例如跨站脚本攻击 (XSS) 和 SQL 注入。然而,在某些情况下,由于不恰当的输入验证或错误配置,仍然可能发生安全漏洞。 对于 CVE-2022-28347,这是一个与 Django 中 ORM 查询相关的 SQL 注入漏洞。该漏洞允许经过身份验证的攻击者通过特定条件下的查询参数执行恶意 SQL 命令[^2]。此问题的根本原因在于未正确处理用户提供的数据,尤其是在动态构建复杂查询时未能充分转义特殊字符。 受影响版本包括 Django 3.2.x 版本系列中的部分子版本以及更早的一些分支。官方已发布补丁更新以解决这一问题,并建议所有用户尽快升级到修补后的稳定版。 ### 解决方案与缓解措施 #### 升级至最新版本 最直接有效的解决方案是将项目依赖的 Django 库升级到不受影响的新版本。具体来说,针对不同分支有如下推荐: - 对于长期支持 (LTS) 分支 3.2.x 用户应迁移到 **3.2.15 或更高版本**; - 如果使用的是较新的主线开发线,则需确保至少运行在 **4.0.4 及以上**。 这些新发布的修订包含了必要的修复程序,能够有效阻止潜在的 SQL 注入尝试[^3]。 #### 安全编码实践 除了及时打上厂商提供的热修外,开发者还应该遵循良好的编程习惯减少未来发生类似事件的可能性: 1. 避免手动拼接字符串作为最终执行语句的一部分;改用占位符语法让底层驱动负责实际替换工作。 ```python from django.db import connection # 不推荐做法:容易引发安全隐患 query = f"SELECT * FROM users WHERE username='{username}'" # 推荐方式:利用参数化查询防范风险 with connection.cursor() as cursor: cursor.execute("SELECT * FROM users WHERE username=%s", [username]) result = cursor.fetchall() ``` 2. 使用 Django 提供的高级抽象层——QuerySet API 来代替原始 SQL 操作。它会自动对传入的数据做适当转换从而避免大部分常见陷阱。 3. 实施严格的输入校验逻辑,限定字段只接受预期范围内的值类型和格式。 4. 启用数据库级别的防护策略比如视图权限控制或者存储过程封装核心业务流程等手段进一步增强系统的鲁棒性。 上述方法结合起来可以极大程度降低遭受此类攻击的概率并保护敏感资料免受侵害。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值