从1开始的Java代码审计·第一弹·基础篇(上)

基本环境

JDK

目前,JDK已经出到11了,JDK每个版本都会有些新特性出来。很多情况下JDK并不向下兼容,导致一些软件在较新的JDK中无法正常运行,所以推荐用现在比较主流的JDK8。而且有些漏洞需要在低版本的JDK上才能复现出来,比如反序列化用到的JNDI Bean Property类型的Gadget,需要在小于JDK8_113的版本下才可以利用,所以在安装的时候建议再安装一个低版本的JDK。JDK安装时自带的控制面板程序,可以帮助我们很方便的切换版本。

jdk-ctl

IDE

做任何一门语言的代码审计,一个强大的IDE是必不可少的,好的IDE可以极大提高我们审计的效率。写Java的程序及代码审计,我推荐使用JetBrains家的Intelij IDEA(JB大法好 O(∩_∩)O ),内置的代码检查工具比Eclipse强太多了,而且有很多的插件支持。

数据库

常见的数据库有 MySQL、PostgreSQL、Oracle,除此之外还有现在比较流行的非关系型数据库 Redis、Mongodb、Memcached 等等,有些数据库安装起来可能比较麻烦,不用一次性装完,有需要的时候再去装就行了。

Web 容器

Java Web应用在开发完后,通常会以war包的形式发布,我们需要把这个war包部署到自己的Web容器(也可以说是Web服务器)里去,容器在启动后会自动解压war包,处理用户发来的HTTP请求,将jsp编译成servlet,管理servlet的整个生命周期。

常见的 Web 容器有 Tomcat,JBoss,Jetty,Weblogic,不同的容器在功能、性能上有所差异,但仅仅是做代码审计用Tomcat就足够了。


插件

依赖检查

一个完整的Java项目,必然会引入一些外部的第三方库。这些库如果出了安全漏洞,会给应用带来巨大的风险。比如经常爆洞的struts2,以及最近几年很火的Java反序列化漏洞相关的fastjson,jackson,apache-commons-collections等等。如果开发者在开发的时候,没有对引入的库做安全检查,或者是直接从代码库里拉出来的依赖配置,那么很可能会引入过时了很久的库版本,带来安全隐患。在 OWASP TOP10 中有讲到这一类型的安全风险。

参考 OWASP TOP10 A9

推荐一个工具,OWASP 出的 Dependency_Check,可以自动帮我们检查,引入的第三方库是否有已知的安全漏洞。

使用方法

插件模式

作为 maven 的插件使用,用法很简单,直接在项目的 pom.xml 写入

1
2
3
4
5
6
7
8
9
10
11
12
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>3.3.2</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
然后,执行 `mvn verify` 就可以了。

命令行模式

我更喜欢以独立的命令行模式来运行,这样就不用进IDE额外修改 pom.xml 配置了。

  1. 进入项目的github,DependencyCheck,找到最新的那版,下载下来。

  2. 解压出来,进到bin目录,有两个文件,分别对应windows版和linux版。

bin目录

  1. 进到命令行下,执行 dependency-check.bat --project 项目名 --out 输出名 -s 源码路径 即可,程序会自动从NVD更新漏洞库,所以需要点时间(应该还要翻墙)。

执行过程

  1. 扫描完毕后,会输出一份报告,如下:

扫描结果

FindSecBugs

FindSecBugs 是专门用于检测Java Web应用安全漏洞的插件,支持多种IDE,还可以和SonarQube等代码分析平台集成。

使用方法

安装方法官网讲的很详细了,IDEA中安装FindSecBugs

这里主要讲IDEA中如何使用FindSecBugs

IDEA打开要审计的项目以后,先点开 FindBugs-IDEA 标签,然后点左边的这个带绿色旗帜的文件夹logo,插件就会自动对项目进行审计。

开始扫描

扫描结果

看这个项目的扫描结果,发现了 5 处安全bug,其中四处是文件的操作可能被用户控制,造成任意文件删除。当然,这也可能是误报,需要人工来再次确认。不过,这已经给我们的审计工作带来了很大的便利了(。^▽^)。

抓包改包

做Java Web审计时,可能要结合黑盒的方法,动态调试。这时候就需要抓包改包的工具,发送自定义的HTTP包。这个功能很多工具都有,burpsuite,zap,postman,fiddler都可以用。

文章目录
  1. 1. 基本环境
    1. 1.1. JDK
    2. 1.2. IDE
    3. 1.3. 数据库
    4. 1.4. Web 容器
  2. 2. 插件
    1. 2.1. 依赖检查
      1. 2.1.1. 使用方法
        1. 2.1.1.1. 插件模式
        2. 2.1.1.2. 命令行模式
    2. 2.2. FindSecBugs
      1. 2.2.1. 使用方法
    3. 2.3. 抓包改包
|