基本介绍

Java代码审计即审计Java代码,通过查看源码的方式分析代码中的安全问题,给出利用过程和修改方案。由于Java是编译型语言,即使在没有Java源码的情况下也可以通过反编译class文件或jar包的方式查看代码。Java代码审计要求审计者了解Java及Java web的基本语法、特性、运行原理和相关漏洞的成因和利用等基础知识,在审计时通常通过工具加手工的方式发现代码中的漏洞。

基础知识

主要介绍Java代码审计中需要的基础知识,列出知识点。

Java基础

审计Java代码之前肯定要先学会写Java代码,包含但不限于Java的基础语法、运行原理等,需要学习的点包含但不限于以下几点。

  • Java类加载机制:Java类加载机制是指Java虚拟机(JVM)将类的字节码加载到内存并执行的过程,Java类加载机制具有一定的灵活性和扩展性,可以通过自定义类加载器实现动态加载类,实现一些高级功能。

  • Java反射机制:Java反射机制是指在运行时动态获取类的信息并操作类的属性、方法和构造方法等。Java反射机制可以帮助我们在编译时不知道类的具体信息的情况下,通过反射机制获取类的信息,调用类的方法和构造方法等。

  • Java动态代理:Java动态代理是指在运行时动态生成代理类对象,代理类对象可以代理一个或多个接口,通过代理类对象可以调用被代理对象的方法。

  • maven使用:Apache Maven是一个开源的项目管理工具,它提供了一种标准化的构建方式、自动化构建过程、依赖管理、项目信息管理等功能,使得Java项目的构建、发布和管理更加简单和高效。

  • Javassit动态编程:Javassist是一个开源的Java字节码编辑库,它提供了一系列API来操作Java字节码,使得Java程序的动态编程和修改变得更加容易和灵活。Javassist可以用来生成新的Java类、修改已有类的方法、字段和构造函数、修改类的继承关系等。

  • ASM动态编程:ASM是一个基于Java字节码的轻量级字节码操作和生成框架,它允许程序员直接以二进制方式修改Java字节码。与Javassist不同,ASM更加底层,提供了更细粒度的字节码操作,从而能够更加高效地生成和修改Java字节码。

  • Java序列化与反序列化:Java序列化和反序列化是将Java对象转换为字节流或从字节流转换为Java对象的过程。Java对象序列化是将对象转换为字节流的过程,而反序列化则是将字节流转换为Java对象的过程。Java序列化和反序列化通常用于对象的持久化、网络传输和远程调用等场景。

    Java Web基础

    Java代码审计主要针对的就是Java Web,字面理解就是使用Java做web应用程序开发。Java Web主要依靠Java EE(Enterprise Edition)平台,包括Servlet、JSP、JavaBean、EJB等技术组件,以及使用JDBC(Java Database Connectivity)和JNDI(Java Naming and Directory Interface)等技术访问和管理数据库。Java Web的基础知识点包含但不限于以下几点:

  • Servlet:Java Servlet是一种服务器端的Java技术,可以处理HTTP请求和响应,常用于构建Web应用程序的后台服务。通过Servlet技术,可以实现用户认证、会话管理、数据存储和Web页面渲染等功能。

  • Filter:Java Web Filter是Java Web应用程序中的一种特殊组件,它可以截获HTTP请求和响应,对它们进行预处理和后处理,以实现一些通用的功能,例如日志记录、权限验证、编码转换等。

  • JDBC:Java JDBC(Java Database Connectivity)是Java平台提供的一种用于访问数据库的标准API,它可以让Java应用程序与各种关系型数据库进行交互,包括Oracle、MySQL、PostgreSQL等

  • JNDI:JNDI是Java平台提供的一种API,用于访问命名和目录服务。JNDI可以让Java应用程序在运行时通过名称来访问各种服务,包括命名服务、目录服务、LDAP服务等。JNDI还可以用于在应用程序中查找和管理资源,例如JDBC数据源、JMS连接工厂等。

  • RMI:Java RMI(Remote Method Invocation)是Java平台提供的一种远程调用机制,可以让Java应用程序通过网络调用远程对象上的方法,就像调用本地对象一样。RMI提供了一种面向对象的方式来访问远程对象,这些对象可以在本地或远程主机上运行。

  • JSP:JavaServer Pages(JSP)是一种用于开发动态Web页面的Java技术。JSP页面是一种HTML文档,其中包含嵌入式Java代码,这些代码可以动态地生成页面的内容。JSP页面可以使用标准的HTML和CSS样式,同时还可以使用Java标准标签库(JSTL)和自定义标签库来简化页面开发。

  • SpringMVC:Spring MVC是一种基于Java的Web框架,可以用于开发Web应用程序。Spring MVC的设计基于Model-View-Controller(MVC)架构模式,它提供了一种灵活、可扩展的方式来开发Web应用程序,使得开发人员可以专注于业务逻辑而不必担心底层技术细节。

    基本漏洞

    基本漏洞包含但不限于以下几种类型的漏洞,要求了解漏洞成因、利用方式和修补方式,在此项学习中可以通过编写自己的漏洞Demo加上分析已有漏洞加深理解。

  • SQL注入

  • 不安全的反序列化

  • SSRF

  • 命令执行

  • 文件上传/写入

  • 任意文件读取

  • 文件包含

  • XXE

  • XSS

  • 业务逻辑漏洞

  • 框架漏洞

    代码审计常用思路

    与其他语言的代码审计思路并无二致,通常包含以下几点:

  1. 输入验证:对所有输入数据进行验证,包括用户输入、网络数据包等,避免SQL注入、跨站脚本攻击等漏洞。
  2. 身份认证和访问控制:确保每个用户只能访问其所需的资源,并确保其身份是真实和合法的,避免未经授权的访问。
  3. 危险函数追踪:全局搜索危险函数查看上下文分析是否可以利用。
  4. 补丁对比:对比相关安全补丁发现修改痕迹逆推漏洞形成。
  5. 错误处理和日志记录:阅读错误处理日志发现问题。
  6. 接口设计和实现:确保接口设计合理,对于对外开放的接口,需要对参数进行验证,防止恶意攻击或非法使用。
  7. 白盒测试加黑盒测试:黑盒找易出现问题的功能点,白盒根据功能点。
  8. 第三方组件使用:对于使用的第三方组件,需要进行安全审查和漏洞检查,避免其存在安全漏洞导致系统被攻击。

    环境和工具介绍

    代码审计过程中常用的工具介绍,在代码审计过程中常用的工具包含但不限于以下几种:
  • 代码编辑器:IntelliJ IDEA是一款由JetBrains公司推出的Java集成开发环境(IDE),是目前最流行的Java IDE之一。它支持各种Java相关技术和框架,如Spring、Hibernate、Maven、Gradle等等,并提供了丰富的功能和工具来帮助开发人员提高效率和质量。

image.png

  • 文本编辑器:cursor,一个集成chatgpt的文件编辑软件,可以代替sublimetxt等编辑软件。

image.png

  • 反编译工具:JD-GUI,JD-GUI 是一个 Java 字节码反编译工具,可以将 Java 类文件反编译为 Java 源代码,以便于开发人员阅读和理解。它可以用来查看和修改编译后的 Java 代码,帮助开发人员理解和分析代码中的实现细节和逻辑。

image.png

  • 商业代码审计工具:Fortify,Fortify 是一款用于代码安全性分析和漏洞检测的软件。它可以检测并报告代码中的潜在安全漏洞,如 SQL 注入、跨站点脚本攻击、不正确的输入验证、缓冲区溢出等。

image.png

  • 接口调试工具:Postman,Postman是一款流行的API开发工具,主要用于测试、开发和文档化API。它提供了一个用户友好的界面,使得开发人员和测试人员可以快速地构建、测试、调试和分享API。

image.png

进阶

Java代码审计的目的是为了发现代码中的漏洞,在发现之后就到了漏洞利用的阶段。编写合适的exp工具和漏洞的深度利用也是非常重要的,深层次的漏洞利用包含但不限于以下几点:

  • 反序列化回显:通过反序列化漏洞获取命令执行的结果,如通过报错,中间件等方式。
  • 反序列化内存马注入:通过反序列化注入内存webshell。
  • JavaFx编程:Java图形化编程框架,可用于漏洞利用工具开发。
作者:zhangy1da  创建时间:2023-03-27 21:03
最后编辑:zhangy1da  更新时间:2023-04-12 16:18