一文深入理解 Java 虚拟机 安全开发

一文深入理解 Java 虚拟机

点击下方“IT牧场”,选择“设为星标”类文件结构class类文件的结构任何一个Class文件都对应着唯一的一个类或接口的定义信息,但是反过来说,类或接口并不一定都得定义在文件里(譬如类或接口也可以动态生成,直接送入类加载器中)。《Java虚拟机规范》根据《Java虚拟机规范》的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:“无符号数”和“表”。无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。表是由多个无符号数或者其他表作为数据项构成的复合数据类型,为了便于区分,所有表的命名都习惯性地以“_info”结尾。字节码由10部分组成,依次是魔数、版本号、常量池、访问权限、类索引、父类索引、接口索引、字段表索引、方法、Attribute。魔数  每个Class文件的头4个字节被称为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件1个十六进制数对应 4 位 二进制数,那么CAFEBABE 一共 8 个十六进制数,一共需要 32 位二进制数,对应就是 4 个字节版本号  由minor_version(次版本号)major_version(主版本号) 组成各占两个字节常量池  Class文件结构中与其他项目关联最多的数据,通常也是占用Class文件空间最大的数据项目之一,另外,它还是在Class文件中第一个出现的表类型数据项目。常量池中主要存放两大类常量:字面量(Literal)和符号引用(Symbolic References)。字面量比较接近于Java语言层面的常量概念,如文本字符串、被声明为final的常量值等。而符号引用则属于编译原理方面的概念,主要包括下面几类常量:·被模块导出或者开放的包(Package)类和接口的全限定名(Fully Qualified Name)·字段的名称和描述符(Descriptor)·方法的名称和描述符·方法句柄和方法类型(Method Handle、Method Type、Invoke Dynamic)·动态调用点和动态常量(Dynamically-Computed Call Site、Dynamically-ComputedConstant)访问标识  紧接着的2个字节代表访问标志(access_flags),这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final;等等类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,而接口索引集合(interfaces)是一组u2类型的数据的集合,Class文件中由这三项数据来确定该类型的继承关系。字段表(field_info)用于描述接口或者类中声明的变量。Java语言中的“字段”(Field)包括类级变量以及实例级变量,但不包括在方法内部声明的局部变量。段可以包括的修饰符有字段的作用域(public、private、protected修饰符)、是实例变量还是类变量(static修饰符)、可变性(final)、并发可见性(volatile修饰符,是否强制从主内存读写)、可否被序列化(transient修饰符)、字段数据类型(基本类型、对象、数组)、字段名称。描述符的作用是用来描述字段的数据类型、方法的参数列表(包括数量、类型以及顺序)和返回值。根据描述符规则,基本数据类型(byte、char、double、float、int、long、short、boolean)以及代表无返回值的void类型都用一个大写字符来表示,而对象类型则用字符L加对象的全限定名来表示对于数组类型,每一维度将使用一个前置的“
阅读全文
抓包quick手 移动安全

抓包quick手

工具1、jadx2、frida 网络请求框架分析请求协议通过查看app源码,可以清楚看到okhttp3的包名,使用okhttp3就很香。okhttp3分析1、打印网络请求通过他的sign或者sig3算法位置打印即可frida 是真的香var s = Java.use("j.a.*.*.s");s.a.overload('okhttp3.Request', 'java.util.Map', 'java.util.Map').implementation = function (a1, a2, a3) {console.log(a1)return this.a(a1, a2, a3)}可以清楚的看到请求的url还有get的参数,不过发现没有打印出来协议相关的信息。2、打印网络响应打印一下第一步的调用栈var exc = Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new());console.log(exc)这里的就可以去打印响应数据了。这就好了,app使用的协议是quic,这也就是为什么通过Charles抓不到包的原因了。okhttp3本身是支持quic的,但是app这里没有用到。从这篇文章就能发现蛛丝马迹https://cloud.tencent.com/developer/news/666059客户端、网络库统一设计对 QUIC 协议的支持需要客户端、服务端统一设计,kQUIC 也做了相应的工作。客户端网络库项目代号是库 Aegon,目标是代替原 OKHTTP/AFNetworking 和进行 API 请求和短视频下载,提供了 QUIC 协议的支持、完善的上报信息,并基于对数据指标的分析和对协议的深入理解,对网络库中持续进行了多项协议相关的优化,包括预建连、SSL Session 复用优化、客户端 BBR、POST 请求 0RTT 优化等等。一般 APP 使用的开源的网络库包括 OKHTTP 和 AFNetwork,都不支持跨平台,OKHTTP 是 Android 端,AFNetwork 是 iOS 端。**网络库在设计之初就把跨平台作为一个重要的目标,为**的双端提供统一的网络优化解决方案。所以Aegon是客户端代号,全部的包名是aegon.chrome,剩下的就好办了。解决问题通过上面类似步骤的hook和打印调用栈,发现app本身有一个类似开关的地方。"enable_quic": true把这个开关利用hook改成"enable_quic": false,那就可以抓包了。看看hook修改后的请求协议吧。看看Charles是否能抓到包。小结frida Hook在app启动的时候,不要attach,建议使用xposed进行Hook END 本文始发于微信公众号(网络侦查研究院):抓包quick手
阅读全文
CWE-576 EJB不安全实践:使用Java I/O CWE(弱点枚举)

CWE-576 EJB不安全实践:使用Java I/O

CWE-576 EJB不安全实践:使用Java I/O EJB Bad Practices: Use of Java I/O 结构: Simple Abstraction: Variant 状态: Draft 被利用可能性: unkown 基本描述 The program violates the Enterprise JavaBeans (EJB) specification by using the java.io package. 扩展描述 The Enterprise JavaBeans specification requires that every bean provider follow a set of programming guidelines designed to ensure that the bean will be portable and behave consistently in any EJB container. In this case, the program violates the following EJB guideline: "An enterprise bean must not use the java.io package to attempt to access files and directories in the file system." The specification justifies this requirement in...
阅读全文
从Charles破解历程了解Javassist使用 逆向工程

从Charles破解历程了解Javassist使用

题记看文章看到javassist可以直接修改java字节码,之前没有尝试过,因为charles是用java写的跨平台抓包工具,之前也用过,所以拿来进行测试!简介Javassist是一个开源的分析、编辑和创建Java字节码的类库。Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。关于java字节码的处理,目前有很多工具,如asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解虚拟机指令,可以采用javassist。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。原理介绍class文件简介及加载Java编译器编译好Java文件之后,产生.class 文件在磁盘中。这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码。JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信息,生成对应的 Class对象:在运行期的代码中生成二进制字节码由于JVM通过字节码的二进制信息加载类的,那么,如果我们在运行期系统中,遵循Java编译系统组织.class文件的格式和结构,生成相应的二进制数据,然后再把这个二进制数据加载转换成对应的类,这样,就完成了在代码中,动态创建一个类的能力了基本功能重要的类ClassPool:javassist的类池,使用ClassPool 类可以跟踪和控制所操作的类,它的工作方式与 JVM 类装载 器非常相似,  CtClass:CtClass提供了检查类数据(如字段和方法)以及在类中添加新字段、方法和构造函数、以及改变类、父类和接口的方法。不过,Javassist 并未提供删除类中字段、方法或者构造函数的任何方法。CtField:用来访问域  CtMethod :用来访问方法  CtConstructor:用来访问构造器Constructor getConstructor(Class..c);获得某个公共的构造方法。Constructor getConstructors();获得所有的构造方法。Constructor getDeclaredConstructor(Class..c);获得某个构造方法。Constructor getDeclaredConstructors();获得所有的构造方法CtMethod 和CtConstructor 提供了 setBody() 的方法,可以替换方法或者构造函数里的所有内容读取和输出字节码ClassPool pool = ClassPool.getDefault();//会从classpath中查询该类CtClass cc = pool.get("test.Rectangle");//设置.Rectangle的父类cc.setSuperclass(pool.get("test.Point")); //输出.Rectangle.class文件到该目录中 cc.writeFile("c://"); //输出成二进制格式 //byte b=cc.toBytecode(); //输出并加载class 类,默认加载到当前线程的ClassLoader中,也可以选择输出的ClassLoader。 //Class clazz=cc.toClass();这里可以看出,Javassist的加载是依靠ClassPool类,输出方式支持三种语法使用javassist来编写的代码与java代码不完全一致,主要的区别在于 javassist提供了一些特殊的标记符(以开头),用来表示方法,构造函数参数、方法返回值等内容。示例:System.out.println(“Argument1:”+开头),用来表示方法,构造函数参数、方法返回值等内容。示例:System.out.println(“Argument1:”+1); 其中的$1表示第1个参数.示例可以通过javassist来修改java类的方法,来修改其实现。如下所示: ClassPool classPool = ClassPool.getDefault(); CtClass ctClass = classPool.get("org.light.lab.JavassistTest"); CtMethod ctMethod = ctClass.getDeclaredMethod("test"); ctMethod.setBody("System.out.println("this method is changed dynamically!");"); ctClass.toClass();上面的方法即是修改一个方法的实现,当调用ctClass.toClass()时,修改后的类将被当前的ClassLoader加载并实例化。Tips类加载器是一个用来加载类文件的类。Java源代码通过javac编译器编译成类文件。然后JVM来执行类文件中的字节码来执行程序。类加载器负责加载文件系统、网络或其他来源的类文件。有三种默认使用的类加载器:Bootstrap类加载器、Extension类加载器和System类加载器(或者叫作Application类加载器)。每种类加载器都有设定好从哪里加载类。 package samples; /** * 自定义一个类加载器,用于将字节码转换为class对象 */ public class MyClassLoader extends ClassLoader { public Class<?> defineMyClass( byte b, int off, int len) { return super.defineClass(b, off, len); } }然后编译成Programmer.class文件,在程序中读取字节码,然后转换成相应的class对象,再实例化 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import...
阅读全文
java安全-java反射 SecIN安全技术社区

java安全-java反射

前言 如果要想深入学习java安全,除了java必备的基础知识外,还有一些java高阶的知识需要了解,例如反射,类加载,RPC,动态代理等。这些概念是java漏洞利用的基础,例如shiro反序列化,fastjson反序列化等。 这篇文章我们来详细说说java反射。 反射的基本概念 java 作为动态语言最基本的一个特性就是反射,反射可以使得java在运行时动态的去获取要加载的类对象并执行其中的方法,当然也可以获取并修改其属性等。 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作,例如: 现在有一个类名为com.test.Cat,其有一个方法为eat. ```java package com.test; public class Cat { public void eat(String food){ System.out.println("cat eat: "+ food); } } ``` 当需要调用eat方法时,需要实例化Cat对象。 ```java package com.test; public class main { public static void main(String args) { Cat cat = new Cat(); cat.eat("香肠"); } } ``` 那么现在有一个配置文件内容如下: ```txt className=com.test.Cat method=eat ``` 现在要求从配置文件中读取className的值和method的值去创建com.test.Cat对象,并执行其eat方法,那么该如何去实现呢? 可以肯定的是使用传统的方法是无法实现的,java反射就是用来解决此类问题的。 ```java package com.test; import java.io.FileInputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Properties; public class reflect { public static void main(String args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { Properties pro = new Properties(); FileInputStream fio = new FileInputStream("src\config.properties"); pro.load(fio); String className =...
阅读全文
java安全-java类加载器 SecIN安全技术社区

java安全-java类加载器

前言 java类加载器是JVM加载类到内存并运行的过程,这个过程有点复杂,除了系统自定义的三类加载器外,java运行用户编写自定义加载器来完成类的加载过程。java安全中常常需要远程加载恶意类文件来完成漏洞的利用,所以学习类加载器的编写也是很重要的。 类加载器 java系统定义了三类加载器,分别是BootstrapClassLoader,ExtensionClassLoader,AppClassLoader。其中BootstrapClassLoader由 C 语言代码实现,主要负责加载存储在$JAVA_HOME/jre/lib/rt.jar中的核心 Java 库,包括 JVM 本身。ExtensionClassLoader由sun.misc.Launcher$ExtClassLoader类实现。负责加载 JVM 扩展类,用来加载jrelibext的类,这些库名通常以 javax 开头,它们的 jar 包位于 $JAVA_HOME/lib/ext/*.jar 中,有很多 jar 包。AppClassLoader由sun.misc.Launcher$AppClassLoader实现。是直接面向我们用户的加载器,它会加载 Classpath 环境变量里定义的路径中的 jar 包和目录。 这三类加载器互相配合,完成了类的加载,这个过程比较复杂,而且还有一个比较重要的“双亲委派”机制,想要深入了解的同学可以看下老大难的 Java ClassLoader 再不理解就老了。 不过这里我们只需要重点关注下URLClassLoader和如何自定义类加载器就可以了。 URLClassLoader URLClassLoader扩展了ClassLoader,所以它在ClassLoader的基础上扩展了一些功能,这些扩展的功能中,最主要的一点就是URLClassLoader却可以加载任意路径下的类(ClassLoader只能加载classpath下面的类)。 在上篇的java反射介绍中,要实现动态加载类都是使用用Class.forName()这个方法,但是这个方法只能创建程序中已经引用的类,如果我们需要动态加载程序外的类,Class.forName()是不够的,这个时候就是需要使用URLClassLoader。 从本地文件加载外部类 首先先编写一个测试类,并将其编译为class文件。 ```java package com.classloader; public class test { public test(){ System.out.println("classloader test"); } } ``` 此时会在D:comclassloader文件夹下生成一个test.class文件。 URLClassLoader本地加载外部类示例: ```java package com.classloader; import java.io.File; import java.net.URL; import java.net.URLClassLoader; public class Demo1 { public static void main(String args) throws Exception { File file = new File("D:/"); URL url = file.toURI().toURL(); URLClassLoader urlClassLoader = new URLClassLoader(new URL{url}); //反射调用 Class<?> Cls = urlClassLoader.loadClass("com.classloader.test"); Cls.newInstance(); } } ``` 远程加载外部类 URLClassLoader远程加载外部类示例: 同上一步,将test.class文件放在远端的一个服务器上,使用http远程访问此文件。 地址为:http://1.14.47.152/test.class URLClassLoader远程加载外部类示例:...
阅读全文
java安全-java RMI SecIN安全技术社区

java安全-java RMI

前言 RPC全称为远程过程调用,通俗点讲就是可以在不同的设备上互联调用其方法,比如client可以远程调用server上的方法。而RMI是jdk中RPC的一种实现方式,通过RMI可以轻松的实现RPC而不必理会这其中复杂的调用过程。由于RMI的实现过程调用了java的序列化和反序列化,如果server端存在反序列化的利用条件,我们可在client端实现RMI反序列化攻击,从而在server端完成RCE。 RMI介绍 RMI,是Remote Method Invocation(远程方法调用)的缩写,即在一个JVM中java程序调用在另一个远程JVM中运行的java程序,这个远程JVM既可以在同一台实体机上,也可以在不同的实体机上,两者之间通过网络进行通信。java RMI封装了远程调用的实现细节,进行简单的配置之后,就可以如同调用本地方法一样,比较透明地调用远端方法。 RMI 可以使用以下协议实现: Java Remote Method Protocol (JRMP):专门为 RMI 设计的协议 Internet Inter-ORB Protocol (IIOP) :基于 CORBA 实现的跨语言协议 RMI包括以下三个部分: Registry: 提供服务注册与服务获取。即Server端向Registry注册服务,比如地址、端口等一些信息,Client端从Registry获取远程对象的一些信息,如地址、端口等,然后进行远程调用。 Server: 远程方法的提供者,并向Registry注册自身提供的服务。 Client: 远程方法的消费者,从Registry获取远程方法的相关信息并且调用。 在低版本的JDK中,Server与Registry是可以不在一台服务器上的,而在高版本的JDK中,Server与Registry只能在一台服务器上,否则无法注册成功。 RMI的工作原理如下图: 其实我们无需理会这复杂的过程,只需知道RMI如何使用即可。 要实现RMI,服务器和客户端必须共享同一个接口,且此接口必须派生自java.rmi.Remote,并在每个方法声明抛出RemoteException 服务端的实现类需要继承UnicastRemoteObject RMI服务端通过LocateRegistry.createRegistry创建Registry,并通过Naming.rebind将远程对象绑定到Registry RMI客户端通过Naming.lookup即可调用服务端的方法 RMI示例 定义HelloInterface接口 ```java package com.rmi; import java.rmi.Remote; import java.rmi.RemoteException; public interface HelloInterface extends Remote { String hello(String age) throws RemoteException; } ``` 实现HelloInterface接口 ```java package com.rmi; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class HelloImp extends UnicastRemoteObject implements HelloInterface{ protected HelloImp() throws RemoteException { } @Override public String hello(String age) throws RemoteException { return "hello" +" " + age; } } ``` RMI服务端 ```java package...
阅读全文
代码审计 | Java Web 核心技术 - Servlet 代码审计

代码审计 | Java Web 核心技术 - Servlet

0x00 前言Servlet 是 Java Web 容器中运行的小程序,Servlet 原则上可以通过任何客户端-服务端协议进行通信,但它们常与 HTTP 一起使用,因此 Servlet 通常作为 “HTTP Servlet”的简写。Servlet 是 Java EE 的核心,也是所有 MVC 框架实现的根本。0x01 Servlet 的配置版本不同,Servlet 的配置不同,Servlet 3.0 之前的版本都是在 web.xml 中配置的,在 3.0 之后的版本中则使用更为方便的注解方法来配置。此外不同版本的 Servlet 所需要的 Java/JDK 版本也不同,具体如下图所示。1、基于 web.xml 的配置以下是一个基于 web.xml 的 Servlet 配置文件<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="2.5"> <display-name>manage</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <description></description> <display-name>user</display-name> <servlet-name>user</servlet-name> <servlet-class>com.sec.servlet.UserServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>user</servlet-name> <url-pattern>/user</url-pattern> </servlet-mapping> </web-app>在 web.xml 中,Servlet 的配置在 Servlet 标签中,Servlet 标签由 Servlet 和 Servlet-mapping 标签组成,两者通过标签中相同的 Servlet-name 实现关联,上述配置文件中的标签含义如下:<servlet>         声明 Servlet 配置入口<description>     声明 Servlet 描述信息<display-name> 定义 Web 应用的名称<servlet-name> 声明 Servlet 名称以便在后面的映射时使用<servlet-class>   指定当前 Servlet 对应的类的路径<servlet-mapping> 注册组件访问配置的路径入口<servlet-name> 指定上文配置的 Servlet 名称<url-pattern>     指定配置这个组件的访问路径2、基于注解方式Servlet 3.0 以上的版本中,开发者无须在 web.xml 里配置 Servlet,只需要添加 @WebServlet 注解即可修改 Servlet 的属性,如下代码所示。import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;/** * 基于注解开发Servlet...
阅读全文
JBDC注入 SecIN安全技术社区

JBDC注入

什么是JDBC Java 数据库连接 ( JDBC ) 是编程语言Java的应用程序编程接口(API) ,它定义了客户端如何访问数据库。它是一种基于 Java 的数据访问技术,用于 Java 数据库连接。它是Oracle Corporation的Java Standard Edition平台的一部分。它提供了查询和更新数据库中数据的方法,并且面向关系数据库。JDBC 到ODBC(开放式数据库连接)桥允许连接到Java 虚拟机(JVM) 主机环境中任何 ODBC 可访问的数据源。 什么是API 应用程序接口(英语:Application Programming Interface),缩写为API,是一种计算接口,它定义多个软件中介之间的交互,以及可以进行的调用(call)或请求(request)的种类,如何进行调用或发出请求,应使用的数据格式,应遵循的惯例等。它还可以提供扩展机制,以便用户可以通过各种方式对现有功能进行不同程度的扩展。一个API可以是完全定制的,针对某个组件的,也可以是基于行业标准设计的以确保互操作性。通过信息隐藏,API实现了模块化编程,从而允许用户实现独立地使用接口。 注入思路 直接使用 JDBC 的场景,如果代码中存在拼接 SQL 语句,那么很有可能会产生注入 环境搭建 首先使用idea搭建一个可供测试的环境,如果读者不太熟悉idea的使用可参考此教程,教程图文并茂,较为详细 我们通过模拟用户登录,来验证JDBC注入 java环境源代码 ``` package com.jbdc_demo; import java.sql.*; import java.util.Scanner; public class TestLogin { public static void main(String args) throws ClassNotFoundException, SQLException { Scanner scanner = new Scanner(System.in); System.out.print("请输入用户名:"); String userName = scanner.nextLine(); System.out.print("请输入密码:"); String password = scanner.nextLine(); //1.加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取连接对象,连接数据库 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/temp?useUnicode=true&characterEncoding=utf8", "root", "root"); //3.创建执行SQL语句的对象 Statement statement = connection.createStatement(); //4.编写SQL语句,并执行SQL语句 String sql = "select * from user where username = '" + userName + "' and...
阅读全文
代码审计 | Java EE 基础知识 代码审计

代码审计 | Java EE 基础知识

Java 平台分为三个主要版本:Java SE(Java 平台标准版)Java EE(Java 平台企业版)Java ME(Java 平台微型版)Java EE 是 Java 应用最广泛的版本。0x01 Java EE 的核心技术Java EE 有十三种核心技术,它们分别是:JDBC、JNDI、EJB、RMI、Servlet、JSP、XML、JMS、Java IDL、JTS、JTA、JavaMail 和 JAF,这里重点介绍以下几种:Java 数据库连接(Java Database Connectivity,JDBC)是 Java 语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。Java 命名和目录接口(Java Naming and Directory Interface,JNDI),是 Java 的一个目录服务应用程序界面(API),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。简单的说就是比如以前连接数据库需要把参数写在 Java 类里,但现在可以直接写在配置文件里了,这个配置文件可以是 XML,也可以是 properties,或者 yml 文件,只要能解析都行。企业级 JavaBean(Enterprise JavaBean, EJB)是一个用来构筑企业级应用的、在服务器端可被管理组件。不过这个东西在 Spring 问世后基本凉凉了,知道是什么就行。远程方法调用(Remote Method Invocation,RMI)是 Java 的一组拥有开发分布式应用程序的 API,它大大增强了 Java 开发分布式应用的能力。Servlet(Server Applet),是用 Java 编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。狭义的 Servlet 是指 Java 语言实现的一个接口,广义的 Servlet 是指任何实现了这个 Servlet 接口的类,一般情况下,人们将 Servlet 理解为后者。JSP(全称 JavaServer Pages)是由 Sun 公司主导创建的一种动态网页技术标准。JSP 部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成 HTML、XML 或其他格式文档的 Web 网页,然后返回给请求者。可扩展标记语言(eXtensible Markup Language,XML)是被设计用于传输和存储数据的语言。Java 服务消息(Java Message Service,JMS)是一个 Java 平台中关于面向消息中间件(MOM)的 API,用于在两个应用程序之间或分布式系统中发送消息,进行异步通信。0x02 Java EE 分层模型Java EE 应用的分层模型主要分为以下 5 层。Domain Object(领域对象)层,也叫模型(Modole)层,此层由一系列的 POJO(Plain Old Java Object,普通的、传统的 java 对象)组成,这些对象是该系统的 Domain Object,往往包含了各自所需实现的业务逻辑方法。DAO(Data Access Object,数据访问对象)层,此层由一系列的...
阅读全文
Tomcat弱口令漏洞攻击研究 安全闲碎

Tomcat弱口令漏洞攻击研究

*严正声明:本文仅限于技术讨论与分享,严禁用于非法途径。一、实验目的 1、在XP系统上搭建Tomcat服务器平台;2、在另一台虚拟机上利用弱口令漏洞上传木马程序,使得XP系统中木马。二、实验设备及环境VMWare、XP系统、2003系统三、实验步骤实验内容1、在XP系统上搭建Tomcat服务器平台;2、在另一台虚拟机上利用弱口令漏洞上传木马程序,使得XP系统中木马搭建Tomcat服务器平台安装JAVA JDK:目的是打包木马环境变量的配置:JAVA_HOME:C:Program FilesJavajdk1.7.0_79Path:%JAVA_HOME%bin;CLASSPATH:.%JAVA_HOME%libdt.jar;%JAVA_HOME%libtool.jar;Window2003:Window xp:Window xp 安装成功Window 2003安装成功安装Apache-Tomcat服务器将压缩包解压,把整个文件夹拷贝至C盘。(免安装)添加环境变量:TOMCAT_HOME:C:apache-tomcat-6.0.37进入bin目录,点击bat或者shutdown.bat可以启动或关闭服务器。成功打开!点击exe,启动服务器,在浏览器中输入:http://127.0.0.1:8080/,若显示如下界面,则服务器启动成功。登录管理员后台需要用户名密码,刚开始未设置,我们要自行设置。首先查看存放用户名密码的文件:在conf文件夹下的tomcat-users.xml,用记事本打开。将管理员账号添加进去:<role rolename="manager-gui"/><role rolename="manager-script"/><role rolename="manager-jmx"/><role rolename="manager-status"/><user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status"/>点击保存后重启服务器,回到登录界面,输入用户名密码,即可进入管理员界面:木马制作Tomcat只支持war的后缀文件包的上传,因此,必须将jsp木马程序与其他木马一起打包成war包才能上传。在安装有JDK的操作系统上,将所需要上传的木马放在同一个文件夹中,存放到C盘。这里用到一个jsp的木马程序以及V.vbs病毒程序。运行cmd,使用cd命令将目录切换到刚刚存放的c文件夹下:使用命令将木马程序打包:jar cvf shell.war *若提示jar不是内部命令,请回到JDK安装步骤查看环境变量是否配置正确。成功时的命令提示如下:漏洞入侵使用另一台电脑(2003)输入以下网址:http://192.168.78.137:8080/(对应IP地址要改)访问成功将出现以下界面:弱口令扫描打开Apache Tomcat crack软件,界面如下:设置扫描网段,点击add按钮添加;点击start按钮开始扫描。扫描成功将获得口令和密码。上传木马利用前面扫描到的口令密码登录管理员网页将之前做好的war包上传至服务器:在地址栏中输入网址:http://192.168.78.137:8080/shell/s.jsp即可看到对方电脑中所有的文件目录:找出之前一并上传的木马文件vbs,利用下面的执行功能让其在被害者电脑上运行:c:hzxV.vbs -install此时在被攻击者电脑上会自运行病毒程序,即中病毒了。也可将病毒用灰鸽子木马替换实现远程控制。 原文始发于微信公众号(疯猫网络):Tomcat弱口令漏洞攻击研究
阅读全文
Category-1151: SEI CERT Oracle Java安全编码标准-准则17.Java本机接口(JNI) CWE(弱点枚举)

Category-1151: SEI CERT Oracle Java安全编码标准-准则17.Java本机接口(JNI)

Category-1151: SEI CERT Oracle Java安全编码标准-准则17.Java本机接口(JNI) ID: 1151 Status: Stable Summary Weaknesses in this category are related to the rules and recommendations in the Java Native Interface (JNI) section of the SEI CERT Oracle Secure Coding Standard for Java. Membership ID NAME CWE-111 对不安全JNI的直接使用 References REF-972 SEI CERT Oracle Coding Standard for Java : Rule 17. Java Native Interface (JNI) 文章来源于互联网:scap中文网
阅读全文