使用继承的覆盖方法
如果我们只是严格地谈论使用继承来覆盖您无权访问源代码的现有应用程序上的方法,那么@objlass 有点偏离主题。
这是因为如果您创建一个扩展新类的新类,并且只是覆盖一个方法并将其放在正在运行的应用程序的类文件夹中,则不会发生任何事情。这是考虑到您没有做复杂的事情,例如反编译和修改现有代码。
但是,如果您有像 Spring 这样的 DI 管理器,您可以通过编辑 XML 文件来更改注入的类,这样您就可以用原来的 bean 替换您自己的 bean。
切入点
另一种攻击也不是覆盖方法,通过使用方面添加切点,这也可以通过使用像 Spring 这样的框架来完成。
为了应用程序的安全,我只听说有些项目禁止任何库添加使用切面添加切入点的功能。
在 Java 中注入代码可能更容易这一事实并没有多大意义,您可以只考虑如果有人能够访问您的应用程序服务器,则服务器已损坏。
使用背书文件夹覆盖类
另一种破解方法是使用 Java 的认可机制,这是一个特定的地方,所有放在这里的 JAR 优先于所有其他 JAR。所以这意味着你甚至可以覆盖像 Java.lang.String 这样的类型。或者不用派生一个类来替换它或添加切入点,您可以只获取类(源代码或反编译 .class)对其进行修改、编译、放入 JAR 并将其放置在背书文件夹中。
请注意,例如 apache Tomcat 已经拥有一个“认可”文件夹,用于覆盖他在内部需要的任何库以拥有正确版本的类。您可以打开其中一个 JARS 并在其中添加您的课程。
防止这些方法
系统管理员应该如何检测到这一点?好吧,实际上我看到了一些非常简单的解决方案:一个脚本,它定期(cron ...:p)检查服务器上的任何文件(期望 /var/log 上的 movd 日志或其他文件)是否已更改并将其报告给系统管理员如果是这样。
因为无论您采用哪种方式,如果您无法在源代码进入服务器之前对其进行更改,那么您将不得不修改文件并检测到这实际上非常容易。
为了更进一步,您可以使用所有服务器文件和正在运行的脚本的计算 md5 哈希(并且仍在检查文件大小!)(以防有人试图将外部文件夹添加到类路径)。
最后,我在这里所说的实现起来非常简单,可能还有更聪明的方法可以做到这一点,但是我没有这方面的必要知识。
编辑 :
感谢@ojblass 指出有一个名为 Tripwire 的包,它将为您监视文件/目录,并在发生某些事情时执行您想要的命令。