web安全入门(第九章-4)反序列化

一、什么是序列化

1,定义
	简单的说:将php中对象、类、数组、变量、匿名函数等,转化为字符串,
	方便保存到数据库或者文件中
		//将状态信息保存为字符串

2,什么是反序列化
		//将字符串保存为状态信息

3,类与对象
	~类与对象	
		在次说一下,
		类就是代表一种物体的总称,比如猫类,狗类,鱼类等等
		对象就是类的具体体现,比如狗类的拉布拉多犬
			举例:
			人这个“类”,张三是类具体的人,即对象
			这里的类就是“人”,张三就是“对象”
		
	~类得初始化,即要给“类”赋予第一个对象的过程
	
	~销毁对象,即干掉“张三”
	
	~类的序列化
		人“类”有什么特征呢:	年龄,性别,姓名等
			具体到对象:	
						姓名:张三
						性别:男
						年龄:20
		但将这些信息保存很多的话,这个“年龄,性别,姓名”就会重复多次
		于是,最后存储的就是“张三,男,20”
						这就是序列化
	~反序列化
		就是将信息还原具体
			“张三,男,20”	==>	“姓名:张三,性别:男,年龄:20”
		
		~注意,有一定难度的是,万一取出信息是:160,165
				这个160和165 到底哪个是代表的身高,
				哪个是代表的体重???
		
		~注意,还原的时候,用对“类”
				不能还原“张三,男,20”,用“鱼”类等
				
4,php的序列化函数

		__FILE__  	获取当前文件路径
		show_source 显示文件源码
		print_r  	可以输出非字符串
		serialize:将对象转化为字符串
		
举例:
	show_source(__FILE__) :查看当前文件的内容[源码]
	show_source("x.php") :查看x.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,魔术方法的定义
		魔术:自动触发	
		方法:在类里面的方法 = 函数
		
		===》核心===》		自动触发的函数//满足x条件后自动执行该函数
		
		//比如,放一个老鼠夹子,老鼠经过,直接“啪”

2,常用函数(魔术方法)
	~__construct():当对象创建(new)时会自动调用。
		但在unserialize()时是不会自动调用的。(构造函数)
		
	~__destruct():当对象被销毁时会自动调用。(析构函数)
	
	~__wakeup() :如前所提,unserialize()时会自动调用。

三、实战注意

1,这主要就是多注意细节

2,多练习代码功底

3,在cookie中传参的话,假如有特殊字符要注意,cookie会进行一次
	url解码。所以,传参cookie要进行一次url编码
	
4,工作之中的话,反序列化
	直接百度:“phar 反序列化”		//建议自学
	
5,这个工作之中,比较难于遇到

6,面试之中遇到有问的
		百度:WebLogic 反序列化		//将这个了解透,和hr聊就行
		//因为正常的  渗透测试人员用不到这,提到就是加分项了已经
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值