RMI 架构: RMI 底层通讯采用了 Stub(运行在客户端) 和 Skeleton(运行在服务端) 机制, RMI 调用远程方法的大致如下: RMI客户端 在调用远程方法时会先创建 Stub(sun.rmi.registry.RegistryImpl_Stub) 。 Stub 会将 Remote 对象传递给 远程引用层(java.rmi.server.RemoteRef) 并创建 java.rmi.server.RemoteCall(远程调用) 对象。 RemoteCall 序列化 RMI服务名称 、 Remote 对象。 RMI客户端 的 远程引用层 传输 RemoteCall...

# Java 序列化 / 反序列化 在 Java 中实现对象反序列化非常简单,实现 java.io.Serializable(内部序列化) 或 java.io.Externalizable(外部序列化) 接口即可被序列化,其中 java.io.Externalizable 接口只是实现了 java.io.Serializable 接口。 反序列化类对象时有如下限制: 被反序列化的类必须存在。 serialVersionUID 值必须一致。 除此之外,反序列化类对象是不会调用该类构造方法的,因为在反序列化创建类实例时使用了...

# JNI 安全基础 Java 语言是基于 C 语言实现的,Java 底层的很多 API 都是通过 JNI(Java Native Interface) 来实现的。通过 JNI 接口 C/C++ 和 Java 可以互相调用 (存在跨平台问题)。Java 可以通过 JNI 调用来弥补语言自身的不足 (代码安全性、内存操作等)。这个看似非常炫酷的特性其实自 JDK1.1 开始就有了,但是我们不得不去考虑 JNI 调用带来的一系列的安全问题! 本章节仍以本地命令执行为例讲解如何构建动态链接库供 Java 调用,也许很多人是第一次接触这个概念会比较陌生但是如果你了学习过 C/C++ 或者...

# Java 动态代理 Java 反射提供了一种类动态代理机制,可以通过代理接口实现类来完成程序无侵入式扩展。 Java 动态代理主要使用场景: 统计方法执行所耗时间。 在方法执行前后添加日志。 检测方法的参数或返回值。 方法访问权限控制。 方法 Mock 测试。 # 动态代理 API 创建动态代理类会使用到 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口。 java.lang.reflect.Proxy 主要用于生成动态代理类 Class 、创建代理类实例,该类实现了...

# Java 本地命令执行 Java 原生提供了对本地系统命令执行的支持,黑客通常会 RCE利用漏洞 或者 WebShell 来执行系统终端命令控制服务器的目的。 对于开发者来说执行本地命令来实现某些程序功能 (如:ps 进程管理、top 内存管理等) 是一个正常的需求,而对于黑客来说 本地命令执行 是一种非常有利的入侵手段。 # Runtime 命令执行 在 Java 中我们通常会使用 java.lang.Runtime 类的 exec 方法来执行本地系统命令。 # Runtime 命令执行测试 runtime-exec2.jsp 执行 cmd...

# JDBC 基础 JDBC(Java Database Connectivity) 是 Java 提供对数据库进行连接、操作的标准 API。Java 自身并不会去实现对数据库的连接、查询、更新等操作而是通过抽象出数据库操作的 API 接口 ( JDBC ),不同的数据库提供商必须实现 JDBC 定义的接口从而也就实现了对数据库的一系列操作。 # JDBC Connection Java 通过 java.sql.DriverManager 来管理所有数据库的驱动注册,所以如果想要建立数据库连接需要先在 java.sql.DriverManager 中注册对应的驱动类,然后调用...

# Java 文件系统 众所周知 Java 是一个跨平台的语言,不同的操作系统有着完全不一样的文件系统和特性。JDK 会根据不同的操作系统 ( AIX,Linux,MacOSX,Solaris,Unix,Windows ) 编译成不同的版本。 在 Java 语言中对文件的任何操作最终都是通过 JNI 调用 C语言 函数实现的。Java 为了能够实现跨操作系统对文件进行操作抽象了一个叫做 FileSystem 的对象出来,不同的操作系统只需要实现起抽象出来的文件操作方法即可实现跨平台的文件操作了。 # Java FileSystem 在 Java SE 中内置了两类文件系统: java.io...

# sun.misc.Unsafe sun.misc.Unsafe 是 Java 底层 API ( 仅限Java内部使用,反射可调用 ) 提供的一个神奇的 Java 类, Unsafe 提供了非常底层的 内存、CAS、线程调度、类、对象 等操作、 Unsafe 正如它的名字一样它提供的几乎所有的方法都是不安全的,本节只讲解如何使用 Unsafe 定义 Java 类、创建类实例。 # 如何获取 Unsafe 对象 Unsafe 是 Java 内部 API,外部是禁止调用的,在编译 Java 类时如果检测到引用了 Unsafe 类也会有禁止使用的警告: Unsafe是内部专用 API,...

# URLConnection 在 java 中,Java 抽象出来了一个 URLConnection 类,它用来表示应用程序以及与 URL 建立通信连接的所有类的超类,通过 URL 类中的 openConnection 方法获取到 URLConnection 的类对象。 Java 中 URLConnection 支持的协议可以在 sun.net.www.protocol 看到。 由上图可以看到,支持的协议有以下几个 (当前 jdk 版本:1.7.0_80): file ftp mailto http https jar netdoc gopher 虽然看到有 gopher ,但是...

# Java 反射机制 Java 反射 ( Reflection ) 是 Java 非常重要的动态特性,通过使用反射我们不仅可以获取到任何类的成员方法 ( Methods )、成员变量 ( Fields )、构造方法 ( Constructors ) 等信息,还可以动态创建 Java 类实例、调用任意的类方法、修改任意的类成员变量值等。Java 反射机制是 Java 语言的动态性的重要体现,也是 Java 的各种框架底层实现的灵魂。 # 获取 Class 对象 Java 反射操作的是 java.lang.Class 对象,所以我们需要先想办法获取到 Class...

备注: 本系列 java 安全教程均参照 Java 安全 # java 类加载机制 Java 类加载机制是指 JVM 将.class 文件中的字节码读入内存,并将这些数据转换为 Java 类的过程。这个过程分为三个主要步骤:加载(Loading)、链接(Linking)和初始化(Initialization)。 # 类加载器: 启动类加载器(Bootstrap ClassLoader):这个类加载器是 JVM 自身的一部分,用来加载核心 Java 类库(通常是 rt.jar )。 扩展类加载器(Extension ClassLoader):加载 Java 扩展库(位于...

# SSRF (服务端请求伪造) 服务器端请求伪造,由攻击者构造形成由服务端发起请求的一个安全漏洞,也就是通过服务器攻击者可以访问到与服务相连的内网 # 描述: 目标应用程序可能具有从 url 导入数据,将数据发布到 url,篡改 url 读取数据的功能。 攻击者通过提供完全不同的 URL 或通过操纵 URL 的构建方式 (路径遍历等)。服务器段代码获取被操纵的 URL 并尝试将数据读取到 URL, 通过选择目标 URL,攻击者可能能够从未直接暴露在互联网上的服务中读取数据: 云服务器元数据 元数据:描述数据的数据 (数据集的存储位置,数据集的名称。。。) 数据库 HTTP 接口 —...