[护网杯 2018]easy_tornado
半实况记录
进题:
分别进入三个连接看一眼:
大概情况如此。
因为没感受到什么,所以我用burp跑了一下看看响应头。
现在我有几个问题:
- Etag是什么?
- 这几个连接后面的filehash是什么?
- 题目里的torando是什么意思
- cookie_secret是什么
尝试了一下如果不用filehash访问文件,页面返回Error。如此我有个猜想:这题可能是让通过hints.txt的方法自己构造一个filehash,带上filehash访问flllllllllllag?
于是先访问一下fllllllllllllag,页面返回Error,再瞎访问一个不存在的文件,我是希望返回404的但还是输出Error。那我暂时不能确定我的猜想没问题。
我还是感觉我猜想可能是对的,但我先查资料收集一下信息:
- torando是一款web服务器,python写的。
- Etag全称Entity Tag,是服务端用来标识某资源状态的一个token,按我理解就是,资源不变的话Etag就不变。响应回来后客户端得到Etag,再次发起对该资源的请求时将Etag的值放入If-None-Match头中。服务端接到请求对比If-None-Match和当前服务端资源的Etag是否一致,如果一致说明客户端手中的资源跟现在服务器的资源一毛一样。就直接返回304状态节省资源。(304 Not Modified)。
- cookie_secret是tronado中常用防止cookie伪造的方式。具体介绍见官网https://www.tornadoweb.org/en/stable/guide/security.html#cookies-and-secure-cookies
于是目标我大概清晰了,就是要通过hint中的方法构造出访问fllllllllllllag的filehash。
然而怎么获取cookie_secret啊。。
回到之前那个error页面,有个细节:
想到了反射型xss,但显然反射型xss无法从服务端获取东西,于是想到了服务端脚本攻击。
搜索服务端脚本攻击,搜到了叫 服务端模板注入 的东西很符合当前这个状况,那么开始尝试。
payload: ?msg={{config}}
response: 500: Internal Server Error
payload: ?msg={{request}}
response:HTTPServerRequest(protocol='http', host='2eb12ecd-6a2b-4afb-a58f-51e7c0098218.node3.buuoj.cn', method='GET', uri='/error?msg={{request}}', version='HTTP/1.1', remote_ip='174.0.222.75')
、
继续尝试,发现过滤了__ [] ()
总之先上官网了解一下资料吧,看看cookie_secret到底在什么地方。
查阅文档
官网给出一个设置cookie_secret的例子:
class MainHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
name = tornado.escape.xhtml_escape(self.current_user)
self.write("Hello, " + name)
settings = {
"cookie_secret": "__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
"login_url": "/login",
}
application = tornado.web.Application([
(r"/", MainHandler),
(r"/login", LoginHandler),
], **settings)
从上面代码可以看出这是一个简易的webapp,class MainHandler是一个处理流程,cookie_secret存在于一个配置对象中。下面的application目测这个webapp的入口。tornado.web.Application的第二个参数传入了这个settings,所以我继续搜索tornado.web.Application这个函数。
↑根据经验这种application对象里一般会有配置信息,不过这个application不是刚才说的那个。
这个大概是了,不过结合上面RequestHandler.application的描述,好像这个Application就是上面的application。tornado.web.Application包含一组RequestHandler,一个RequestHandler可以获取他所在的Application。
继续搜索:tornado.template
— Flexible output generation
We provide the functions
escape()
,url_escape()
,json_encode()
, andsqueeze()
to all templates by default.
上述方法因为过滤了()符号不能使用,但发送payload:escape,页面返回:<function xhtml_escape at 0x7f678a6f6410>
这让我觉得当前语句执行的Context就是tornado.template
回忆刚才输入request的时候,返回了 HTTPServerRequest 这个信息,仔细想了一下,request应该是一个变量,而HTTPServerRequest就是这个变量的类型。如果是这样,那么可以通过猜测变量名的方式得到application内容。
结果
没耐心继续翻了,看了一眼答案,目标paylaod是 handler.settings
说什么在tornado模板中,存在一些可以访问的快速对象,例如
{{ escape(handler.settings[“cookie”]) }}
我不是很懂。上官网搜了handler也并没有找到这个快速对象。
暂时认为就是明白了需要从RequestHandler.settings里获得cookie_secret,然后进行变量名猜测吧。
通过’cookie_secret’: ‘239c888a-b473-4bb0-a3e3-444f5551ed2b’} 开始构造目标文件的hash:
3dc5df01f3eed6824433675e13680a10
结果: