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

2020-07-30 0 1,150

0x00.前言

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

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

百度说明:

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

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

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

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

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

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

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

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

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

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

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

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

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

0x02.漏洞产生

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

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

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

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

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

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

php生成序列化之后的信息

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

序列化之后的信息为:

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

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

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

0x03 原理解读

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

0x04 漏洞修复

  1. 在用户可输入的地方进行过滤,或添加白名单验证,
  2. 应当避免危险函数带入到魔法函数里面
  3. 在情况允许的情况下不要让反序列函数可以被用户输入控制,尽量写死
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

注:在使用本系统时,使用方必须在国家相关法律法规范围内并经过国家相关部门的授权许可,禁止用于一切非法行为。使用用途仅限于测试、实验、研究为目的,禁止用于一切商业运营,本团队不承担使用者在使用过程中的任何违法行为负责。

83源码 WEB安全 潜藏在PHP安全的边缘——浅谈PHP反序列化漏洞 https://www.83ym.com/59.html

认准唯一TG:@ym830

常见问题
  • 站内所有资源,针对不同等级VIP会员可直接下载,特殊资源商品会注明是否免费,指会员所享有根据选择购买的会员选项所享有的特殊服务,具体以本站公布的服务内容为准。
查看详情
  • 按照我国的法律规定,运营网络棋牌首先需要成立一个注册正规备案的公司,然后申请网站备案、文网文、ICP等等,这些证件缺一不可。 一.注册公司 在当地工商进行注册,公司名称以“XX科技有限公司”为名,如:富裕棋牌经营范围填写“计算机软硬件、网络设备的设计开发与购销”。 二.域名及网站备案 在国内从事网站经营活动就必须经过相关部门的备案,因此棋牌运营商在购买了域名后,就要到当地网监局办理网站备案,或者请服务器提供商代为备案。 三.申请文网文 文网文全称为网络文化经营许可证,是从事经营性互联网文化活动所必需的资质。一般是需要到当地省一级(省、直辖市、自治区)的文化行政部门提出申请,并经由当地的文化行政部门合法批准。次资质要求申请公司注册资金必需达到1000万,并提供游戏版权证明文件。 四.申请ICP ICP又称为增值电信业务许可证,所有网络游戏运营商均需要办理ICP许可证,此证件要求公司注册资金1000万,需到当地市级通讯管理局办理。 五.申请文网游——游戏备案 根据《网络游戏管理暂行办法》(文化部第49号)的规定,国产网络游戏在上网运营之日起30日内应当按规定向国务院文化行政部门履行备案手续。 以上就是网络棋牌游戏正规运营所必需的资质证明。一般作为正规有实力的棋牌游戏开发公司,不光要具备所有的正规资质,而且会对投资者、代理商等合作伙伴给予相关指导和协助,与合作伙伴携手共赢!
查看详情

相关文章

猜你喜欢
官方客服团队

为您解决烦忧 - 24小时在线 专业服务