下面的内容均以jinja2为例,根据官方文档来探寻绕过方法
文档链接
默认大家都已经可以利用没有任何过滤的模板注入
语法
官方文档对于模板的语法介绍如下
{% ... %} for Statements
{
{ ... }} for Expressions to print to the template output
{# ... #} for Comments not included in the template output
# ... # for Line Statements
{%%}可以用来声明变量,当然也可以用于循环语句和条件语句。
{
{}}用于将表达式打印到模板输出
{##}表示未包含在模板输出中的注释
##可以有和{%%}相同的效果
{
% set x= 'abcd' %} 声明变量
{
% for i in ['a','b','c'] %}{
{
i}}{
%endfor%} 循环语句
{
% if 25==5*5 %}{
{
1}}{
% endif %} 条件语句
# for i in ['a','1']
{
{
i }}
# endfor
{
% for i in ['a','1'] %}
{
{
i }}
{
% endfor %}
这两条是等效的,但是有个前提,必须在environment中配置line_statement_prefix
即
app.jinja_env.line_statement_prefix="#"
但我尝试之后发现开启不了,不知道为什么
变量
You can use a dot (.) to access attributes of a variable in addition to the standard Python __getitem__ “subscript” syntax ([]). --官方原文
也就是说
除了标准的python语法使用点(.)外,还可以使用中括号([])来访问变量的属性。
比如
{
{
"".__class__}}
{
{
""['__classs__']}}
所以过滤了点,我们还可以用中括号绕过。
如果想调用字典中的键值,其本质其实是调用了魔术方法__getitem__
所以对于取字典中键值的情况不仅可以用[],也可以用__getitem__
当然对于字典来说,我们也可以用他自带的一些方法了。pop就是其中的一个
pop(key[,default])
参数
key: 要删除的键值
default: 如果没有 key,返回 default 值
删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
我们要使用字典中的键值的话,也可以用list.pop("var"),但大家最好不要用这个,除非万不得已,因为会删除里面的键,如果删除的是一些程序运行需要用到的,就可能使得服务器崩溃。然后过了一遍字典的方法,发现get和setdefault是个不错的选择
dict.get(key, default=None)
返回指定键的值,如果值不在字典中返回default值
dict.setdefault(key, default=None)
和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
{
{
url_for.__globals__['__builtins__']}}
{
{
url_for.__globals__.__getitem__('__builtins__')}}
{
{
url_for.__globals__.pop('__builtins__')}}
{
{
url_for.__globals__.get('__builtins__')}}
{
{
url_for.__globals__.setdefault('__builtins__')}}
那么调用对象的方法具体是什么原理呢,其实他是调用了魔术方法__getattribute__
即
"".__class__
"".__getattribute__("__class__")
如果题目过滤了class或者一些关键字,我们是不是就可以通过字符串处理进行拼接了。
对于我们来说,能转换成字符串会更好处理一些。
那我们就顺势讲一下字符串的一些处理方法。
1、拼接
"cla"+"ss"
2、反转
"__ssalc__"[::-1]
但是实际上我发现其实加号是多余的,在jinjia2里面,"cla""ss"是等同于"class"的,也就是说我们可以这样引用class,并且绕过字符串过滤
""["__cla""ss__"]
"".__getattribute__("__cla""ss__")
""["__ssalc__"][::-1]
"".__getattribute__("__ssalc__"[::-1])

本文详细介绍了Jinja2模板引擎的语法及变量处理方法,并深入探讨了如何利用各种技巧进行模板注入攻击,包括字符串构造、获取键值和属性等。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



