PHP反序列化漏洞

PHP 反序列化

概念:序列化就是将对象转换成字符串,反序列化相反,数据的格式的转换对象的序列化利于对象的保存和传输,也可以让多个文件共享对象
原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL 注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。
serialize() //将一个对象转换成一个字符串–序列化
unserialize() //将字符串还原成一个对象–反序列化

有类与无类

1、有类 class

​ 触发魔术方法
​ __construct()
​ __destruct()
​ __wakeup()
​ __toString()
​ ……

2、无类 不具有魔术方法

序列化格式

O:4:”user”:2:{s:3:”age”;i:18;s:4:”name”;s:3:”yucedu”;}
O代表对象;4代表对象名长度;2代表2个成员变量;

利用

1、真实应用 java环境
2、各种CTF比赛

危害

1、SQL注入
2、代码执行
3、目录遍历
4、……

触发:unserialize 函数的变量可控,文件中存在可利用的类,类中有魔术方法:
参考:https://www.cnblogs.com/20175211lyz/p/11403397.html
__construct()//创建对象时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用 isset()或 empty()触发
__unset() //在不可访问的属性上使用 unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发

实验

PHP反序列化无类本地测试
PHP反序列化有类魔术方法本地测试
网鼎杯-AreUSerialz-有类魔术方法触发
= 赋值
== 判断是否相等
=== 全等,类型和数值都要一样

涉及资源

https://www.ctfhub.com/#/challenge ctf网鼎杯反序列化题目
https://www.cnblogs.com/20175211lyz/p/11403397.html PHP反序列化基本知识

测试代码:
<?php
error_reporting(0);
include “flag.php”;
$KEY = “yucedu”;
$str = $GET[‘str’];
if (unserialize($str) ===$KEY)
{
echo “$flag”;
}
show_source(__FILE_
);

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