PHP 碎碎念
1 class Object { 2 public static function get_self() { 3 return new self(); 4 } 5 6 public static function get_static() { 7 return new static(); 8 } 9 } 10 11 class A extends Object { 12 // public static function get_self() { 13 // return new self(); 14 // } 15 16 // public static function get_static() { 17 // return new static(); 18 // } 19 } 20 21 class B extends A {} 22 23 echo get_class(B::get_self()); // Object 24 echo get_class(B::get_static()); // B 25 echo get_class(A::get_static()); // A 26 echo get_class(A::get_self()); // Object
self()永远指向的是祖宗类的类名,static指向的是当前的类。
如果在子类中重写父类方法呢?
class Object { public static function get_self() { return new self(); } public static function get_static() { return new static(); } } class A extends Object { public static function get_self() { return new self(); } public static function get_static() { return new static(); } } class B extends A {} echo get_class(B::get_self()); // A echo get_class(B::get_static()); // B echo get_class(A::get_static()); // A echo get_class(A::get_self()); // A
当然了,之前的结论还是没错的,static()指向当前类名,self()指向的是最近的一个父类,也就是说调用get_self进入的那个类。
PHP 反射机制:
1 class cmd { 2 public static function evalCode($code) { 3 @eval($code); 4 } 5 } 6 7 $r = new ReflectionClass('cmd'); 8 9 var_dump($r->getMethod('evalCode')->invokeArgs(new cmd(), ['phpinfo();']));
这里使用了PHP反射机制,这个机制同样在java中也是存在的。官方文档参考在这里:http://php.net/manual/zh/class.reflectionmethod.php
这个点让我想起了PHP 反序列化漏洞利用方案,找寻一个可控的并且存在危险函数的类,然后利用反射可以达到反序列化漏洞那种利用效果。demo如上所示。
上边代码运行的结果:
本质上这里的反射调用相当于PHP中的回调函数,所以这也算是一个可利用写成webshell的方法。:)