网络安全从入门到精通(第十章-4)unserialize反序列化漏洞

本文内容:
			~什么是序列化
			~魔术方法和反序列化利用
			~实战注意			
每日一句:
			希望大家学习了相关技术
			多为我国的网络安全做贡献
			不要做违法乱纪的事请!!!

一、什么是序列化

	1,定义
		简单的说:将php中对象、类、数组、变量、匿名函数等,转化为字符串,
		方便保存到数据库或者文件中
			//将状态信息保存为字符串
	
	2,什么是反序列化
			//将字符串保存为状态信息
	
	3,类与对象
		~类与对象	
			在次说一下,
			类就是代表一种物体的总称,比如猫类,狗类,鱼类等等
			对象就是类的具体体现,比如狗类的拉布拉多犬
				举例:
				人这个“类”,张三是类具体的人,即对象
				这里的类就是“人”,张三就是“对象”
			
		~类得初始化,即要给“类”赋予第一个对象的过程
		
		~销毁对象,即干掉“张三”
		
		~类的序列化
			人“类”有什么特征呢:	年龄,性别,姓名等
				具体到对象:	
							姓名:张三
							性别:男
							年龄:20
			但将这些信息保存很多的话,这个“年龄,性别,姓名”就会重复多次
			于是,最后存储的就是“张三,男,20”
							这就是序列化
		~反序列化
			就是将信息还原具体
				“张三,男,20”	==>	“姓名:张三,性别:男,年龄:20”
			
			~注意,有一定难度的是,万一取出信息是:160,165
					这个160和165 到底哪个是代表的身高,
					哪个是代表的体重???
			
			~注意,还原的时候,用对“类”
					不能还原“张三,男,20”,用“鱼”类等
					
	4,php的序列化函数
			当在php中创建了一个对象后,可以通过serialize()这个函数
			把对象转变成一个字符串,保存对象的值方便之后的传递与使用。
			
			例子:
				<?php
					show_source(__FILE__);
					class chybeta{
						var $test = '123';
					}
					$class1 = new chybeta;	//实例化对象
					$class1_ser = serialize($class1);	//序列化
					echo "<hr>";
					print_r($class1_ser);
				?>
				
				输出结果:O:7:"chybeta":1:{s:4:"test";s:3:"123";}
					//	O代表  object对象
					//	7代表  对象名称有7个字符
					//	s代表  字符串
					//	4代表	test的长度
					//	test	类得属性名称
					//	123		属性长度
					
	5,php反序列化函数
			unserialize()函数,可以将状态还原
			例如:
					<?php
						show_source(__FILE__);
						class chybeta{
							var $test = '123';
						}
						$class2 = 'O:7:"chybeta":1:{s:4:"test";s:3:"124";}';
							//假设$class2	变量可控
						echo	"<hr>";
						echo	"</br>";
						$class2_unser = unserialize($class2);	//序列化
						print_r($class2_unser);
					?>
					
					输出结果:chybeta Object([test] => 124)
					
					//看到这,大家应该明白了。假如我们能控制反序列化的传参
					//就可以注入精心构造的payload。当进行反序列化的时候
					//就有可能会触发对象中的一些魔术方法,
					//造成意想不到的危害
			
			总结:	实际上,开发肯定在这肯定是为了实现某些功能,但是
					没有对传参进行过滤,导致出现问题

二、魔术方法和反序列化利用

	1,魔术方法的定义
			魔术:自动触发	
			方法:在类里面的方法 = 函数
			
			===》核心===》		自动触发的函数
			
			//比如,放一个老鼠夹子,老鼠经过,直接“啪”
	
	2,常用函数(魔术方法)
		~__construct():当对象创建(new)时会自动调用。
			但在unserialize()时是不会自动调用的。(构造函数)
			
		~__destruct():当对象被销毁时会自动调用。(析构函数)
		
		~__wakeup() :如前所提,unserialize()时会自动调用。

三、实战注意

	1,这主要就是多注意细节
	
	2,多练习代码功底
	
	3,在cookie中传参的话,假如有特殊字符要注意,cookie会进行一次
		url解码。所以,传参cookie要进行一次url编码
		
	4,工作之中的话,反序列化
		直接百度:“phar 反序列化”		//建议自学
		
	5,这个工作之中,比较难于遇到
	
	6,面试之中遇到有问的
			百度:WebLogic 反序列化		//将这个了解透,和hr聊就行
			//因为正常的  渗透测试人员用不到这,提到就是加分项了已经
原创文章 61 获赞 13 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43970718/article/details/104503535
今日推荐