WEB漏洞——PHP反序列化
2021/9/13 11:04:45
本文主要是介绍WEB漏洞——PHP反序列化,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
序列化
首先说说什么是序列化
序列化给我们传递对象提供了一种简单的方法。serialize()将一个对象转换成一个字符串,并且在转换的过程中可以保存当前变量的值
而反序列化unserialize()将字符串还原为一个对象。
通俗来说:通过反序列化在特定条件下可以重建php对象并执行php对象中某些magic函数。
在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等。
举一个简单的例子
<?php class people{ public $name; public $age; public $sex; function __construct($name,$age,$sex){ //_construct:创建对象时初始化 $this->name = $name; $this->age = $age; $this->sex = $sex; } } $people=new people("hhy",20,"boy"); echo serialize($people); ?>
输出结果:O:6:"people":3:{s:4:"name";s:3:"hhy";s:3:"age";i:20;s:3:"sex";s:3:"boy";}
“O”表示对象,6表示对象名长度为6
“people”为对象名,3表示有3个参数
“s”表示string对象
“i”表示int对象
反序列化输出
$unpeople='O:6:"people":3:{s:4:"name";s:3:"hhy";s:3:"age";i:20;s:3:"sex";s:3:"boy";}'; var_dump(unserialize($unpeople)); //输出用var_dump函数 或者 $u=unserialize('O:6:"people":3:{s:4:"name";s:3:"hhy";s:3:"age";i:20;s:3:"sex";s:3:"boy";}'); echo $u->name,$u->age,$u->sex;
输出结果:object(people)#2 (3) { ["name"]=> string(3) "hhy" ["age"]=> int(20) ["sex"]=> string(3) "boy" }
输出结果:hhy20boy
反序列化
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题
- unserialize()函数的参数可控
- php中有可以利用的类并且类中有魔术方法
常见的魔术方法
__construct(): 在创建对象时候初始化对象,一般用于对变量赋初值。
__destruct(): 和构造函数相反,当对象所在函数调用完毕后执行。
__toString():当对象被当做一个字符串使用时调用。
__sleep():序列化对象之前就调用此方法(其返回需要一个数组)
__wakeup():反序列化恢复对象之前调用该方法
__call():当调用对象中不存在的方法会自动调用该方法。
__get():在调用私有属性的时候会自动执行
__isset()在不可访问的属性上调用isset()或empty()触发
__unset()在不可访问的属性上使用unset()时触发
<head> <meta charset="UTF-8"> </head> <?php class T{ public $test=1; function __construct(){ echo '调用了_construct<br>'; } function __destruct(){ echo '调用了_destruct<br>'; } //function __sleep(){ // echo '调用了_sleep<br>' //} function __wakeup(){ echo '调用了_wakeup<br>'; } } $t=new T(); echo $t->test; echo "<br/>"; $t1=serialize($t); echo $t1; echo "<br/>"; $t2=unserialize($t1); echo $t->test; echo "<br/>";
当程序执行前,serialize() 函数会首先检查是否存在一个魔术方法__sleep.如果存在,__sleep()方法会先被调用,然后才执行序列化操作。这个功能可以用于清理对象,并返回一个包含对象中所有变量名称的数组。如果该方法不返回任何内容,则NULL被序列化,导致一个E_NOTICE错误。
unserialize()会检查是否存在一个__wakeup方法。如果存在,则会先调用 __wakeup方法,预先准备对象数据。
漏洞举例: class S{ var $test = "pikachu"; function __destruct(){ echo $this->test; } } $s = $_GET['test']; @$unser = unserialize($a); payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
防御
反序列化的问题是用户参数的控制问题引起的,所以好的预防措施就是不要把用户的输入或者是用户可控的参数直接放进反序列化的操作中去。
这篇关于WEB漏洞——PHP反序列化的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-19php8的协程和hyperf的协程有什么区别?-icode9专业技术文章分享
- 2024-12-19php8 的fiber是什么?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-12-05怎么在php8,1 里面开启 debug?-icode9专业技术文章分享
- 2024-11-29使用PHP 将ETH账户的资产汇集到一个账户
- 2024-11-23怎么实现安卓+php 热更新方案?-icode9专业技术文章分享
- 2024-11-22PHP 中怎么实现判断多个值是否为空、null 或者为 false?-icode9专业技术文章分享
- 2024-11-11开源 PHP 商城项目 CRMEB 二次开发和部署教程
- 2024-11-09怎么使用php在kaufland平台刊登商品?-icode9专业技术文章分享
- 2024-11-05PHP的抽象类和接口是什么,有什么区别-icode9专业技术文章分享