700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > WEB漏洞——PHP反序列化漏洞

WEB漏洞——PHP反序列化漏洞

时间:2018-12-30 07:30:32

相关推荐

WEB漏洞——PHP反序列化漏洞

一、原理

序列化:将对象转化为字节流,字节流中包括这个对象的数据和信息。

反序列化:将字节流还原成对象。

序列化和反序列化的出现便于数据的存储与传输。

二进制序列化保持类型保真度,这对于在应用程序的不同调用之间保留对象的状态很有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等等。远程处理使用序列化“通过值”在计算机或应用程序域之间传递对象。

PHP反序列化漏洞原理:

未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化时就有可能会触发对象中的一些魔术方法。

serialize() //将一个对象转换成一个字符串unserialize() //将字符串还原成一个对象

触发:unserialize()的变量可控,文件中存在可利用的类,类中有魔术方法

参考文献:/5211lyz/p/11403397.html

二、序列化格式

<?php$A="test";echo serialize($A);?>得到结果是s:4:"test";s表示string字符型,4表示字符长度,“test”则是代表字符

如果是数字型的:<?php$A=123;echo serialize($A);?>得到的结果是i:123;i表示int整数型,不需要加上长度,直接跟上数值

序列的含义

<?phpclass Stu{public $name;public $sex;public $age;public $score;}$stu1=new Stu();$stu1->name="QHE";$stu1->sex=true;$stu1->age=16;$stu1->score=60;echo serialize($stu1)/*O:3:"Stu":4:{s:4:"name";s:3:"QHE";s:3:"sex";b:1;s:3:"age";i:16;s:5:"score";i:60;}其中O->Object 3->该类字符串名称长度 "Stu"->类名 4->类中有4个属性;第一个s->表示string类型 4->表示属性名字符长度 "name"->属性名;第二个s->string型 3->属性值的字符串长度 "QHE"->属性值;····后面以此类推····*/?>

魔术方法

__construct()具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。__destruct()析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。__wakeup()当使用unserialize()时会检查是否存在__wakeup()方法,如果存在则优先调用__wakeup()方法;__call()在对象上下文中调用不可访问的方法时触发__callStatic()在静态上下文中调用不可访问的方法时触发__get()用于从不可访问的属性读取数据__set()用于将数据写入不可访问的属性__isset()在不可访问的属性上调用isset()或者empty()触发__unset()在不可访问的属性上使用unset()时触发__invoke()当脚本尝试将对象调用为函数时触发

<?phpclass ABC{public $test;function __construct(){$test=1;echo('调用了构造函数<br>');}function __destruct(){echo('调用了析构函数<br>');}function __wakeup(){echo('调用了苏醒函数<br>');}}echo '创建对象<br>';$a=new ABC;echo '序列化<br>';$a_ser=serialize($a);echo '反序列化<br>';$a_unser=unserialize($a_ser);echo '对象快没了<br>';?>/*运行结果:创建对象调用了构造函数序列化反序列化调用了苏醒函数对象快没了调用了析构函数调用了析构函数*/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。