点击上方“凌天实验室”可订阅哦!
信息安全的75%发生在web应用而非网络层。
本篇内容涉及Java Web安全-代码审计,非战斗人员速速离开。
1. 何为代码审计?
通俗的说Java代码审计就是通过审计Java代码来发现Java应用程序自身中存在的安全问题,由于Java本身是编译型语言,所以即便只有class文件的情况下我们依然可以对Java代码进行审计。对于未编译的Java源代码文件我们可以直接阅读其源码,而对于已编译的class或者jar文件我们就需要进行反编译了。
Java代码审计其本身并无多大难度,只要熟练掌握审计流程和常见的漏洞审计技巧就可比较轻松的完成代码审计工作了。但是Java代码审计的方式绝不仅仅是使用某款审计工具扫描一下整个Java项目代码就可以完事了,一些业务逻辑和程序架构复杂的系统代码审计就非常需要审计者掌握一定的Java基础并具有具有一定的审计经验、技巧甚至是对Java架构有较深入的理解和实践才能更加深入的发现安全问题。
本文将分为多章节来讲述Java代码审计需要掌握的前置知识以及Java代码审计的流程、技巧。
2. 准备环境和辅助工具
在开始Java代码审计前请自行安装好Java开发环境,建议使用MacOS、Ubuntu操作系统。
所谓“工欲善其事,必先利其器”,合理的使用一些辅助工具可以极大的提供我们的代码审计的效率和质量!
强烈推荐下列辅助工具:
Jetbrains IDEA(IDE)
Sublime text(文本编辑器)
JD-GUI(反编译)
Fernflower(反编译)
Bytecode-Viewer
Eclipse(IDE)
NetBeans(IDE)
在渗透测试的时候需要审计的代码通常是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编译执行流程
Test.java 源码、字节码
由于class文件的可读性较差,通常我们需要使用Java反编译工具来反编译代码。我们通常会使用到JD-GUI、IDEA Fernflower插件、Bytecode-Viewer、Fernflower、JAD、JBE、JEB 等工具来反编译class。
其中JD-GUI
可能是目前反编译中使用的最多的工具了,但是个人觉得JD-GUI
的反编译能力远不如经过IDEA
(IDEA应该是使用的改版后的Fernflower
),因为IDEA
默认支持对jar
和class
的反编译,所以我个人强烈推荐使用IDEA
来反编译class代码。
当然,反编译工具很多时候也不是万能的,JD-GUI
经常遇到无法反编译或反编译过程中程序直接崩溃的情况,遇到这类情况我们通常可以使用IDEA
反编译试试,如果IDEA
也无法反编译可以使用JBE
来加载class文件
读取程序的字节码,如果JBE
仍无法读取类信息还可以使用JDK
自带的javap命令
来读取class类字节码
,如果上诉所有的方法都无法反编译,那么恐怕是这个类本身就存在无法编译问题要么可能就是类文件被加密处理过。可能你会说java编译的class不是说不可以加密吗?没错,这里所说的加密其实是为了保护编译后的class代码不可反编译,通过实现自定义ClassLoader
来loadClass
加密后的类方式而已,这种加密方式曾在实战中也有遇到。
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
提供了直接反编译的class
、jar
、zip
、apk
、dex
功能,直接拖拽jar就可以直接对整个jar进行反编译了。
2.5. Find命令
find
命令并不能支持Java反编译,但是find
命令可以非常方便的搜索经过编译后的二进制文件中的内容,所以有的时候使用find
命令通常是最简单实用的,直接解压jar包然后使用find命令搜索: find ./ -type f -name “*.class” |xargs grep XXXX
即可搞定。
当我们只有项目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
反编译了。
依赖的jar: javaweb-decomplier、Intellij java-decompiler。
3. IntelliJ IDEA 推荐
IntelliJ IDEA
是Jetbrains
出品的一款非常强大的Java IDE
,IDEA提供了强大的代码搜索、近乎完美的反编译、动态调试等功能可以最大程度的辅助我们代码审计。
不可以否认,与IDEA相比虽然Eclipse和Netbeans也有与之类似的功能,但是在真正的实战体验中个人更倾向于使用IDEA,虽然曾经的我也是一个重度Eclipse开发者。
IDEA的搜索快捷键是 :⇧⌘F
,使用IDEA提供的搜索功能可以非常快速的定位漏洞点信息。
IDEA可以通过自定义搜索范围来精确查找我们需要审计的代码。默认搜索的是所有的位置,不过我们可以点击红色箭头指向的...
按钮来细化我们的搜索范围。
1. 自定义范围搜索
自定义搜索范围示例:
自定义搜索范围后就可以在搜索时使用自定义的配置进行范围搜索了,有助于我们在挖漏洞的时候缩小代码定位范围。
2. 标记搜索
搜索快捷键: ⌘O
,标记搜索支持类名
、方法名
搜索(包括class或jar文件
中的方法也支持搜索)。
3. Java调用链搜索
当我们审计代码的时候发现某个方法或类有漏洞时我们需要定位到漏洞的请求地址(触发点),复杂业务系统往往会让我们很难定位到漏洞的触发点。借助IDEA的方法调用链搜索功能就可以很轻松的找出方法的调用链和触发点。
选择类或者方法名
-->右键
-->Find Useages
或者使用快捷键⌥F7
未完待续
更多精彩内容,请听下回分解~
预告:
四、Java Web基础
五、Java语言的动态性
.
.
.
微信扫一扫
关注该公众号