网站服务器怎么配置,工程备案信息查询,详情页设计理念,网站建设的竞争力docker搭建漏洞复现环境 漏洞原理看帮助文档
# Django debug page XSS漏洞#xff08;CVE-2017-12794#xff09;分析Django发布了新版本1.11.5#xff0c;修复了500页面中可能存在的一个XSS漏洞#xff0c;这篇文章说明一下该漏洞的原理和复现#xff0c;和我的一点点评…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
可见外部关闭了全局转义然后在这两个地方增加了强制转义。那么漏洞肯定是在这个位置触发的。## 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异常见上图原因是触发了数据库的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:returnfor 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_valueif 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 Truesix.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. 注册一个用户名为scriptalert(1)/script的用户
3. 再次注册一个用户名为scriptalert(1)/script的用户
4. 触发duplicate key异常导致XSS漏洞我将上述流程整理成vulhub的一个环境https://github.com/phith0n/vulhub/tree/master/django/C
http://your-ip:8000/create_user/?usernamescriptalert(1)/script创建一个用户成功再次访问http://your-ip:8000/create_user/?usernamescriptalert(1)/script触发异常
因为被kali的浏览器拦截了用本机的浏览器实验