Python-tornado-render注入漏洞原理复现

tornado render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式。

以下代码将定义一个TEMPLATE变量作为一个模板文件,然后使用传入的name替换模板中的”%s”,在进行加载模板并输出,且未对name值进行安全检查输入情况。

import tornado.template
import tornado.ioloop
import tornado.web
TEMPLATE = '''
<html>
 <head><title> Hello  </title></head>
 <h3>%s</h3>
 <body> Hello max </body>
</html>
'''
class MainHandler(tornado.web.RequestHandler):

    def get(self):
        name = self.get_argument('name', '')
        template_data = TEMPLATE.replace("%s",name)
        t = tornado.template.Template(template_data)
        self.write(t.generate(name=name))

application = tornado.web.Application([(r"/", MainHandler),], debug=True, static_path=None, template_path=None)

if __name__ == '__main__':
    application.listen(8000)
    tornado.ioloop.IOLoop.instance().start()

我们把代码整好运行,这个代码逻辑并不难看懂 get传参进来一个name的参数 然后显示在页面上,可以看到他并没有对name进行检查。

那么我们直接访问 什么也不传参

图片[1]-Python-tornado-render注入漏洞原理复现-Drton1博客

我们再带着name的参数过去:

图片[2]-Python-tornado-render注入漏洞原理复现-Drton1博客

XSS一下试试,成功触发:

图片[3]-Python-tornado-render注入漏洞原理复现-Drton1博客

所以这个地方是存在SSTI的 我们用变量包裹符号试试{{}}:

图片[4]-Python-tornado-render注入漏洞原理复现-Drton1博客

可以看到成功执行了,但是并没这个变量名hh

那我们就知道这个漏洞的成因了,就这么简单。

根据之前知识 我们还可以调用 能执行系统命令的类 实现RCE:

图片[5]-Python-tornado-render注入漏洞原理复现-Drton1博客
图片[6]-Python-tornado-render注入漏洞原理复现-Drton1博客

修复方案当然了 就是提前打好{{}} 就像sql注入的预编译一样。、

图片[7]-Python-tornado-render注入漏洞原理复现-Drton1博客
图片[8]-Python-tornado-render注入漏洞原理复现-Drton1博客

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论