easytornado的wp

打开题目及其对应链接

http://111.200.241.244:54518/file?filename=/flag.txt&filehash=56c3edef87e35138fd9a79ff81bb0253

得到如下三个文件及其内容

/flag.txt

flag in /fllllllllllllag

/welcome.txt

render

/hints.txt

md5(cookie_secret+md5(filename))


由题目标题可知,该网站用的时tornado框架

有提示1可知,flag在/fllllllllllllag文件下

将链接中/flag.txt替换为/fllllllllllllag后得到如下页面


改变msg后文字,页面内容也有所改变,证明存在模板注入漏洞并且能够回显


由提示2得知render存在漏洞,查看render函数的说明


render时模板渲染函数,可以将对应参数渲染入模板内

Tornado模板支持控制语句和表达式。控制语句被{%和%}包围,例如{%如果len(items)>2%}。表达式被{{和}包围,例如{{items[0]}。

表达式可以是任何Python表达式,包括函数调用。模板代码在包含以下对象和函数的命名空间中执行。(请注意,此列表适用于使用RequestHandler.render和render_字符串呈现的模板。如果您直接在RequestHandler外部使用tornado.template模块,则其中许多条目不存在)。

escape: alias for tornado.escape.xhtml_escape

xhtml_escape: alias for tornado.escape.xhtml_escape

url_escape: alias for tornado.escape.url_escape

json_encode: alias for tornado.escape.json_encode

squeeze: alias for tornado.escape.squeeze

linkify: alias for tornado.escape.linkify

datetime: the Python datetime module

handler: the current RequestHandler object

request: alias for handler.request

current_user: alias for handler.current_user

locale: alias for handler.locale

_: alias for handler.locale.translate

static_url: alias for handler.static_url

xsrf_form_html: alias for handler.xsrf_form_html

reverse_url: alias for Application.reverse_url

All entries from the ui_methods and ui_modules Application settings

Any keyword arguments passed to render or render_string


最有可能包含cookie_secret时在hander


问题时如何获取cookie_secret参数,通过用户手册可以查询到settings中有cookie_secret参数

通过查阅文档发现cookie_secret在Application对象settings属性中,还发现self.application.settings有一个别名

RequestHandler.settings An alias for self.application.settings.

handler指向的处理当前这个页面的RequestHandler对象, RequestHandler.settings指向self.application.settings, 因此handler.settings指向RequestHandler.application.settings。

构造payload获取cookie_secret

/error?msg={{handler.settings}}



setting中由cookie_secret参数,通过{{handler.settings}}可以获得cookie_secret参数


通过md5(cookie_secret+md5(filename))可以计算出filehash值

在python3的标准库中,已经移除了md5,而关于hash加密算法都放在hashlib这个标准库中,如SHA1、SHA224、SHA256、SHA384、SHA512和MD5算法等。


md5()方法使用

update(arg)传入arg对象来更新hash的对象。必须注意的是,该方法只接受byte类型,否则会报错。这就是要在参数前添加b来转换类型的原因。  同时要注意,重复调用update(arg)方法,是会将传入的arg参数进行拼接,而不是覆盖。也就是说,m.update(a); m.update(b) 等价于m.update(a+b)。  hexdigest()在英语中hex有十六进制的意思,因此该方法是将hash中的数据转换成数据,其中只包含十六进制的数字。


import hashlib


m = hashlib.md5()

m.update(b'/fllllllllllllag')

f = m.hexdigest()

m = hashlib.md5()

m.update(b'2ab80280-7bdd-402a-b0c7-cabdb3a4715a'+f.encode(encoding='utf-8'))

f = m.hexdigest()

得到最终的payload

filename=/fllllllllllllag&filehash=07949418d71869acb05f173716f4d19c

你可能感兴趣的:(easytornado的wp)