您现在的位置是:主页 > news > 洛阳便宜网站建设费用/交换友情链接
洛阳便宜网站建设费用/交换友情链接
admin2025/5/22 21:29:28【news】
简介洛阳便宜网站建设费用,交换友情链接,迁西网站开发,asp作业做购物网站代码在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数 序列化serialize() 序列化说通俗点就是把一个对象,也就是我们定义的class,把它通过序列化变成可以传输的字符串,比如下面是一个对象: cla…
在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数
序列化serialize()
序列化说通俗点就是把一个对象,也就是我们定义的class,把它通过序列化变成可以传输的字符串,比如下面是一个对象:
class S{//我们定义了一个简单的类,类的名字就是大写的Spublic $test="pikachu";}$s=new S(); //创建一个对象serialize($s); //把这个对象进行序列化序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}O:代表object,在系列化里面,除了可以序列化对象,还可以序列化其它东西1:代表对象名字长度为一个字符S:对象的名称1:代表对象里面有一个变量s:数据类型4:变量名称的长度test:变量名称s:数据类型7:变量值的长度pikachu:变量值
反序列化unserialize()
就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}"); //通过unserialize方法,对我们接收到的方法进行反序列化echo $u->test; //反序列化后,可以直接得到一个对象,我们可以对对象里面的内容进行读取和操作
我们来看一下演示
首先定义一个类,定义了一个public变量,它的名称是pikachu,我们创建一个对象,通过serialize对对象进行序列化,序列化后,我们把结果给echo出来,换一行,我们在对序列化后的结果,进行反序列化,然后直接对得到的对象,进行调用,比如说,直接读取这个变量,把这个变量读出来,看能不能读出pikachu
我们试一下,我们来访问一下文件,
http://192.168.42.236/pikachu/test/ser.php
这一串的值,其实就是我们刚刚定义的对象,它序列化的结果,反系列化后,我们就可以直接得到变量pikahcu,这个是符合预期的
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,也就是说,从前端传进来的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题
PHP里面定义了好多对应的魔法方法,比如说,常见的几个魔法函数:__construct()当一个对象创建时被调用__destruct()当一个对象销毁时被调用__toString()当一个对象被当作一个字符串使用__sleep() 在对象在被序列化之前运行__wakeup将在序列化之后立即被调用漏洞举例:class S{//定义了一个类var $test = "pikachu";//类里面定义了一个变量function __destruct(){//一旦这个类被销毁,就自动执行,这种方法就被叫魔法方法echo $this->test;}}$s = $_GET['test'];//后台定义了一个接口,它会通过一个get请求,去获取一个数据,对这个数据进行反序列化@$unser = unserialize($a);payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
//用户前端传进来一个恶意的内容,后台接触到这个数据之后,会对这个后台进行反序列化,进行反序列化后,会对这个对象,进行创建和销毁,在这个过程当中,就会去调用魔法方法,这个时候,我们就需要一个接口,去传一个序列化好的内容
这个内容,同样的定义了一个变量,这个变量的值,是一个javascript脚本,然后我们把这段传给unserialize,对它进行反序列化,反序列化的过程中,它会对这个对象,进行创建和销毁,在销毁的时候,就会执行destruct,也就是说,它会把javascript的内容,echo到前端,那就意味着js的代码,会在前端被执行,也就是说,通过反序列化的结果,造成了一个xss漏洞
我们进行一个演示,在反序列化漏洞下面,有一个接口
我们在框框随便输入一段话,bhvbreuv
它都会提示我们同样的内容
我们可以提交一段正确的序列化内容,我们可以在php里面,自己写一个类,然后在这个类里面,自己定义一个变量,把这个变量的名称写成一段恶意的js代码,然后,把它new下来之后,对它进行序列化,然后得到一个序列化内容,构造自己的payload,我们访问一下,
http://192.168.42.236/pikachu/test/ser.php
我们查看源码
我们可以得到一段序列化好的内容,因为我们序列化好的内容,有一段js代码的内容,我们可以把这个序列化好的内容,在接口进行提交,
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
这整个过程,其实是我们提交序列化好的内容,然后序列化好的内容,里面的变量是一个恶意的js内容,我们把它提交到后台,后台会对提交的内容,进行反序列化,在反序列化的过程当中,它会自动调用魔法方法,然后魔法方法,刚好把这个内容echo到前端,实际上,就是通过反序列化的接口,造成xss的执行
我们看一下代码
跟我们刚刚讲的一样,定义了一个类,这个类里面,定义了一个魔法方法,construct,当我们的类被创建的时候,就会去执行下一段代码,在我们的实际代码中,这可能会是一些其它的操作,比如说,我们可以根据对应的操作,制作对应的payload,进行测试,一般这些反序列化漏洞,都是通过代码审计的方式,发现的,一般通过黑盒测试、扫描,是很难发现反序列化漏洞的
我们看到这边接受了一个post请求,然后,把接收到的数据进行反序列化,反序列化的过程中,就会对对象进行创建,然后调用魔法方法,把传进来的变量echo到前端