一:tornado的基本介绍:
Tornado就是在 FriendFeed 的 Web 服务器及其常用工具的开源版本 。Tornado 和主流 Web 服务器框架(包括大多数 Python的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。
具体使用可参考:python笔记(tornado初识)_背后——NULL的博客-CSDN博客_python tornado
漏洞实例:攻防世界easytornado
打开网页发现内容如下:
观察到url的filename,filehash似乎是账号和密码
把filename改为/fllllllllllllag后发现显示错误界面,即我们要寻找密码filehash
同时发现Error似乎可以更改,类似注入的东西
再浏览其他文件
经过百度查询可知,render为tornado的一个模块,类似于模板的东西,可通过不同的参数来访问网页。即{{}}的显示调用参数。
而下方的文件则是说明了filehash怎么获取,cookie+MD5加密后的filename,再次MD5加密。
即最主要的是render注入。
可通过{{handler.settings}}注入,具体原理Tornado小记 -- 模板中的Handler(看不太懂)
即可获取ookie——secret
最后通过MD5加密/fllllllllllllag
cookie_secret+上述密文,再次MD5加密
回到flag.txt页面,更改url内容即可正确进入
二:flask模块注入(攻防世界shrine):
代码审计
观察到/shrine 路径可注入,会通过flask.render这个模块返回值,但是safe_jinja这个函数会过滤掉含config,self的字符。
涉及到python内置函数get_flashed_messages和url_for。
get_flashed_messages:
可闪现(显示)后续要显示的内容,
构造playload: /shrine/{{get_flashed_message.__globals__}} (globals前后为双下划线)
显示所有函数类型,如下:
找到flask类型这个
直接访问
然后从中使用config访问FLAG
构造playload: /shrine/{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}
url_for:
1.url_for()作用:
(1)给指定的函数构造 URL。
(2)访问静态文件(CSS / JavaScript 等)。 只要在你的包中或是模块的所在目录中创建一个名为 static 的文件夹,在应用中使用 /static 即可访问。
我们用到的是第一点。
即可以通过构造url的形式返回执行的内容
构造playload: /shrine/{{url_for.__globals__}}
显示所有函数(与上面一样za):
再找到current_app,使用其访问flag
构造playload: /shrine/{{url_for.__globals__['current_app'].config['FLAG']}}
获取到flag: