（CVE-2017-12794）Django debug page XSS漏洞
===========================================

一、漏洞简介
------------

Django 发布了新版本1.11.5，修复了500页面中可能存在的一个 XSS 漏洞

二、漏洞影响
------------

Django \< 1.11.5

三、复现过程
------------

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

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

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

2.  注册一个用户名为`alert(1)`的用户

3.  再次注册一个用户名为`alert(1)`的用户

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

访问`http://www.0-sec.org:8000/create_user/?username=alert(1)`创建一个用户，成功；再次访问`http://www.0-sec.org:8000/create_user/?username=alert(1)`，触发异常：

![](./resource/(CVE-2017-12794)DjangodebugpageXSS漏洞/media/rId24.png)

可见，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。
