进入web页面。就看到和伪造IP有关的XFF头。
进入api目录。直接输出我的IP
尝试下伪造下XFF。成功。
根据提示。这题是个SSTI。
首先试下SSTI常见的{1+1},{{1+1}},根据页面返回。大致可以判断是什么语言。
{1+1}成功执行。{{1+1}}也成功执行了。然而用flask 只支持{{}},所以不是flask。
题目名称和web主页底部都有smarty,估计就是smarty的SSTI。getshell拿flag
找来找去。基本没有关于smarty的SSTI。都是python的flask。最后找到合天的一篇文章。瞬间就开朗了
https://www.jianshu.com/p/eb8d0137a7d3
总结一下:
常规的利用方式
1。smart使用{php}{/php}标签来代码执行
2。{literal}{/literal}可以让一个模板区域的字符原样输出。
可以配合<script language="php">phpinfo();</script>造成代码执行
然而script一句话在php7下不支持
3。{self::getStreamVariable("file:///etc/passwd")}
{$smarty.version}可以查看smart版本号
任意文件读取,不适用于新版本。3.1.30后的smart
4。{if}{/if}标签。可以使用{else},{elseif}等标签。
但是都要用/闭合,全部php表达式和函数都能在里面执行
5。{phpinfo()}
直接执行代码
{exec('grep \'flag\' /*')}
前三种办法。要么报错要么就是条件不够。试下第四种。构造一个phpinfo的payload。成功执行。保存本地看看有没有什么限制
有open_basedir限制。还禁用了一些命令执行的函数。
但是。没有禁用putenv。这就让我想起来。之前复现的mail函数配合.so文件。putenv Bypass disable_function,由于命令执行函数。是不受open_basedir限制的。只要能命令执行就不用管其他的了
写个一句话小马。方便上传文件。
菜刀连不上。用蚁剑。。
上传完后。现成脚本执行下。