知识点:

序列化与反序列化

维基百科:    序列化(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

攻防世界Web篇——unserialize3的更多相关文章

  1. 攻防世界 WEB篇

    0x01 ics-06 查看源码发现:index.php 一开始直接用sqlmap跑了下没有发现注入,然后用brupsuite爆破参数 0x02 NewsCenter SQL注入中的POST注入,查阅 ...

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

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

  3. 攻防世界Web区部分题解

    攻防世界Web区部分题解   前言:PHP序列化就是把代码中所有的 对象 , 类 , 数组 , 变量 , 匿名函数等全部转换为一个字符串 , 提供给用户传输和存储 . 而反序列化就是把字符串重新转换为 ...

  4. CTF--web 攻防世界web题 robots backup

    攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...

  5. CTF--web 攻防世界web题 get_post

    攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...

  6. 攻防世界 web进阶练习 NewsCenter

    攻防世界 web进阶练习 NewsCenter   题目是NewsCenter,没有提示信息.打开题目,有一处搜索框,搜索新闻.考虑xss或sql注入,随便输入一个abc,没有任何搜索结果,页面也没有 ...

  7. XCTF攻防世界Web之WriteUp

    XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...

  8. 攻防世界web新手区

    攻防世界web新手区 第一题view_source 第二题get_post 第三题robots 第四题Backup 第五题cookie 第六题disabled_button 第七题simple_js ...

  9. XCTF攻防世界web进阶练习—mfw

    XCTF攻防世界web进阶练习-mfw题目为mfw,没有任何提示.直接打开题目,是一个网站 大概浏览一下其中的内容,看到其中url变化其实只是get的参数的变化查看它的源码,看到有一个?page=fl ...

  10. 攻防世界Web刷题记录(进阶区)

    攻防世界Web刷题记录(进阶区) 1.baby_web 发现去掉URLhttp://111.200.241.244:51461/1.php后面的1.php,还是会跳转到http://111.200.2 ...

随机推荐

  1. docker之rabbitmq delayed message exchange

    创建dockerfile FROM rabbitmq:3.9.11-management-alpine COPY rabbitmq_delayed_message_exchange-3.9.0.ez ...

  2. random随机数模块

    #wuyanfengimport random'''random.random()#随机数0到1的浮点数模块random.randint(1,7)#随机1到7闭区间的整数random.randrang ...

  3. What does int main(int argc, char *argv[]) mean?

    忽然发现自己不理解许多代码中这行的含义是什么...(汗颜) 下面贴一段stackoverflow上面的回答: argv and argc are how command line arguments ...

  4. win10 U盘重装系统

    1.做好U盘 2.F7选择U盘启动,不用F2切换启动顺序 3.IQY一键安装 4.重启前拔掉U盘 5.如果重启后蓝屏显示 恢复,重新进入PE使用 windows引导恢复,再重新启动

  5. IaaS--云虚拟机(三)(何恺铎《深入浅出云计算》笔记整理)

    云虚拟机收费之省钱办法. [包年包月] 包年包月就是我们要提前预估好自己虚拟机的使用时间,比如半年.一年甚至三年,并提前支付相关款项的一种购买方式.这样的购买方式,通常能够给你带来较大幅度的折扣,帮你 ...

  6. vue 中的 .sync 修饰符 与 this.$emit('update:key', value)

    vue 中 .sync 修饰符,是 2.3.0+ 版本新增的功能 在有些情况下,我们可能需要对一个 prop 进行"双向绑定".不幸的是,真正的双向绑定会带来维护上的问题,因为子组 ...

  7. regex cheat sheet

    regex pattern visualizer : regex101: build, test, and debug regex https://regex101.com/ regex regex ...

  8. VsCode C++ 语法检测失效不标红色波浪线 解决办法

    如果enable Squiggles 无效,按照下图里配置设置解决问题. 如图:

  9. ESP32-IDF 在vscode环境搭建

    前言 由于许多的未知原因,我尝试过许多网上教程,在vscode上搭建ESP-IDF环境,但结果是耗费了大把时间,结果还非常不理想. 在参考了(一)esp32开发环境搭建(VSCode+IDF实现单步调 ...

  10. Flutter 3.+更新记录

    Flutter3.3稳定版出来了,于是决定把之前Flutter工程的代码更新下其中里面有些涉及到组件的弃用 在此记录 ElevatedButton 代替了 RaisedButton 为带阴影的悬浮按钮 ...