PHP 反序列化

本文深入探讨了PHP中的反序列化漏洞,讲解了如何通过未检测的序列化字符串控制反序列化过程,可能导致代码执行、SQL注入和目录遍历等安全风险。举例展示了__construct、__destruct等魔术方法在反序列化过程中的作用,并提供了一个利用示例,提醒开发者注意防范此类安全问题。
摘要由CSDN通过智能技术生成

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

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

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

serialize()序列化输出:

$key="chen";

echo serialize($key); s:4:"chen";

__construct()//创建对象时触发

__destruct() //对象被销毁时触发

__call() //在对象上下文中调用不可访问的方法时触发

__callStatic() //在静态上下文中调用不可访问的方法时触发

__get() //用于从不可访问的属性读取数据

__set() //用于将数据写入不可访问的属性

__isset() //在不可访问的属性上调用isset()或empty()触发

__unset() //在不可访问的属性上使用unset()时触发

__invoke() //当脚本尝试将对象调用为函数时触发

例:

<?php

error_reporting(0);

include "flag.php";

$KEY = "xiaodi";

$str = $_GET['str'];

if (unserialize($str) === "$KEY")

{

echo "$flag";

}

show_source(__FILE__);

class ABC{

public $test;

function __construct(){

$test =1;

echo '调用了构造函数<br>';

}

function __destruct(){

echo '调用了析构函数<br>';

}

function __wakeup(){

echo '调用了苏醒函数<br>';

}

}

echo '创建对象a<br>';

$a = new ABC;

$a_ser='O:3:"ABC":2:{s:4:"test";s:8:"flog.php";s:2:"op";s:2:" 2";}';

echo '反序列化<br>';

echo '序列化<br>';

$a_ser=serialize($a);

echo '反序列化<br>';

$a_unser = unserialize($a_ser);

echo '对象结束';

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值