知识点:

序列化与反序列化

维基百科:    序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。

简单的说,序列化是将变量转换为可保存或可传输的字符串的过程。而反序列化是在适当的时候吧这个字符串再转化成原来的变量使用。

php的序列化和反序列化

php的序列化和反序列化由serialize()和unserialize()这两个函数来完成
serialize()完成序列化的操作,将传入的值转换为序列化后的字符串
而unserialize()完成反序列化的操作,将字符串转换成原来的变量

serialize()函数将一个对象转换成字符串时,其返回的字符串有一定规则:

比如:O:4:"xctf":1:{s:4:"flag";s:3:"111";} 表示序列化的是一个对象,对象所在类名是"xctf"、类名的长度为4,该对象有一个属性,属性名为一个长度为4的字符串"flag"、该属性值为一个长度为3的字符串"111"

注意:
① 当属性为private属性时,它会在两侧加入空字节,导致其长度会增加2
② 序列化对象时只会序列化对象中的属性值,不会序列化其中的函数
魔术方法

PHP中以两个下划线开头的方法,__construct(), __destruct (), __call(), __callStatic(),__get(), __set(), __isset(), __unset (), __sleep(), __wakeup(), __toString(), __set_state,() __clone() __autoload()等,被称为"魔术方法"(Magic methods)。这些方法在一定条件下有特殊的功能

与序列化和反序列化的魔术方法主要是:

1 __construct()    //当一个对象创建时被调用
2 __destruct() //对象被销毁时触发
3 __wakeup() //使用unserialize时触发
4 __sleep() //使用serialize时触发
5 __toString() //把类当做字符串时触发
6 __get() //用于从不可访问的属性读取数据
7 __set() //用于将数据写入不可访问的属性

PHP反序列化漏洞

php反序列化漏洞又称对象注入,可能会导致注入,远程代码执行等安全问题的发生

php反序列化漏洞如何产生:

如果一个php代码中使用了unserialize函数去调用某一类,该类中会自动执行一些自定义的魔法方法,这些魔法方法中如果包含了某一些危险的操作,或者这些魔法方法回去调用类中带有危险操作的函数,如果这些危险操作时我们可控的,那么就可以进行一些不可描述的操作了

打开靶机,发现一段代码,__wakeup()会直接退出然后返回bad request,下面?code=提示我们可以用url绕过__wakeup()

查资料知:当序列化字符串当中属性个数值大于实际的属性个数时,就会导致反序列化异常,从而跳过__wakeup函数

这里我们写一段php代码,先将原来代码序列化

 1 <?php
2
3 class xctf
4 {
5 public $flag = '111';
6 public function __wakeup(){
7 exit('bad requests');
8 }
9 }
10 $a = new xctf();
11 $b = serialize($a);
12 echo $b;
13 ?>

得到
O:4:"xctf":1:{s:4:"flag";s:3:"111";}

将1改成大于一个任意数字

得到flag

以上wp参考于:https://blog.csdn.net/silence1_/article/details/89716976

最新文章

  1. zTree学习文档和DEOM
  2. Java:String和Date、Timestamp之间的转换
  3. 我的cookie读写
  4. 矩阵乘法 codevs 1287 矩阵乘法
  5. JavaWeb学习记录(八)——servlet获取配置信息
  6. logfile提示stale错误解决方法
  7. Response.Write() Alert后页面布局改变
  8. AngularJS -- Bootstrap(启动器)(转载)
  9. 在 ReactNative 的 App 中,集成 Bugly 你会遇到的一些坑
  10. bzoj4034[HAOI2015]树上操作 树链剖分+线段树
  11. 实验与作业(Python)-02 Python函数入门与温度转换程序
  12. 集群通信组件Tribes之整体介绍
  13. RabbitMQ访问控制
  14. MyBatis源码解析(一)——执行流程
  15. python3命令行ImportError: No module named &#39;xxxx&#39;的问题
  16. js keyup、keypress和keydown事件
  17. web前端面试题整理
  18. iOS8不能通过itms-services协议下载安装app
  19. OO第一次总结作业
  20. log4j 使用记录

热门文章

  1. 硬件路灯第一期CPU篇
  2. 2.4 OpenEuler中C语言中的函数调用测试
  3. 软件开发流程-路飞项目需求- pip永久换源-虚拟环境-路飞项目前后端创建-包导入-后端项目调整目录
  4. docker脚本自动化安装
  5. CANas分析软件,DBC文件解析,CAN报文分析,仿CANoe曲线显示
  6. logstash输出到MySQL
  7. npm i不成功devDependencies解决方法
  8. mongodb对Obeject对象进行增删改操作
  9. 安装git-lfs
  10. iOS的一些性能优化