导语

想要成为web手

easy-tornado

看到题目,想到tornado框架

Tornado是一种 Web 服务器软件的开源版本。Tornado 和主流Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

打开题目,先看hint

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

看到url是

http://f2687ed3-88cb-46a0-bb7b-83316462a9d0.node4.buuoj.cn:81/file?filename=/hints.txt&filehash=d3d3cea510582922490a4ede4684b9f6

得知请求的时候应该需要带上filehash这个数据,并且filehash是对(cookie_secret+md5(filename))进行md5得到的,因此我们需要得知cookie_secret的内容,没有提示cookie_secret的信息,因此无法通过暴破手段来获取cookie_secret,思路走到了死胡同,看看别的

打开flag.txt

/flag.txt
flag in /fllllllllllllag

可以知道flag在/fllllllllllllag里,尝试访问一下

1673427720813

带上filehash字段的话(显然filehash不对)

1673427921382

看到这个msg=Error并且下面显示的也是Error,猜测是有模板注入

吧Error换一下

1673429844208

发现确实,所以必有模板注入

同时welcome.txt

/welcome.txt
render

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

在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,handler指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量

1673428104224

就获取到了cookie_secret

那么我们就尝试获取fllllllllllllag所对应的filehash

import hashlib

file_hash = hashlib.md5()

# filename = 'fllllllllllllag'
filename = '/fllllllllllllag'
file_hash.update(filename.encode('utf-8'))
s = file_hash.hexdigest()

cookie_secret = "4be89441-4141-411b-a28e-17e625898450"

file_hash = hashlib.md5()
file_hash.update((cookie_secret + s).encode('utf-8'))

print(file_hash.hexdigest())

1673428399158

得到flag

参考:

https://blog.csdn.net/ANYOUZHEN/article/details/124983143