虽说渗透测试对java编程要求不高,但有时候仍会进入java盲区,然后一脸懵逼,所以为了更清楚一些java漏洞的原理,就给自己补充一下java的基础知识当扫盲了。

参考链接:https://javasec.org/

Java基础

1.JVM

java的依赖于JVM(java虚拟环境)

下面是jvm架构图:

JVM

这个东西按我的理解就是编译器,跟脚本语言不同,java文件需要编译成.class文件才可以运行。

java的核心思想是类与对象。这个涉及到更多的知识点(由于以前学过),不涉及了。

1.java经过编译->javac 1.java
然后生成1.class
当然我们可以通过JDK自带javap反汇编.class文件的类
以及使用Linux自带的hexdump命令查看其二进制内容

2.ClassLoader

java反射

通过java反射可以让我们获取到任何类的成员方法、成员变量、构造方法等信息、还可以动态创建Java类实例、调用任意的类方法、修改任意的类成员变量值等。Java反射机制是java语言的动态性的重要体现,也是各种框架底层实现的灵魂。

java反射操作的是java.lang.Class对象。所以我们需要想尽办法先获取到Class对象,通常有以下几种方式获取一个类的Class对象:

1.类名.class 例如:com.anbai.sec.classloader.TestHelloWorld.class

2.Class.forName(“com.anbai.sec.classloader.TestHelloWorld”)

3.classLoader.loadClass(“com.anbai.sec.classloader.TestHelloWorld”)

而获取数组类型的Class对象需要使用Java类型的描述符方式:

Class<?> doubleArray = Class.forName("[D");//相当于double[].class
Class<?> cStringArray = Class.forName("[[Ljava.lang.String;");// 相当于String[][].class

获取Runtime类的代码片段:

String className=""java.lang.Runtime";
Class runtimeClass1 = Class.forName(className)
Class runtimeClass2 = java.lang.Runtime.class
Class runtimeClass3 = ClassLoader.getSystemClassLoader().loadClass(className)