潜藏在PHP安全的边缘——浅谈PHP反序列化漏洞

注意事项:1.本篇文章由复眼小组的瞳话原创,未经允许禁止转载2.本文一共1376字,8张图,预计阅读时间6分钟3.本文比较基础,请大佬酌情观看,如果有其他的骚思路,欢迎和我们交流

0x00.前言

最近在研究代码审计漏洞的时候,特别注意了一下PHP反序列化漏洞,该漏洞又被成为PHP对象注入,个人感觉比较有意思,所以通过通俗易懂的语言来简单说一下PHP反序列的安全问题。

0x01.理解序列化与反序列化

百度说明:

听起来似乎似懂非懂,那么用通俗的语言讲,就是将对象里面的信息改变成可以传输的格式,说到这里是不是突然想起来json传输格式了呢,其实道理是一样的,接下来请看演示的demo。

这里我定义了一个对象,并填写了两个类属性和一个类方法,并在代码第9行实例化成了一个对象,第10行使用serialize函数进行序列化操作,并输出

查看执行结果之后,可以发现,这就是序列化之后的格式

解读一下分别是什么意思:O是对象的意思中间用:进行分割,6的意思是对象的name值为6个字节,往下看,2的意思是有两个类属性花括号类属性的内容S类属性9类属性name的长度,依次往下类推

值得一提的是,类方法并不会参与到实例化里面

明白了序列化操作,那么来理解一下什么是反序列化,顾名思义,就是将序列化之后的信息再反回去

这里接收一个ser的参数,然后使用反序列化函数unserialize进行反序列化处理,最后使用var_dump进行输出。

可以看到将我们输入的序列化后的信息又变回了一个对象,这就是反序列化操作

0x02.漏洞产生

在代码审计中只要记住这一点,代码审计就已经入门了,任何输入都是有害的。试想一下,既然被称为PHP对象注入,那么是怎么注入进去的呢?必须要有一个输入点,比如SQL注入,是因为在数据库交互的时候前端可控,导致的漏洞,那么对象注入,也要有一个输入点,所以我在下面写了一个demo,再次之前我们需要了解一下PHP中常见的魔法函数(又称魔术方法).

•__construct()当一个对象创建被时被调用•__destruct()当一个对象销毁时被调用•__toString()当一个对象被当作一个字符串使用•__sleep()在对象在被序列化之前运行•   __wakeup在将在反序列化之后立即被调用

为什么被称为魔法函数呢,因为是在触发了某个事件之前或之后,魔法函数会自动调用执行,而其他的普通函数必须手动调用才可以执行,PHP中魔法函数的开头都是以__(双下划线)为前缀,所以在定义函数的时候尽量不要使用双下划线为前缀

接下来看demo,这里定义了一个类,并在类里面添加了一个属性和魔术方法,该模式方法的触发条件为对象被反序列化之后立即调用,也正是这个方法导致了PHP反序列化漏洞的产生

先看到第5行的代码,有一个危险函数system,system里面是可控的,但是如果我们直接去输入一个系统命令是不能调用的,那么我们可以看到第9行有一个反序列的函数,并且函数内部也是可控的,那么我们就可以搞一些事情了。

php生成序列化之后的信息

序列化之后的信息为:

O:4:"Test":1:{s:3:"cmd";s:6:"whoami";}

然后,后面输入要执行的命令,前面的数值也要因命令的长度进行改变,这样就可以执行任意命令。如图后面的指令为ls,前面的数值变为"ls"的长度为2

0x03 原理解读

首先要说的是,危险函数被带入到魔法函数里面,这是一种非常危险的行为,然后system函数里面执行内容可控,引用了cmd这个类属性,从下面进行了实例化之后,然后进行反序列操作,因为反序列化函数里面的内容是可控的,那么我们可以输入序列化之后的数据,并改变信息中cmd的值(也就是whoami),原有的$cmd的值被我们新输入的值覆盖掉,并且执行完这些操作之后,魔法函数就像一颗定时炸弹,直接引爆,导致了命令执行,这就是为什么会被成为对象注入的原因。

0x04 漏洞修复

  1. 在用户可输入的地方进行过滤,或添加白名单验证,

  2. 应当避免危险函数带入到魔法函数里面

  3. 在情况允许的情况下不要让反序列函数可以被用户输入控制,尽量写死

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

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

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

  2. vue函数如何调用其他函数?_从源码中学Vue(一)生命周期中的钩子函数的那点事儿...

    欢迎来到我的<从源码中学Vue>专题系列文章,更多精彩内容持续更新中,欢迎关注 :) Vue作为当下前端最流行的框架之一,在国内占绝对的优势.所以接下来我们一起来学习它吧! 我不会像其它人 ...

  3. vue函数如何调用其他函数?_好程序员Python教程系列之递归函数与匿名函数调用...

    好程序员Python教程系列递归函数与匿名函数调用,函数是Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python技术能力的提升非常有帮助,这里就针对递归函数与匿名函数两种函数 ...

  4. python调用dll函数_关于从加载的DLL调用函数的Python基本问题

    我是在搜索和尝试各种各样的例子后提出这个问题的,但我似乎无法从加载的DLL调用函数.我想如果有人能给我举一个例子,我就能理解我做错了什么,并取得一些进展.在 首先,使用Python 3.3.3可以加载 ...

  5. python调用matlab函数_从 Python 调用 MATLAB 函数的三种方法

    0. 实验环境Ubuntu 16.04 Matlab R2015b 1. 借助于 mlab 库 安装方法非常简单,只需一行命令 sudo pip install mlab 即可. import num ...

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

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

  7. 255.0.0.0子网掩码相应的cidr前缀表示法是?_【洛谷日报#246】浅谈表达式的求值(Vol.2 进阶)...

    Warning 在观看本博客之前,请保证自己理解了表达式的三种表达方式. 本文旨在让大家更深层次的了解表达式,基础的知识就是上方的链接中所写的.所以,在了解后缀表达式的运算原理之后,我将不会讲述类似的 ...

  8. 智能循迹小车_校园智能车障碍断路方案浅谈

    点击上方蓝字 关注小黑记事本 小黑提要: 华软嵌协举办的第十届校园智能车比赛即将开赛,组委会今年在赛道元素上进行了一次大创新,加入了没有出现过的障碍与断路新元素,对于参赛的选手是一个不小的挑战,而选手 ...

  9. Java可以用到军事方面吗_恭喜遥三运载火箭发射成功, 浅谈 java 在军事方面的运用!...

    恭喜遥三运载火箭发射成功, 浅谈 java 在军事方面的运用! 恭喜长征五号遥三成功发射! 来聊聊军事系统都是用什么语言编写的 长征五号运载火箭, 是中国运载火箭升级换代的重要工程, 作为中国首型大推 ...

最新文章

  1. 没有为类型定义方法怎么办_拼多多开店没有流量怎么办?有什么方法?新手必看!...
  2. 养成一个习惯需要多久?
  3. 如何在Chrome开发者工具里找出SAP Fiori frontend server的systen ID
  4. 用soapUI测试webservice
  5. code换取微信openid_JSamp;微信_微信授权
  6. CaseStudy-数据缓存出错
  7. 安装eclipse插件sts
  8. 华数机器人编程语言_招新 | 海大最「酷」的科创团队,确定不来了解一下吗?...
  9. 最棒的Hyper-V监控工具 - Hyper-V Gadget
  10. android studio run的时候一直卡在waiting for debug
  11. ubuntu 本地源搭建
  12. python编程游戏-Python游戏趣味编程
  13. 完工后的决算书范本_竣工结算书样本.doc
  14. beetl模板使用场景_Beetl模板引擎入门教程
  15. java水彩画效果滤镜,PS通过滤镜给照片制作水彩画效果
  16. 北美中小学生实用学习网站推荐
  17. 毕业找工作+实习分享
  18. java 微信定位到市_java 微信公众号地理位置获取
  19. 苹果Mac 上照片调整工具的使用方法
  20. 面试通过后如何拒绝HR拿offer

热门文章

  1. kali linux set工具,求助: 社会工程学工具set 出现错误for kali linux.
  2. 步步为营-17-FileStream-文件加密/解密
  3. centos7 卸载软件
  4. Regionals 2014 Asia - Dhaka H 暴力
  5. 如何写robots.txt?
  6. 十堰市人民小学一年级在计算机学校,我上一年级啦!
  7. python seaborn_Python数据分析之Seaborn(样式风格)
  8. 枚举算法:求两个整数m,n(m>n)最大公约数的欧几里得算法描述。
  9. Python文件操作与matplotlib数据可视化案例一则
  10. Python中lambda表达式的语法与应用