Java代码审计实战

978-7-115-65869-2
作者: 王月兵柳遵梁覃锦端刘聪
译者:
编辑: 杨绣国
分类: 其他

图书目录:

详情

本书是一部全面且深入的 Java 代码审计指南,旨在帮助读者掌握 Java Web 应用中常见安全漏洞的识别、 分析及防御技能。全书共分 4 篇,从基础到实战,系统地介绍 Java 代码审计的各个方面。 基础篇(第 1 章)主要介绍 Java Web 环境的搭建步骤、常见的动态调试方法以及代码审计工具的基本使 用方法,为后续的深入学习打下坚实基础。 入门篇(第 2 章~第 3 章)首先介绍 Java 代码审计中发现的常见漏洞,然后通过实战演练,以开源 Java 漏洞 靶场 Java-sec-code 为蓝本,运用知名代码审计工具 CodeQL 进行审计。 高级篇(第 4 章~第 6 章)分别针对 Java Web 开发中常见的 SSM、SSH 及 Spring Boot + MyBatis 等框架 进行详细介绍,并选取其中典型的框架漏洞进行深入剖析和调试分析。 实战篇(第 7 章)通过真实 Java Web 应用程序的审计案例,详细展示如何在实践中运用 CodeQL 等审计 工具快速发现并解决安全漏洞。 本书是一本集理论与实践于一体的 Java 代码审计宝典,适合软件开发工程师、网络运维人员、渗透测试 工程师、网络安全工程师及其他有志于从事网络安全工作的人员阅读学习。

图书摘要

版权信息

书名:Java代码审计实战

ISBN:978-7-115-65869-2

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


版  权

著    王月兵 柳遵梁 覃锦端 刘 聪

责任编辑 杨绣国

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

内 容 提 要

本书是一部全面且深入的Java代码审计指南,旨在帮助读者掌握Java Web应用中常见安全漏洞的识别、分析及防御技能。全书共分4篇,从基础到实战,系统地介绍Java代码审计的各个方面。

基础篇(第1章)主要介绍Java Web环境的搭建步骤、常见的动态调试方法以及代码审计工具的基本使用方法,为后续的深入学习打下坚实基础。

入门篇(第2章~第3章)首先介绍Java代码审计中发现的常见漏洞,然后通过实战演练,以开源Java漏洞靶场Java-sec-code为蓝本,运用知名代码审计工具CodeQL进行审计。

高级篇(第4章~第6章)分别针对Java Web开发中常见的SSM、SSH及Spring Boot + MyBatis等框架进行详细介绍,并选取其中典型的框架漏洞进行深入剖析和调试分析。

实战篇(第7章)通过真实Java Web应用程序的审计案例,详细展示如何在实践中运用CodeQL等审计工具快速发现并解决安全漏洞。

本书是一本集理论与实践于一体的Java代码审计宝典,适合软件开发工程师、网络运维人员、渗透测试工程师、网络安全工程师及其他有志于从事网络安全工作的人员阅读学习。

前  言

为什么要写这本书

随着信息技术的飞速发展,Java作为一种成熟、稳定且应用广泛的编程语言,已赢得了众多企业和开发者的青睐。然而,随着其应用范围的扩大,Java代码的安全性问题也日益受到关注。尤其是当Java代码作为企业应用程序的核心组成部分时,它常常承载着丰富的敏感数据和复杂的业务逻辑。一旦这些代码中存在安全漏洞,就可能给整个系统造成严重的损害。

在这样的背景下,如何在恶意攻击者利用Java代码可能存在的安全风险之前,提前发现并修复与Java应用相关的安全漏洞,已成为网络安全领域乃至整个软件开发行业从业人员必须高度关注的问题。代码审计作为一种通过详细审查源码来识别应用系统中潜在安全漏洞的方法,对于提升应用的安全等级至关重要。然而,这项技能目前尚未广泛普及,仅有少数安全领域的专业人员能够熟练掌握。因此,编写一本专注于代码审计,特别是针对Java代码审计的图书,显得尤为重要。

掌握Java代码审计技能,一方面,要深入理解常见的Java应用程序漏洞及其背后的原理,这是构建安全理论知识体系的基础;另一方面,也需要掌握漏洞挖掘的技巧和方法,这些通常需要通过不断的实践、摸索和总结才能获得。因此,Java代码审计技能是一项高度综合的技能,既强调理论知识的扎实,又注重实践能力的提升。

本书将大量篇幅聚焦于实践层面,详细阐述了漏洞调试和漏洞分析的过程。读者可以跟随作者的调试步骤逐步深入,从而加深对Java代码审计的理解。此外,本书的最后一章还特别提供了基于真实业务应用漏洞的Java代码审计案例。这部分实战化的内容旨在帮助读者更好地掌握Java代码审计技能,提升实际工作中的应对能力。

读者对象

本书主要面向如下读者:

软件开发工程师

网络运维人员

渗透测试工程师

网络安全工程师

其他有志于从事网络安全工作的人员

如何阅读本书

本书共分为4篇,循序渐进地介绍了Java代码审计过程中不可或缺的工具、技术及操作方法。如果你是有一定经验的安全从业人员,那么可以跳过本书的第一篇,从第二篇开始学习。如果你是一名初学者,最好是从第一篇开始,按章节顺序逐步学习。

第一篇为基础篇(第1章),主要介绍Java Web环境的搭建步骤、常见的动态调试方法以及代码审计工具的基本使用方法,为后续的深入学习打下坚实基础。

第二篇为入门篇(第2章~第3章),其中第2章主要介绍常见的Java漏洞类型以及代码审计要点和防御方法,帮助读者建立对Java安全漏洞的初步认知;第3章则通过实战演练,以开源Java漏洞靶场Java-sec-code为蓝本,运用知名代码审计工具CodeQL进行审计,旨在加深读者对Java漏洞的理解并熟练掌握CodeQL工具的使用。

第三篇为高级篇(第4章~第6章),分别针对Java Web开发中常见的SSM、SSH及Spring Boot + MyBatis等框架进行详细介绍,并选取其中典型的框架漏洞进行深入的调试分析,旨在提升读者对复杂Java Web应用安全性的理解和应对能力。

第四篇为实战篇(第7章),通过真实Java Web应用程序的审计案例,详细展示如何在实践中运用CodeQL等审计工具快速发现并解决安全漏洞。此篇不仅是对前面所学知识的综合运用,更是对读者实战能力的全面锻炼和提升。

勘误和支持

由于笔者的水平有限,虽然再三检查,书中仍难免出现不准确的地方,恳请读者批评指正。如果读者有任何建议或意见,欢迎发送邮件至penetration@mchz.com.cn。

资源与支持

资源获取

本书提供如下资源:

本书思维导图

异步社区7天VIP会员

要获得以上资源,扫描下方二维码,根据指引领取。

提交错误信息

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区(https://www.epubit.com),按书名搜索,进入本书页面,单击“发表勘误”按钮,输入错误信息,单击“提交勘误”按钮即可(见下图)。本书的作者和编辑会对您提交的错误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

与我们联系

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们。

如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

关于异步社区和异步图书

“异步社区”(www.epubit.com)是由人民邮电出版社创办的IT专业图书社区,于2015年8月上线运营,致力于优质内容的出版和分享,为读者提供高品质的学习内容,为作译者提供专业的出版服务,实现作者与读者在线交流互动,以及传统出版与数字出版的融合发展。

“异步图书”是异步社区策划出版的精品IT图书的品牌,依托于人民邮电出版社在计算机图书领域40余年的发展与积淀。异步图书面向IT行业以及各行业使用IT技术的用户。

基 础 篇

第1章 Java代码审计基础

在进行Java项目的代码审计工作之前,还有很多的准备工作,这些工作是我们能够顺利进行代码审计工作的基础。Java代码审计首先需要准备Java项目运行的基本环境,如JDK和Tomcat,在代码审计过程中,还需要了解一部分项目调试的方法,以便我们能更精确地理解整个项目的逻辑和定位可能的漏洞位置。除此之外,一些半自动化和自动化的代码审计工具也是代码审计过程中必不可少的辅助工具。因此,在本章中,首先介绍Java Web环境的搭建,包括JDK和Tomcat的安装与配置;然后介绍Java Web的常见动态调试方法,包括本地动态调试和远程动态调试;最后介绍几款常见代码审计工具的基本使用,如IDEA、SpotBugs、Fortify、CodeQL、Semgrep等。

1.1 Java Web环境的搭建

Java Web环境的搭建是进行代码审计的必要环节。本节主要介绍JDK和Tomcat的安装与配置。JDK是Java项目运行所需要的环境;Tomcat是Java项目运行时承载Java项目的容器。

1.1.1 JDK的安装与配置

JDK是Java 语言的软件开发工具包,是整个Java开发的核心,它包含Java的运行环境和Java工具。

在安装JDK之前,需要从Oracle官网下载JDK安装包。

打开Oracle官网下载JDK 8的页面,选择对应的操作系统版本进行下载,如图1-1所示。

图1-1 选择JDK 8对应的操作系统版本

本书以Windows 64位操作系统为例,选择与平台相对应的Windows x64 版本的jdk-8u341- windows-x64.exe超链接来下载JDK,如图1-2所示。

图1-2 下载Windows x64对应的JDK 8

运行JDK安装包,进入JDK安装向导页面,如图1-3所示。

图1-3 JDK安装向导页面

在向导页面单击“下一步”按钮,打开定制安装对话框,选择要安装的JDK组件,如图1-4所示。

图1-4 选择要安装的JDK组件

单击图1-4中的“更改”按钮,可以更改JDK的安装路径,如图1-5所示。这里采用默认的文件路径。

图1-5 更改JDK的安装路径

更改完成后,单击“确定”按钮,打开安装进度界面,如图1-6所示。

图1-6 安装进度界面

在安装过程中会打开目标文件夹界面,该界面提示应先安装JRE。选择JRE的安装路径,这里使用默认值,如图1-7所示。

图1-7 选择JRE的安装路径

单击“下一步”按钮,开始安装JRE,如图1-8所示。

图1-8 JRE安装进度界面

JRE安装完成之后,出现如图1-9所示的界面则表示JDK安装成功。

图1-9 JDK安装完成

在成功安装JDK之后,需要将JDK添加到系统环境中。以Windows 10系统为例,配置环境变量的具体步骤如下。

(1)在计算机屏幕上右击“此电脑”图标,在弹出的快捷菜单中选择“属性”选项,在弹出的系统界面中单击“高级系统设置”按钮。然后在弹出的“系统属性”对话框中选择“高级”选项卡,单击“环境变量”按钮,如图1-10所示。

图1-10 配置环境变量

(2)如图1-11所示,在弹出的“环境变量”对话框中单击“系统变量”列表框下方的“新建”按钮,此时会弹出“新建系统变量”对话框,新建一个名为“JAVA_HOME”的系统变量,且变量值为JDK的安装路径(此处为“C:\Program Files\Java\jdk1.8.0_341”)。最后单击“确定”按钮,保存“JAVA_HOME”变量。

图1-11 配置“JAVA_HOME”变量

(3)如图1-12所示,在“系统变量”列表框中选择“Path”变量,单击“编辑”按钮,此时会弹出“编辑环境变量”对话框,在Path变量值中添加“%JAVA_HOME%\bin”和“%JAVA_HOME%\jre\bin”,然后单击“确定”按钮,保存“Path”变量。

图1-12 配置“Path”变量

(4)如图1-13所示,单击“系统变量”列表框下方的“新建”按钮,在弹出的“新建系统变量”对话框中新建一个名为“CLASSPATH”的系统变量,其变量值为“.;%JAVA_HOME%\lib;%JAVA_ HOME%\lib\tools.jar”。最后单击“确定”按钮,保存“CLASSPATH”变量。

图1-13 配置“CLASSPATH”变量

(5)打开命令行终端,输入“java -version”命令,若得到如图1-14所示的输出信息,则说明JDK安装以及环境变量配置成功。

图1-14 JDK安装以及环境变量配置成功

1.1.2 Tomcat的安装与配置

Tomcat是一个开放源码的Web应用服务器。首先从Tomcat官网下载合适版本的Tomcat。

打开Tomcat官网下载页面,这里以下载Tomcat 8版本为例,如图1-15所示。

图1-15 Tomcat官网下载页面

选择与平台相对应的Windows x64 版本的64-bit Windows zip超链接,下载Tomcat,如图1-16所示。

图1-16 选择Tomcat版本

下载完成后,将该压缩包解压即可,如图1-17所示。

图1-17 解压Tomcat

成功解压Tomcat之后,需要将Tomcat添加到系统环境中。以Windows 10系统为例,配置环境变量的具体步骤如下。

(1)在计算机屏幕上右击“此电脑”图标,在弹出的快捷菜单中选择“属性”选项,在弹出的系统界面中单击“高级系统设置”按钮。然后在弹出的“系统属性”对话框中选择“高级”选项卡,再单击“环境变量”按钮,如图1-18所示。

图1-18 配置环境变量

(2)如图1-19所示,新建一个名为“CATALINA_HOME”的系统变量,且变量值为Tomcat的路径(此处为“C:\apache-tomcat-8.5.81”)。最后单击“确定”按钮,保存“CATALINA_HOME”变量。

图1-19 配置“CATALINA_HOME”变量

(3)如图1-20所示,在“系统变量”列表框中选择“Path”变量,单击“编辑”按钮,此时会弹出“编辑环境变量”对话框,在Path变量值中添加“%CATALINA_HOME%\bin”,然后单击“确定”按钮,保存“Path”变量。

图1-20 配置“Path”变量

(4)打开命令行终端,输入“startup”命令,若弹出如图1-21所示的Tomcat启动窗口,则说明Tomcat安装以及环境变量配置成功。

图1-21 Tomcat安装以及环境变量配置成功

打开浏览器,访问http://localhost:8080/,若得到如图1-22所示的界面,则说明Tomcat配置成功。

图1-22 Tomcat配置成功

接下来便可以创建Java Web项目了,如将如下代码保存在Tomcat的\webapps\ROOT目录下,并命名为“helloworld.jsp”文件。

<!DOCTYPE html>
<html>
   <head>
      <title>Hello World</title>   
   </head>
   <body>
   <script type="text/javascript">          
         document.write("Hello World")
   </script>
   </body>
</html>

在浏览器中访问http://localhost:8080/helloworld.jsp,可成功访问该Java Web项目,如图1-23所示。

图1-23 成功访问Java Web项目

1.2 Java Web动态调试方法

在完成对Java Web代码审计的环境搭建工作后,就可以开始对Java Web应用进行代码审计了。代码审计最基础的技术手段除了静态审计,还有动态调试。在Java代码审计工作中,动态调试技术是不可或缺的。相对静态审计技术来说,动态调试技术需要运行应用程序,并以设置断点的形式让程序执行到指定的位置,然后通过一步步调试来分析程序的逻辑、参数的传递、方法函数的调用等,从而寻找可能存在的漏洞。在实际的Java Web应用程序的代码审计工作中,动态调试一般可以分为两种场景:一种是在有Java Web应用程序源码的情况下,在本地使用IDEA等工具导入项目源码并运行进行动态调试,也称为本地动态调试;另一种则是在没有Java Web应用程序源码,只具备Java Web应用程序的运行环境(如Docker或应用程序jar包等)的情况下,可通过在本地构建应用程序依赖项并连接应用程序运行环境进行调试,这种调试称为远程动态调试。

1.2.1 本地动态调试

本地动态调试是比较容易操作的,因为在有项目源码,以及清晰完整的项目架构的情况下,只需要使用IDEA等工具导入项目包并设置断点,即可进行本地动态调试。

图1-24所示为一个基于SSM(Spring、SpringMVC、MyBatis)框架的简单Java Web项目,在Controller层调用删除账户方法的代码行(第39行)设置一个断点。

图1-24 简单Java Web项目

在IDEA中单击“调试”按钮开启动态调试,打开浏览器可以看到如图1-25所示的功能。

图1-25 Java Web项目功能示意

单击图1-25中的任意一个“删除”按钮,打开IDEA,可以看到程序在断点处(第39行)停下,并输出参数值以及方法调用栈等信息,如图1-26所示。

图1-26 程序运行到断点处

单击Step Into按钮(见图1-27中的箭头处),进行动态调试,跟进到了Service层的AccountServiceImpl接口实现类的deleteAccountById方法中,如图1-27所示。

图1-27 AccountServiceImpl.deleteAccountById方法

若继续跟进调试,则会调用Dao层的相关方法,在此不展开。动态调试相比静态审计的好处就是可以看到程序在运行之后,客户端执行的操作及参数在后端各层级的代码中是如何传递、调用的,这非常有利于代码审计者厘清程序逻辑。

1.2.2 远程动态调试

远程动态调试是对应于本地动态调试的一种调试技术,并非传统意义上的对远端应用进行调试。远程动态调试是在没有应用程序完整源码的情况下使用的调试手段。下面分别介绍常见的Docker环境下的远程动态调试和jar包文件远程动态调试。

1.Docker环境下的远程动态调试

在漏洞研究与挖掘过程中,Docker出现的频率非常高,Docker可以帮助安全研究人员快速搭建应用程序运行环境,从而大大提高漏洞研究的效率。在本节中,将基于Docker搭建一个存在CVE-2017-10271 WebLogic XMLDecoder反序列化漏洞的WebLogic应用程序环境,以介绍使用IDEA对Docker环境进行远程动态调试的方法。

Vulhub是一个基于Docker和Docker Compose的漏洞环境集合,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者专注于研究漏洞的原理。Vulhub中具备WebLogic各个历史漏洞所对应的环境,可以快速搭建起存在CVE-2017-10271漏洞的历史环境。首先将Vulhub克隆到本地的kali测试主机上,如图1-28所示。克隆命令如下。

git clone https://github.com/vulhub/vulhub.git

图1-28 克隆Vulhub环境

通过cd vulhub/weblogic/CVE-2017-10271/命令进入WebLogic CVE-2017-10271漏洞环境的目录中,并通过vim docker-compose.yml命令修改docker-compose.yml配置文件,开启配置项ports中的“8453:8453”远程调试端口,如图1-29所示。IDEA需要连接该调试端口才能进行远程动态调试。

图1-29 修改docker-compose.yml配置文件开启调试端口

修改上述配置后,通过运行docker-compose up -d命令即可下载并运行相应的Docker镜像环境,如图1-30所示。

图1-30 运行相应的Docker镜像环境

通过上述过程,已经成功搭建并启动了存在CVE-2017-10271漏洞的WebLogic应用程序环境,并开启了Docker环境远程调试端口。但是,对于WebLogic而言,如果想要对其进行动态调试,还需要开启WebLogic自身的调试模式。通过docker ps查询容器ID后可以使用下面的命令进入相应的容器Shell环境中。

docker exec -it c4347c88fe68 /bin/bash

如图1-31所示,成功获得了有WebLogic CVE-2017-10271漏洞环境的Shell环境。

图1-31 成功获得Shell

获得Shell后,即可通过编辑WebLogic应用程序的配置文件来开启调试模式,通过下面的命令编辑WebLogic配置文件。

vi /root/Oracle/Middleware/user_projects/domains/base_domain/bin/setDomainEnv.sh

并在配置文件中加入如下两行代码。

debugFlag="true"
export debugFlag

图1-32所示为修改后的WebLogic配置文件内容。

图1-32 修改后的WebLogic配置文件

保存修改后的WebLogic配置文件,通过exit命令退出容器Shell环境回到宿主机中。如图1-33所示,通过docker restart cve-2017-10271-weblogic-1命令重启相应的漏洞环境,使配置生效。

图1-33 重启漏洞环境

通过上述过程即可搭建起支持远程动态调试的WebLogic CVE-2017-10271漏洞环境,接下来需要通过下面的两条命令复制并打包Docker环境中的WebLogic应用程序目录文件。

docker cp cve-2017-10271-weblogic-1:/root ./weblogic_jars
tar czf weblogic_jars.tar.gz weblogic_jars/

如图1-34所示,将所需文件复制到宿主机中并打包。

图1-34 复制所需文件

将压缩包传输到安装了IDEA的调试主机上并解压,使用IDEA打开压缩包中待调试的Oracle\ Middleware\wlserver_10.3目录,如图1-35所示。

图1-35 使用IDEA打开待调试的目录

将Oracle\Middleware\目录下所有子目录中的jar包文件复制到同一个文件夹中,在Windows系统下可以直接在Oracle\Middleware\目录搜索.jar进行快速复制(如图1-36所示);或者在Linux/macOS下使用“find ./ -name *.jar -exec cp {} ./test/ \;”命令进行快速复制。

图1-36 复制jar包文件到同一个文件夹中

如图1-37所示,打开IDEA,选择File→Project Structure→Libraries选项,单击图1-37中框起来的“+”按钮,将上述存放了所有jar包的文件夹导入项目依赖中。

图1-37 导入项目依赖jar包

同时选择File→Project Structure→Project选项,将项目Java环境版本设置为源码包中自带的JDK 1.6环境,如图1-38所示。

图1-38 设置项目Java环境版本

接下来进行远程动态调试的连接配置,在IDEA中,单击Run→Edit Configurations按钮,添加一个“Remote JVM Debug”调试器。在图1-39所示的界面输入Docker漏洞环境的IP地址以及配置的调试端口,并配置项目路径。

图1-39 IDEA远程动态调试配置

保存上述配置,单击Debug按钮运行项目,若IDEA的Console窗口出现如图1-40所示的日志提示,则证明远程动态调试配置无误。

图1-40 日志提示

此时使用浏览器访问http://ip:7001,在上述配置无误的情况下则会出现如图1-41所示的WebLogic默认404页面。

图1-41 浏览器访问WebLogic页面

依据CVE-2017-10271 WebLogic XMLDecoder反序列化漏洞的触发特征,使用IDEA在/wlserver_ 10.3/server/lib/weblogic.jar!/weblogic/wsee/jaxws/WLSServletAdapter.class文件的126行设置断点,然后使用浏览器或Burp Suite请求链接http://ip:7001/wls-wsat/CoordinatorPortType。如图1-42所示,应用程序运行到上述断点位置后停止运行,并输出了当前位置的参数传递、方法调用栈等信息。

接下来就可以按照CVE-2017-10271漏洞的形成原因一步步进行调试,该漏洞后续的调试分析过程这里不再展开介绍。

图1-42 设置断点进行远程动态调试

2.jar包文件远程动态调试

除了Docker环境远程动态调试,在Java代码审计中还有一种场景比较常见,那就是获得了应用程序的可执行jar文件,需要对应用程序进行调试。这里以功能十分强大的Webshell管理工具——哥斯拉为例,展开对jar包文件远程动态调试的介绍。

首先下载哥斯拉工具的可执行jar文件,下载页面如图1-43所示。

图1-43 哥斯拉工具的下载页面

使用IDEA创建一个Java项目,然后在项目下新建一个文件夹,并将可执行jar文件复制到该文件夹中,如图1-44所示。该文件夹用于存放jar包文件。

图1-44 创建项目并复制jar文件

在放置了jar包的文件夹上右击,在弹出的快捷菜单中选择Add as Library选项,将该文件夹设置为项目依赖文件夹,单击OK按钮,如图1-45所示。

图1-45 将文件夹设置为项目依赖文件夹

上述设置完毕后,jar包即可展开,图1-46为展开的jar文件目录。

图1-46 展开的jar文件目录

接下来配置远程调试器,单击Add Configuration按钮,在弹出的对话框中单击“+”按钮,添加一个远程调试器“Remote JVM Debug”,如图1-47所示。

图1-47 添加一个远程调试器

配置远程调试器,使用默认设置(也就是Host设置为localhost,Port设置为5005),然后复制自动生成的启动参数(也就是“-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005”),如图1-48所示。

图1-48 配置远程调试器

将上述得到的启动参数进行拼接,得到如下启动哥斯拉jar文件的命令,使用cmd运行该命令启动哥斯拉工具,如图1-49所示。

java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 godzilla.jar

图1-49 启动哥斯拉工具

如图1-50所示,设置断点(第38行),开启调试,即可对哥斯拉jar文件进行动态调试。

图1-50 对哥斯拉jar文件进行动态调试

1.3 代码审计工具介绍

本节主要介绍在Java代码审计过程中常用的5种工具的安装和使用方法,包括Java集成开发环境IntelliJ IDEA,以及Java半自动化代码审计工具SpotBugs、Fortify、CodeQL、Semgrep。

1.3.1 IDEA

IntelliJ IDEA(简称IDEA)是Java编程语言的集成开发环境。IntelliJ IDEA在业界被广泛认为非常好用,尤其在智能代码助手、代码自动提示、代码分析、重构、JavaEE支持,以及集成各类版本控制系统等方面表现出色。

接下来介绍IntelliJ IDEA的使用,首先访问IntelliJ IDEA官网。IntelliJ IDEA官网下载页面如图1-51所示。IntelliJ IDEA有两个版本:Ultimate版本和Community版本。根据操作系统版本下载对应的IntelliJ IDEA程序。Ultimate版本只能免费试用30天,30天后须购买才能继续使用;Community版本可以免费试用。Ultimate版本适用于Web和企业开发,Community版本适用于JVM和Android开发。

图1-51 IntelliJ IDEA官网下载页面

这里下载免费的Community版本,待下载完成后运行IntelliJ IDEA Community安装程序,安装程序主界面如图1-52所示。

图1-52 IntelliJ IDEA Community安装程序主界面

根据自身需求安装IntelliJ IDEA Community,安装完成后运行IntelliJ IDEA Community程序,出现Welcome to IntelliJ IDEA界面,如图1-53所示。

图1-53 Welcome to IntelliJ IDEA界面

如图1-54所示,单击New Project按钮,再在New Project界面选择JDK安装路径,单击Create按钮即可新建一个IDEA项目。

图1-54 新建IDEA项目

接下来,将在IDEA中开发一个Java程序。如图1-55所示,右击src,在src下新建一个Package(包),Package命名为com.test。

图1-55 新建包

如图1-56所示,右击test,新建一个Test类。

图1-56 包下新建类

如图1-57所示,在Test类中编写一个输出“Hello World!”的主函数。

图1-57 在Test类中编写主函数

代码编写完成后,单击Run 'Test.java',IDEA运行Test.java并输出结果,如图1-58所示。

图1-58 运行主函数并输出结果

1.3.2 SpotBugs

SpotBugs是一款通过静态分析查找Java代码中存在的安全问题的工具,它是FindBugs的继承者。FindBugs是一款优秀的Java代码审计工具,但FindBugs在2016年后就已经停止更新。SpotBugs需要JDK 1.8.0或更高版本才能运行。在SpotBugs中,存在着十余种用于检测代码安全问题的检测器。

接下来介绍SpotBugs的使用。SpotBugs可通过IDEA插件方式安装,在IDEA中,选择File菜单,如图1-59所示。

图1-59 选择File菜单

在图1-59中选择Settings选项,IDEA中会出现插件安装界面,该界面如图1-60所示。

图1-60 插件安装界面

在插件搜索框中搜索“SpotBugs”,搜索结果如图1-61所示,单击Install按钮即可安装SpotBugs插件。

图1-61 搜索SpotBugs插件的结果

待SpotBugs插件安装完成后,需对SpotBugs插件进行配置,选择Tools下的SpotBugs选项,如图1-62所示。

图1-62 配置SpotBugs插件

如图1-63所示,单击Plugins插件栏的加号按钮,选择Add Find Security Bugs选项添加SpotBugs插件。

图1-63 添加SpotBugs插件

选择图1-63中的Detector选项卡,进入Detector配置界面(如图1-64所示),选择Bug Category选项,选中Malicious code vulnerability和Security复选框。

图1-64 Detector配置界面

接下来选择Report选项卡,进入Report配置界面(如图1-65所示),在该界面仍然选中Malicious code vulnerability和Security复选框。

图1-65 Report配置界面

选择完成后,单击Apply按钮即可将SpotBugs插件配置完成,如图1-66所示。

图1-66 SpotBugs插件配置完成

配置完成后,右击需审计的Java项目目录,在弹出的快捷菜单中选择Analyze Project Files Including Test Sources选项,等待插件运行完成,如图1-67所示。

图1-67 运行SpotBugs插件

插件运行完成后,在IDEA的SpotBugs栏将出现安全扫描报告(如图1-68所示),单击报告即可查看存在安全问题的代码位置。

图1-68 安全扫描报告

1.3.3 Fortify

Fortify是Micro Focus公司旗下的一款静态白盒代码审计工具,Fortify先通过内置的五大主要分析引擎,即数据流、语义、结构、控制流、配置流对应用软件源码进行静态的安全分析,然后通过自带安全漏洞规则集对源码进行安全问题匹配、查找,并将源码中可能存在的安全问题扫描出来。Fortify支持导出报告。

接下来介绍Fortify的使用。Fortify官网下载界面如图1-69所示,下载后可以免费试用15天。

图1-69 Fortify官网下载界面

Fortify安装完成后,进入它的目录(如图1-70所示),找到并运行auditworkbench.cmd文件即可启动Fortify。

图1-70 Fortify目录

Fortify启动后,其主界面如图1-71所示,单击Scan Java Project,即可对Java项目进行代码审计。

图1-71 Fortify主界面

在如图1-72所示的界面中,选择一个Java项目文件夹。

图1-72 选择Java项目文件夹

待Java文件夹选择完毕后,界面中会出现Java源码版本选择框,选择Java源码版本后单击OK按钮,如图1-73所示。

图1-73 选择Java源码版本

进入Audit Guide Wizard界面,在该界面根据Java项目实际情况选择相关选项后,单击Scan按钮即可开始对Java项目进行代码审计,如图1-74所示。

图1-74 根据Java项目实际情况选择相关选项

等待Java代码审计完成后,界面中将出现Java项目存在的安全问题,如图1-75所示。

图1-75 Java项目存在的安全问题

选择一个安全问题,Fortify界面将展示漏洞位置及漏洞触发过程,如图1-76所示。

图1-76 展示漏洞位置及漏洞触发过程

1.3.4 CodeQL

CodeQL是一款支持Go、Java、JavaScript、Python、Ruby、C/C++等编程语言的静态代码分析工具,研究人员可通过使用CodeQL自带的QL语言规则文件进行漏洞检测,也可以自行编写QL语言规则文件进行漏洞检测。

接下来介绍CodeQL的使用,CodeQL下载页面如图1-77所示,可根据操作系统版本选择下载的codeql-cli版本。

图1-77 CodeQL下载页面

创建一个新的文件夹CodeQl,将下载的codeql-cli压缩包文件解压至该文件夹。图1-78为解压后的文件目录。

图1-78 codeql-cli文件目录

如图1-79所示,将CodeQl\codeql添加至环境变量。

图1-79 将CodeQl\codeql添加至环境变量

重启cmd,在cmd中执行codeql,出现图1-80所示的提示代表环境变量添加成功。

图1-80 成功添加环境变量

随后访问图1-81所示的页面,下载CodeQL源文件。

图1-81 CodeQL源文件下载页面

将下载的CodeQL源文件压缩包解压至CodeQl,并重命名为ql,图1-82所示为ql文件目录。

图1-82 ql文件目录

访问图1-83所示的页面,根据操作系统版本下载并安装Visual Studio Code。

图1-83 Visual Studio Code下载页面

安装完成后,启动Visual Studio Code,其主界面如图1-84所示。

图1-84 Visual Studio Code主界面

如图1-85所示,单击扩展按钮,搜索CodeQL插件并安装。

图1-85 搜索CodeQL插件并安装

安装插件后,单击资源管理器按钮,在Visual Studio Code中将CodeQL源文件夹打开并导入源文件,如图1-86所示。

图1-86 导入CodeQL源文件

接下来通过codeql-cli创建CodeQL审计数据库,在本案例中,创建的是java-sec-code项目审计数据库,java-sec-code是一个非常适合学习Java漏洞代码的强大且友好的项目。访问图1-87所示的页面,下载java-sec-code项目。

图1-87 java-sec-code项目下载页面

将下载后的java-sec-code压缩包解压,图1-88所示为其文件目录。

图1-88 java-sec-code文件目录

运行cmd命令,执行图1-89所示的代码,进入java-sec-code项目目录。

图1-89 执行代码

执行如下代码,编译java-sec-code项目并创建CodeQL审计数据库,如图1-90所示。

codeql database create java-database -l=java -c="mvn clean install -Dmaven.test.skip=true"

图1-90 创建CodeQL审计数据库

图1-91代表创建CodeQL审计数据库成功。

图1-91 创建CodeQL审计数据库结果

如图1-92所示,在Visual Studio Code中单击CodeQL按钮,再单击From a folder按钮,导入创建的CodeQL审计数据库。图1-93代表导入CodeQL审计数据库成功。

图1-92 Visual Studio Code导入CodeQL审计数据库

图1-93 Visual Studio Code成功导入CodeQL审计数据库的界面

CodeQL源文件中有自带的Java代码审计规则文件(如图1-94所示),访问ql\java\ql\src\Security\ CWE,访问结果的各个文件夹中存在Java代码审计规则文件。

图1-94 CodeQL源文件中的Java代码审计规则文件

在Visual Studio Code中单击资源管理器按钮,再访问ql\java\ql\src\Security\CWE\CWE-611目录,访问结果如图1-95所示,该文件夹中存在XXE漏洞审计规则文件XXE.ql。

图1-95 访问结果

如图1-96所示,打开XXE.ql文件,右击文件界面,在弹出的快捷菜单中选择CodeQL:Run Query on Selected Database选项,运行XXE.ql文件。

图1-96 运行XXE.ql文件

XXE.ql文件的运行结果如图1-97所示,可以看到,CodeQL审计出java-sec-code项目中存在8个XXE漏洞。

图1-97 XXE.ql文件运行的结果

选择某个XXE漏洞,代码中将高亮显示该漏洞,如图1-98所示。

图1-98 高亮显示XXE漏洞

1.3.5 Semgrep

Semgrep是一款快速、开源的静态代码分析工具,是基于Facebook开源SAST工具pfff中的sgrep组件开发的,它同时支持正则匹配和AST分析两种模式。Semgrep支持C#、Go、Java、JavaScript、PHP、Python、Ruby等20多种语言的静态代码分析。

接下来介绍Semgrep的使用。在Linux操作系统上执行如下代码安装Semgrep模块。

python3 -m pip  install semgrep

安装该模块的过程如图1-99所示。

图1-99 Linux操作系统上安装Semgrep模块的过程

待Semgrep模块安装完成后,执行如下命令。

semgrep -h

如果出现如图1-100所示的信息,代表Semgrep模块安装成功。

图1-100 Semgrep模块安装成功

访问图1-101所示的网址,该网站中提供了Semgrep审计规则集。

图1-101 Semgrep审计规则集页面

在图1-102所示的页面将Language选择为Java,将会展示Java语言的314条Semgrep审计规则集。

图1-102 Java语言的Semgrep审计规则集页面

单击图1-103所示页面中的“show all”,将展示所有Semgrep审计规则集合。图1-104所示为寻找到owasp-top-ten规则集合。

图1-103 所有Semgrep审计规则集合页面

图1-104 owasp-top-ten规则集合页面

图1-105所示为获得owasp-top-ten规则集合路径p/owasp-top-ten。

图1-105 owasp-top-ten规则集合路径页面

在本案例中,仍选择java-sec-code项目进行代码审计,在Linux中执行图1-106所示的命令,将java-sec-code项目下载到本地。

图1-106 在Linux系统执行命令

执行图1-107中框起来的命令,通过Semgrep的owasp-top-ten规则集合对java-sec-code项目代码进行安全审计。

图1-107 审计java-sec-code项目

审计结果如图1-108所示,Semgrep标注出java-sec-code项目代码中存在的安全问题。

图1-108 审计java-sec-code项目的结果

相关图书

Joy RL:强化学习实践教程
Joy RL:强化学习实践教程
计算机组成原理(基于x86-64架构)
计算机组成原理(基于x86-64架构)
DeepSeek极速上手 :高效做事不内耗
DeepSeek极速上手 :高效做事不内耗
AI高手速成 DeepSeek让你工作变轻松
AI高手速成 DeepSeek让你工作变轻松
高并发系统:设计原理与实践
高并发系统:设计原理与实践
秒懂AI辅助论文写作
秒懂AI辅助论文写作

相关文章

相关课程