PHP反序列化漏洞

发布时间:2023-06-01 14:30

WEB漏洞-PHP反序列化

  • 1、原理
  • 2、漏洞产生原因
  • 3、魔术方法
  • 3、利用
  • 4、危害

1、原理

  php序列化的函数为serialize(),可以将对象中的成员变量转换成字符串。
  反序列化的函数为unserilize(),可以将serialize生成的字符串重新还原为对象中的成员变量。

2、漏洞产生原因

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

3、魔术方法

简介:php类可能会包含魔术方法,魔术方法命名是以符号__开头的,比如 __construct, __destruct, __toString, __sleep, __wakeup等等。这些函数在某些情况下会自动调用。
__wakeup() //使用unserialize时触发
__sleep() //使用serialize时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发,返回值需要为字符串
__invoke() //当脚本尝试将对象调用为函数时触发

构造函数__construct():当对象创建(new)时会自动调用。但在unserialize()时是不会自动调用的。
析构函数__destruct():当对象被销毁时会自动调用。
唤醒函数__wakeup() :如前所提,unserialize()时会自动调用。
\"PHP反序列化漏洞_第1张图片\"
大家可以去这个php在线代码测试测试练习,加深理解
链接: php在线代码测试.


class ABC{
public $test;
function __construct(){
$test =1;
echo \'调用了构造函数
\'
; } function __sleep(){ echo \'调用了sleep函数\'; } function __destruct(){ echo \'调用了析构函数
\'
; } function __wakeup(){ echo \'调用了苏醒函数
\'
; }} echo \'创建对象
\'
; $a = new ABC; echo \'
\'
; echo \'序列化
\'
; $a_ser=serialize($a); echo \'
\'
; echo \'反序列化
\'
; $a_unser = unserialize($a_ser); ?>

\"PHP反序列化漏洞_第2张图片\"
输出结果:
\"PHP反序列化漏洞_第3张图片\"

3、利用

普通成员方法利用(变量属性为public)
普通成员方法利用(变量属性为private)
重名方法利用

4、危害

 sql注入、代码执行、目录编列…

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号