PHP反序列化漏洞

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注入、代码执行、目录编列…

你可能感兴趣的:(网络安全,php,web安全,安全)