0x01 Hello~(interface&implements)

​ 在Java编程语言中,interface和implements两个关键字都跟面向对象编程的概念有密切的关系。下面是对它们的基础解释:

interface:在Java中,接口(interface)是一种引用类型,跟类(class)是同级的结构。它是一种完全抽象的类型,用于定义对象之间的约定或行为规范。接口中可以定义抽象方法和常量,但不能包含普通方法(除非是Java 8之后引入的default方法和静态方法)。实质上,接口是对动作的抽象。

implements:这是一个关键字,用于类来"实现"一个或多个接口。当一个类实现了一个接口,就意味着这个类必须提供接口中所有抽象方法的具体实现。一个类可以实现多个接口,这就提供了一种对于Java单继承的补充机制。

以下是一个简单的接口和类的示例:

interface Animal {
    void eat();
    void sleep();
}

class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("The dog eats.");
    }
    
    @Override
    public void sleep() {
        System.out.println("The dog sleeps.");
    }
  
  	public void bark() {
        System.out.println("The dog barks.");
    }
}

​ 在这个例子中,我们定义了一个名为Animal的接口,接口有两个方法:eatsleep。然后,我们创建了一个类Dog,这个类通过使用关键字implements来实现了Animal接口。这就意味着Dog类必须提供Animal接口中所有方法的实现。

请注意,虽然Dog类必须实现所有的Animal接口的方法,但这并不意味着Dog类不能有Animal接口之外的其他方法。例如,Dog类可能还有其他方法,如 bark()

在这个例子中,你能够在Dog对象上调用bark()方法:

Dog myDog = new Dog();
myDog.bark();  // The dog barks.

但你不能在Animal对象上调用bark()方法,因为它不是Animal接口的一部分:

Animal myAnimal = new Dog();  // This is allowed because Dog is a subtype of Animal.
myAnimal.bark();  // This is NOT allowed.

在上述例子中,尽管myAnimal是一个Dog的实例,但是由于其类型被声明为Animal,我们只能调用在Animal接口中定义的方法。如果你需要调用bark()方法,就需要将对象类型转换成Dog:

Animal myAnimal = new Dog();  // This is allowed because Dog is a subtype of Animal.
((Dog)myAnimal).bark();  // This would be allowed because we are casting myAnimal to Dog.

总体而言,使用interfaceimplements的关键目的是创建一个可以由多种类按照共享的规则进行实现的架构,这样通过使用多态性,就可以使我们的代码更加灵活和可扩展。

0x02 审计相关

那么实际在审计中这个基础知识又扮演着什么角色,这里用某个OA的漏洞触发点跟踪过程进行举例。

  1. 当你找到此漏洞路径关联的调用方法,onMessage()

    image-20240202161916227
  2. 然后你每次都利用idea进行command+鼠标左键进行跟踪,直到追溯到handleMessage()方法,发现,咦,怎么是空的

    image-20240202162953739
  3. 这个时候如果你知道interface&implements的关系,那么你就会去找实现WorkspaceMessageHandler这个接口的类了,也知道为啥要搜implements WorkspaceMessageHandler了(快捷跳转见文尾)。

    image-20240202163657164
  4. 最终你成功找到了漏洞触发方法,而不是半路夭折。

PS: idea右键转到接口实现代码,快捷键option+command+B

image-20240202173159324