php serialize 漏洞,PHP序列化函数unserialize/serialize在漏洞挖掘中的利用

刚做PHP代码审计不久,之前有听说过unserialize的问题,不过都没有仔细去深入研究过。正好这段时间在审计某系统的时候看到了使用unserialize函数,便花了点时间去研究了下。同时也特别感谢下在过程中给我提供不少帮助的黑哥黑友们。

unserialize函数功能和用法就没必要详细说了,毕竟这个不是本文的重点,而且官方的手册专业了点,有点难懂。不了解的朋友可以自信先去baidu搞清楚serialize和unserialize到底是干什么的。

unserialize函数是PHP中使用率非常高的函数,但不正当使用unserialize将导致比较严重的安全隐患。首先我们来看个例子:

//test.php

class Example {

var $var = '';

function __destruct() {

eval($this->var);

}

}

unserialize($_GET['code']);

?>

如上代码就是一个典型的问题,如果我们能提交数据给unserialize函数进行反序列化,并且unserialize函数所在程序能调用Example类的话我们就可成功的利用了。以上代码是将class和unserialize函数写在同一个文件中,实际的如果是unserialize函数所在页面include了Example所在程序一样。

如上代码我们可以直接提交()";} 就执行了phpinfo()。

但在实际的应用当中却不是那么容易的,以上代码只是我们意愿中的程序流程,要能成功利用unserialize函数来GetShell还是有很多条件限制的,一下就是限制条件,也是个人理解,有错误的地方还希望读者能指出。

userialize函数的利依赖于自定义普通类中的解析函数__destruct(),该函数在新建类的对象的时候会自动的调用。因此unserialize的利用也就依赖于类,不适用于函数。在类中若有其他在新建类对象的时候会自动调用的函数均可利用。

总结下来就是unserialize的成功利用首先要能调用自定义类,并且在类中有对象创建时候自动调用的Magic Methods,最重要的还是要这些Magic Methods中有可利用代码或者程序流程,如上的代码在__destruct()中就有个eval函数,当然这里也可以是其他的,例如fwrite fputs等等危险函数。若以上条件都具备的话也大可不用担心变量值的问题,类中那些变量完全可以自定义了!如上的Exp中我们就把var这个变量值赋成phpinfo()。

以上都是个人对unserialize利用的理解了,有错误的地方还希望大家能指出讨论。对unserialize笔者也只是肤浅的了解了下,深入的还有待和其他有经验的大大们交流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值