IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    【漏洞预警】Tornado某缺陷可能造成文件读取漏洞 (updated @ 2015-03-04)

    alioth310发表于 2015-03-02 15:45:11
    love 0

    昨晚,wooyun上有用户报告Tornado框架某缺陷可能造成文件读取漏洞。该用户没有在公开描述中提到更多的信息。

    1. 影响版本
    起始版本未知,至少影响3.1及以上版本。

    2. 漏洞描述
    可能造成不应被读取的文件被读取。
    洞主没有明确说明被读取的文件需要满足何种条件。
    根据我的猜测,应为全平台,但文件名需满足特定条件(见第4节)。

    3. 网友观点

    在v2ex的讨论贴(/t/173839)中,用户RIcter认为该漏洞可能是StaticFileHandler造成的,利用条件为:Windows环境,且文件名与指定的静态文件目录名一致,因此利用价值不大。不过,这个说法还没有得到乌云洞主的肯定,不能确定是否是一个问题。

    4. 我的观点
    下面我根据自己的理解,给出第3节这个说法的分析,最终结论与该网友有所区别:

    设静态目录为tstatic(绝对路径C:\tornado\project\tstaic)。
    设要打开的URL为:http://localhost:8000/static/lvl1\\..\\..\\tstatic.jpg。

    a) StaticFileHandler -> get -> self.path = self.parse_url_path(path)
    本方法的目的是将”/”变更为服务器所在操作系统的目录分隔符。
    此步过后,得到的self.path = ‘lvl1\\..\\..\\tstatic.jpg’

    b) StaticFileHandler -> get -> self.get_absolute_path(self.root, self.path)
    本方法的目的是得到请求文件的绝对路径。
    这里的self.root为静态目录的相对路径,对本例而言为’tstatic’;self.path为a)得到的结果。
    此步执行的操作为os.path.abspath(os.path.join(root, path)),得到
    绝对路径’C:\\tornado\\project\\tstatic.jpg’

    c) StaticFileHandler -> get -> self.absolute_path = self.validate_absolute_path(self.root, absolute_path)
    本方法的目的是验证得到的路径是否合法,不合法的请求给出错误。
    在这里,程序进行了如下验证:

    if not (absolute_path + os.path.sep).startswith(root):
        raise HTTPError(403, "%s is not in root static directory",
                                  self.path)

    其中:
    absolute_path + os.path.sep = ‘C:\\tornado\\project\\tstatic.jpg\\’
    root = ‘C:\\tornado\\project\\tstatic’ (已变为绝对路径)

    可知本if语句的raise没有被执行,即认为是合法的请求了,而后续的代码里也没有与此相关的验证,最终返回’C:\\tornado\\project\\tstatic.jpg’。

    可以看出,在Windows系统中,如果请求的文件名是以静态目录名称起始,且与静态目录同级的情况下,会被请求到不该被请求到的文件。

    那么,Linux系统中就不成立了吗?
    实际上并不是!

    Tornado文件读取漏洞1

    Tornado文件读取漏洞2

    只不过在使用浏览器请求的时候,”../”可能被浏览器直接处理了,才造成Linux下没有这个漏洞的错觉。

    因此,利用条件应为:全平台,请求文件名以静态目录名为前缀,请求文件与静态目录同级。

    那么,这个利用条件比较苛刻,因此这个漏洞还是很鸡肋的。当然,洞主也许说的并不是这个漏洞。

    4. 解决方法
    官方暂未对该漏洞提供解决方案。

    不过,在web.py的StaticFileHandler类的docstring中提到:

    This handler is intended primarily for use in development and light-duty
    file serving; for heavy traffic it will be more efficient to use
    a dedicated static file server (such as nginx or Apache). 

    StaticFileHandler类主要用于开发环境和轻型的文件服务,建议用户在线上的大流量环境中使用更加专注的静态文件服务器(如nginx/Apache)。



沪ICP备19023445号-2号
友情链接