前段时间网上爆出ThinkPHP5.1.x的POP链,早就想分析一下,正好最近有空,就记录一下吧
环境:
MacOS10.13
MAMAPPro
php7.0.33+xdebug
VisualStudioCode
前言
我所理解的POPChain:
利用魔术方法并巧妙构造特殊属性调用一系列函数或类方法以执行某种敏感操作的调用堆栈
反序列化常用魔法函数
__wakeup,unserialize()执行前调用
__destruct,对销毁的时候调用
__toString,类被当成字符串时的回应方法
__construct(),当对象创建(new)时会自动调用,注意在
unserialize()时并不会自动调用
__sleep(),serialize()时会先被调用
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用。
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用。
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类
__debugInfo(),打印所需调试信息
phar文件通过phar://伪协议拓宽攻击面
因为phar文件会以序列化的形式存储用户自定义的meta-data,所以在文件系统函数(file_exists()、is_dir()等)参数可控的情况下,配合phar://伪协议,可以不依赖unserialize()直接进行反序列化操作,深入了解请至: