PHP序列化函数unserialize/serialize在破绽发掘中的利用









刚做PHP代码审计未几,之前有据说过unserialize的问题,不外都不细心去深刻研讨过。正好这段时间在审计某体系的时候看到了使用unserialize函数,便花了点时光去研究了下。同时也特殊感激下在进程中给我供给不少辅助的黑哥黑友们。



unserialize函数功效和用法就没必要具体说了,究竟这个不是本文的重点,而且官方的手册专业了点,有点难懂。不懂得的友人可以自负先去baidu搞明白serialize和unserialize到底是干什么的。



unserialize函数是PHP中使用率十分高的函数,但不合法应用unserialize将导致比拟重大的保险隐患。首先咱们来看个例子:



//test.php



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笔者也只是浮浅的了解了下,深入的还有待和其他有教训的大大们交换

09-26 20:22