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的方法。:)

版权声明:本文为magic-zero原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/magic-zero/p/8831518.html