0x01序列化与反序列化

  • 序列化:将变量转换为可保存或传输的字符串的过程。
  • 反序列化:在适当的的时候把这个字符串再转化成原来的变量使用。

优点:

  • 存储和传输数据更方便,使程序维护性更高。

函数:

serialize,unserialize,json_encode,json_decode,

1、serialize、unserialize

<?php
$a="aaaa";
$a=serialize($a);//字符序列化
echo $a;
echo unserialize($a);//字符反序列化
echo PHP_EOL; $b=array("aaaa","bb","c");
$b=serialize($b);//数组序列化
echo $b;
$b=unserialize($b);//数组反序列化
var_dump($b);
echo PHP_EOL; s:4:"aaaa";aaaa
a:3:{i:0;s:4:"aaaa";i:1;s:2:"bb";i:2;s:1:"c";}array(3) {
[0]=>
string(4) "aaaa"
[1]=>
string(2) "bb"
[2]=>
string(1) "c"
}
?>
各个字符的意义:
o:表示对象
a:表示数组
s:表示字符
i:表示数字 //s表示字符,4表示有4个字符,内容为"aaaa"
//a表示数组,3表示有三个变量值,i:0表示第一个变量,s为字符串,4位4个字符

当数组值包含单双引号或冒号时,序列化后容易出现问题。所以,采用base64_encode和base64decode。

<?php
$a = array("a","b","c");
$a=base64_encode(serialize($a));
echo $a;
echo PHP_EOL;
$b=unserialize(base64_decode($a));
var_dump($b); YTozOntpOjA7czoxOiJhIjtpOjE7czoxOiJiIjtpOjI7czoxOiJjIjt9
array(3) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
} ?>

但是采用base64编码后,增加了字符串长度,增加了存储空间,所以使用gzcompress、gzuncompress压缩字符串。

<?php
$a = array("a","b","c");
$b=base64_encode(serialize($a));
$c=base64_encode(gzcompress(serialize($a)));
echo $b;
echo PHP_EOL;
echo $c;
echo PHP_EOL; $d=unserialize(base64_decode($b));
$e=unserialize(gzuncompress(base64_decode($c)));
var_dump($d);
echo PHP_EOL;
var_dump($e);

0x02魔术方法

  • PHP将所有以__开头的类方法保存为魔术方法,所以在定义方法时,除了魔术方法,不要以__为前缀。
  • serialize()函数会检查类中是否存在一个魔术方法__sleep(),如果存在,该方法会被先调用,然后执行序列化操作,此功能用于清理对象。
  • unserialize()函数会检查类中是否存在一个魔术方法__wakeup(),如果存在,先调用。
  • __wakeup()执行漏洞:一个字符串或对象被序列化后,如果其属性被修改,则不会执行__wakeup()函数,绕过点。

0x03代码分析

class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code= //绕过__wakeup()魔术函数,得到flag

运行php代码,创建对象,序列化变量

<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
} $a=new xctf();
echo serialize($a); //O:4:"xctf":1:{s:4:"flag";s:3:"111";}
?>

修改属性值O:4:"xctf":2:{s:4:"flag";s:3:"111";},1->2

code传参

得到flag

参考链接:

https://www.cnblogs.com/dayin1/p/11465832.html

https://www.jianshu.com/p/8f498198fc3d

https://blog.csdn.net/zz_Caleb/article/details/89361250

unserialize3的更多相关文章

  1. 攻防世界(十三)unserialize3

    攻防世界系列 :unserialize3 1.打开题目,反序列化 2.代码审计 类xctf被调用时_weakeup()函数会被自动执行,但当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常, ...

  2. php反序列化-unserialize3

    目录 unserialize3-php反序列化 unserialize3 unserialize3-php反序列化 unserialize3 环境地址:https://adworld.xctf.org ...

  3. 攻防世界 WEB 高手进阶区 unserialize3 Writeup

    攻防世界 WEB 高手进阶区 unserialize3 Writeup 题目介绍 题目考点 PHP反序列化 __wakeup漏洞 Writeup 题名 unserialize 是反序列化函数名 了解一 ...

  4. 攻防世界 unserialize3

    unserialize3 class xctf{ public $flag = '111'; public function __wakeup(){ exit('bad requests'); } } ...

  5. xctf进阶-unserialize3反序列化

    一道反序列化题: 打开后给出了一个php类,我们可以控制code值: `unserialize()` 会检查是否存在一个 `__wakeup()` 方法.如果存在,则会先调用 `__wakeup` 方 ...

  6. unserialize3 攻防世界

    序列化是将对象转换为便于保存的字符串, 而反序列化是将便于保存的字符串转换为字符串. _wakeup()魔法方法 如果直接传参给code会被__wakeup()函数再次序列化,所以要绕过他, 利用__ ...

  7. 攻防世界(XCTF)WEB(进阶区)write up(三)

    挑着做一些好玩的ctf题 FlatScience web2 unserialize3upload1wtf.sh-150ics-04web i-got-id-200 FlatScience 扫出来的lo ...

  8. 攻防世界 - Web(一)

    baby_web: 1.根据题目提示,初始页面即为index,将1.php改为index.php,发现依然跳转成1.php,尝试修改抓包,出现如下回显, 2.在header中获取flag, flag: ...

  9. 攻防世界 WriteUp

    附:|>>>攻防世界-WEB-新手练习区<<<| WriteUp目录 01.|>>>baby_web<<<| 02.|>& ...

随机推荐

  1. 负载均衡服务之HAProxy基础配置(一)

    前文我们聊了下haproxy的基础安装,以及怎样去代理后端主机的配置:当然没有很详细的去说配置文件中各指令的意思:有关haproxy的安装和代理后端server可以参考本人博客https://www. ...

  2. Springboot:静态资源加载(七)

    WebMvc自动配置: 搜索WebMvcAutoConfiguration自动装配类: 第一种方式通过webjars加载静态资源: https://www.webjars.org(通过maven加载依 ...

  3. vue+element-ui中引入阿里播放器

    1.在public文件下的index.html文件中插入以下代码: <link rel="stylesheet" href="https://g.alicdn.co ...

  4. centos下python多版本管理(pyenv+python+virtualenv+ipython)

    pyenv是个多版本python管理器,可以同时管理多个python版本共存,如pypy,miniconde等等 1 环境准备 安装相关软件和pyenv1.1 安装相关软件yum install -y ...

  5. tensorflow1.0 队列FIFOQueue管理实现异步读取训练

    import tensorflow as tf #模拟异步子线程 存入样本, 主线程 读取样本 # 1. 定义一个队列,1000 Q = tf.FIFOQueue(1000,tf.float32) # ...

  6. Java锁之自旋锁

    Java锁之自旋锁 自旋锁:spinlock,是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU 原来提到的比较并交换,底层 ...

  7. php-fpm运行原理

    来源:https://blog.csdn.net/sinat_38804294/article/details/94393621 一.php-fpm由来1.cgi (common gateway in ...

  8. thinkPHP--empey标签

    直接上代码,这是判断内容是否为null而做出不同的html的选择 <notempey name="welfare_list"> <foreach name=&qu ...

  9. 通达OA-2017版本漏洞复现

    搭建环境 服务器 虚拟机系统版本:Windows Server 2016. 安装服务端 1.下载安装程序 这里我们下载的是2017版本的通达OA服务端: 2.安装程序 配置服务: 漏洞复现 1.任意文 ...

  10. 构建密钥验证ssh

    1.需要两个虚拟机,每一个创建一个用户登录到用户根下   2.每个用户都要创建密钥对   3.把两个用户的公用密钥用ssh-copy-id -i 命令将公用的密钥复制到另一个用户中   4.在客户端开 ...