欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Flask源码学习之意外在Debugger上发现通用XSS

来源:本站整理 作者:佚名 时间:2016-09-22 TAG: 我要投稿

前言


前段时间发现较为鸡肋的洞和当时写的文章。

一个存在于Flask框架Debugger页面上的通用XSS,Werkzeug0.10.10之前版本受影响,已经报告给Flask官方并提交修复代码。官方在确认之后,及时发布了0.10.11。

记下了发现的过程。

正文

看了一段时间Flask的源码,想学习一下项目架构和一些感兴趣的实现,其中就包括Flask功能强大的Debugger页面。用过Flask的人都知道,Flask的Debug模式能帮助我们在开发Web应用时跟踪异常信息,调试代码,解决问题。

在使用Debugger的时候,我就在想这个页面难道也是使用render_template或其他Flask模板调用函数生成的吗?稍微翻了一下代码,发现这个功能既没有使用Jinja2模板,甚至它的主要代码写在Flask的另一个基础库werkzeug上面。

Werkzeug是Flask官方开发的一个WSGI工具箱,可以作为一个Web框架的底层库。事实上Flask就是基于Werkzeug和Jinja2开发的一个Web框架。

我以前曾经在XSS">记一下PythonWeb代码审计应该注意的地方提及PythonWeb开发中容易容易产生XSS的几种情况,其中提到:

如果webapp没有使用模板语言的话,又没有对用户输入进行过滤直接返回给客户端的话,就容易产生XSS

Flask的程序员显然不会犯这样的错误,我可以看一下werkzeug/debug/tbtools.py这个文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
PAGE_HTML = HEADER + u'''\
<h1>%(exception_type)s</h1>
<div class="detail">
<p class="errormsg">%(exception)s</p>
</div>
<h2 class="traceback">Traceback <em>(most recent call last)</em></h2>
%(summary)s
<div class="plain">
<form action="/?__debugger__=yes&cmd=paste" method="post">
<p>
<input type="hidden" name="language" value="pytb">
This is the Copy/Paste friendly version of the traceback. <span
class="pastemessage">You can also paste this traceback into
a <a href="https://gist.github.com/">gist</a>:
<input type="submit" value="create paste"></span>
</p>
<textarea cols="50" rows="10" name="code" readonly>%(plaintext)s</textarea>
</form>
</div>
<div class="explanation">
The debugger caught an exception in your WSGI application. You can now
look at the traceback which led to the error. <span class="nojavascript">
If you enable JavaScript you can also use additional features such as code
execution (if the evalex feature is enabled), automatic pasting of the
exceptions and much more.</span>
</div>
''' + FOOTER + '''
<!--

%(plaintext_cs)s

-->
'''

可以发现Debugger页面是以字符串拼接和字符串格式化的形式构成的。这个字符串可以传进五个变量,分别是exception_type, exception, summary, plaintext, plaintext_cs。看变量名就可以知道,应该是一些异常信息。这些信息由render_full函数填充进字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def render_full(self, evalex=False, secret=None,
evalex_trusted=True):
"""Render the Full HTML page with the traceback info."""
exc = escape(self.exception)
return PAGE_HTML % {
'evalex': evalex and 'true' or 'false',
'evalex_trusted': evalex_trusted and 'true' or 'false',
'console': 'false',
'title': exc,
'exception': exc,
'exception_type': escape(self.exception_type),
'summary': self.render_summary(include_title=False),
'plaintext': self.plaintext,
'plaintext_cs': re.sub('-{2,}', '-', self.plaintext),
'traceback_id': self.id,
'secret': secret
}

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载