提示让我们传参:
随便url里传入一个参数,得到一串代码:
代码审计,当为False时都会跳转到template.html,在elseif中过滤了很多读取的命令。
出于习惯,随手就来了个简单的模板注入,发现有回显!:
这道题是一道Smarty的模板注入,查找资料:
Smarty是基于PHP开发的,对于Smarty的SSTI的利用手段与常见的flask的SSTI
有很大区别。
一般情况下输入{$smarty.version}就可以看到返回的smarty的版本号。
Smarty支持使用{php}{/php}标签来执行被包裹其中的php指令,最常规的思路自
然是先测试该标签在Smarty3的官方手册里有以下描述:Smarty已经废弃{php}
标签,强烈建议不要使用。在Smarty 3.1,{php}仅在SmartyBC中可用。
静态方法:通过self获取Smarty类再调用其静态方法实现文件读写被网上很多文章
采用:{self::getStreamVariable(“file:///etc/passwd”)},但是在3.1.
30的Smarty版本中官方已经把该静态方法删除。
Smarty的{if}条件判断和PHP的if非常相似,只是增加了一些特性。每个{if}必须
有一个配对的{/if},也可以使用{else} 和 {elseif},全部的PHP条件表达式和
函数都可以在if内使用,如||*, or, &&, and, is_array(), 等等,如:
{if is_array($array)}{/if}*
但过滤了很多命令执行,翻阅资料找到passthru()命令
:
准备好了前期工作,可以开始注入了
查看目录,发现可疑点start.sh:{if passthru('ls -al /')}{/if}
用tac命令读取starts.sh:
{if passthru('tac /starts.sh')}{/if}
代码审计,意思是T是一个随机数,flag就在$T文件里
再看看根目录有没有以"_随机数"的文件名,发现_25275,查看文件发现flag:{if passthru('tac /_25275')}{/if}
总结:
Smarty模板注入