Java Web安全-代码审计(一)

一、JavaWeb安全基础

1. 何为代码审计?

通俗的说Java代码审计就是通过审计Java代码来发现Java应用程序自身中存在的安全问题,由于Java本身是编译型语言,所以即便只有class文件的情况下我们依然可以对Java代码进行审计。对于未编译的Java源代码文件我们可以直接阅读其源码,而对于已编译的class或者jar文件我们就需要进行反编译了。

Java代码审计其本身并无多大难度,只要熟练掌握审计流程和常见的漏洞审计技巧就可比较轻松的完成代码审计工作了。但是Java代码审计的方式绝不仅仅是使用某款审计工具扫描一下整个Java项目代码就可以完事了,一些业务逻辑和程序架构复杂的系统代码审计就非常需要审计者掌握一定的Java基础并具有具有一定的审计经验、技巧甚至是对Java架构有较深入的理解和实践才能更加深入的发现安全问题。

本文将分为多章节来讲述Java代码审计需要掌握的前置知识以及Java代码审计的流程、技巧。

2. 准备环境和辅助工具

在开始Java代码审计前请自行安装好Java开发环境,建议使用MacOS、Ubuntu操作系统。

所谓“工欲善其事,必先利其器”,合理的使用一些辅助工具可以极大的提供我们的代码审计的效率和质量!

强烈推荐下列辅助工具:

  1. Jetbrains IDEA(IDE)
  2. Sublime text(文本编辑器)
  3. JD-GUI(反编译)
  4. Fernflower(反编译)
  5. Bytecode-Viewer
  6. Eclipse(IDE)
  7. NetBeans(IDE)
2

二、反编译技巧

在渗透测试的时候需要审计的代码通常是class文件或者jar包,那么我们应该如何审计呢?让我们先来学习一下什么是Java源码和字节码。

1. Java类编译与反编译基础

简单的说Java源码就是未经编译的.java文件,我们可以很轻松的阅读其中的代码逻辑,而字节码.class文件则是.java文件经过编译之后产生的字节码文件,因为.class文件是编译后的二进制文件所以我们是无法直接阅读的,只能通过反编译工具将二进制文件转换成java代码或者ASM代码

示例代码Test.java:

/**
 * @author yz
 */
public class Test {

	public static void hello() {
		System.out.println("Hello~");
	}

	public void world() {
		System.out.println("World!");
	}

	public static void main(String[] args) {
		hello();
	}

}

Test.java编译执行流程:

3

Test.java 源码、字节码

4

由于class文件的可读性较差,通常我们需要使用Java反编译工具来反编译代码。我们通常会使用到JD-GUIIDEA Fernflower插件Bytecode-ViewerFernflowerJADJBEJEB 等工具来反编译class。

其中JD-GUI可能是目前反编译中使用的最多的工具了,但是个人觉得JD-GUI的反编译能力远不如经过IDEA(IDEA应该是使用的改版后的Fernflower),因为IDEA默认支持对jarclass的反编译,所以我个人强烈推荐使用IDEA来反编译class代码。

当然,反编译工具很多时候也不是万能的,JD-GUI经常遇到无法反编译或反编译过程中程序直接崩溃的情况,遇到这类情况我们通常可以使用IDEA反编译试试,如果IDEA也无法反编译可以使用JBE来加载class文件读取程序的字节码,如果JBE仍无法读取类信息还可以使用JDK自带的javap命令来读取class类字节码,如果上诉所有的方法都无法反编译,那么恐怕是这个类本身就存在无法编译问题要么可能就是类文件被加密处理过。可能你会说java编译的class不是说不可以加密吗?没错,这里所说的加密其实是为了保护编译后的class代码不可反编译,通过实现自定义ClassLoaderloadClass加密后的类方式而已,这种加密方式曾在实战中也有遇到。

2. 反编译整个Jar技巧

通常我们在某些特殊的场景下拿到的只是jar文件,那么我们应该如何反编译整个jar包的class文件呢?

2.1. Fernflower

Fernflower可以很轻松的实现jar的完整反编译,执行如下命令即可: java -jar fernflower.jar jarToDecompile.jar decomp/ 其中jarToDecompile.jar是需要反编译的jar文件,decomp是反编译后的class文件所存放的目录。需要注意的是Fernflower如遇无法反编译的情况可能会生成空的java文件!

2.2. JD-GUI

JD-GUI是一个带GUI的反编译工具,在JD-GUI的菜单中点击File–>Save All Sources即可反编译jar。

2.3. IDEA

IDEA默认就支持jar包反编译,同时还支持class文件名(⇧⌘F)、类方法名称(⇧⌘O)搜索。

2.4. Bytecode-Viewer

FernFlower提供了GUI版本Bytecode-Viewer,Bytecode-Viewer提供了直接反编译的classjarzipapkdex功能,直接拖拽jar就可以直接对整个jar进行反编译了。

4.1

2.5. Find命令

find命令并不能支持Java反编译,但是find命令可以非常方便的搜索经过编译后的二进制文件中的内容,所以有的时候使用find命令通常是最简单实用的,直接解压jar包然后使用find命令搜索: find ./ -type f -name “*.class” |xargs grep XXXX 即可搞定。

2.6 使用Find命令和Fernflower实现批量反编译jar

当我们只有项目war包且源码经过打包后发布到WEB-INF/lib的情况下,我们不得不去找出待审计源码的具体jar文件并反编译。遇到这种情况我们可以巧妙的使用find命令来反编译所有目标的jar包。

这里以jcms的一个非常老版本为例,jcms最终给客户部署的war包中源码并不是在WEB-INF/classes目录下,而是将整个jcms系统按模块打包成了多个jar包放在了WEB-INF/lib目录下。我们可以通过搜索com.hanweb包名称来找出所有jar中包含了jcms的文件并通过Fernflower来反编译。

java -jar /Users/yz/Desktop/javaweb-decomplier/javaweb-decomplier.jar -dgs=1 $(find /Users/yz/Desktop/jcms/WEB-INF/lib/ -type f -name "*.jar" |xargs grep "com.hanweb" |awk '{print $3}') /Users/yz/jcms-decomplier

执行上面的命令后会在jcms-decomplier目录下看到所有的jar已经被Fernflower反编译了。

4.2

依赖的jar: javaweb-decomplierIntellij java-decompiler

3. IntelliJ IDEA 推荐

IntelliJ IDEAJetbrains出品的一款非常强大的Java IDE,IDEA提供了强大的代码搜索、近乎完美的反编译、动态调试等功能可以最大程度的辅助我们代码审计。

不可以否认,与IDEA相比虽然Eclipse和Netbeans也有与之类似的功能,但是在真正的实战体验中个人更倾向于使用IDEA,虽然曾经的我也是一个重度Eclipse开发者。

三、IDEA代码搜索技巧

IDEA的搜索快捷键是:⇧⌘F,使用IDEA提供的搜索功能可以非常快速的定位漏洞点信息。

5

IDEA可以通过自定义搜索范围来精确查找我们需要审计的代码。默认搜索的是所有的位置,不过我们可以点击红色箭头指向的...按钮来细化我们的搜索范围。

1. 自定义范围搜索

6

自定义搜索范围示例:

7

自定义搜索范围后就可以在搜索时使用自定义的配置进行范围搜索了,有助于我们在挖漏洞的时候缩小代码定位范围。

8

2. 标记搜索

搜索快捷键: ⌘O,标记搜索支持类名方法名搜索(包括class或jar文件中的方法也支持搜索)。

9

3. Java调用链搜索

当我们审计代码的时候发现某个方法或类有漏洞时我们需要定位到漏洞的请求地址(触发点),复杂业务系统往往会让我们很难定位到漏洞的触发点。借助IDEA的方法调用链搜索功能就可以很轻松的找出方法的调用链和触发点。

选择类或者方法名–>右键–>Find Useages或者使用快捷键⌥F7

10

未完!更多精彩内容,请听下回分解~

本文来自凌天实验室,经授权后发布,本文观点不代表ABSEC 安全资讯平台立场,转载请联系原作者。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

评论列表(2条)

  • H4CK3R 2019年2月28日 下午1:26

    有后续吗?期待大佬更新后续!

    • abseo 回复 H4CK3R 2019年6月25日 下午2:43

      后续已更新可移步凌天实验室公号查看

联系我们

010-61943626

在线咨询:点击这里给我发消息

邮件:marketing@anbai.com

工作时间:电话:周一至周五,10:00-18:30,节假日休息,邮件随时发哦~