一个Java自动代码审计工具,尤其针对Spring框架,也可自行改造以适配其他情况
提供一个SpringBoot的Jar包即可进行自动代码审计,底层技术基于字节码分析
能够生成跨越接口和实现的方法调用关系图(CallGraph)并模拟JVM栈帧实现简单的数据流分析
注意:该工具不能确定存在漏洞,只能证明某条调用链上存在危险操作,所以建议结合人工做进一步分析
支持漏洞类型:
- SQL注入检测
- 服务器端请求伪造漏洞检测
- XML外部实体注入漏洞检测
- 远程命令执行漏洞检测
- 针对Java的拒绝服务漏洞检测
- URL重定向漏洞检测
- 日志注入漏洞检测
示例:针对我写好的 靶机 进行SSRF漏洞的检测
配置靶机下载地址:CIDemo
命令:java -jar SpringInspector.jar cidemo.jar --springboot --package org.sec --module SSRF
该工具扫描速度极快,只需要几秒,将会扫描到以下四条链
......
14:03:55 [INFO] [SSRFService] start analysis ssrf
14:03:55 [INFO] [SSRFService] detect jdk ssrf
JDK SSRF
org/sec/cidemo/web/SSRFController.ssrf1
org/sec/cidemo/service/SSRFService.ssrf1
org/sec/cidemo/service/impl/SSRFServiceImpl.ssrf1
14:03:55 [INFO] [SSRFService] detect apache ssrf
Apache SSRF
org/sec/cidemo/web/SSRFController.ssrf2
org/sec/cidemo/service/SSRFService.ssrf2
org/sec/cidemo/service/impl/SSRFServiceImpl.ssrf2
14:03:55 [INFO] [SSRFService] detect socket ssrf
Socket SSRF
org/sec/cidemo/web/SSRFController.ssrf3
org/sec/cidemo/service/SSRFService.ssrf3
org/sec/cidemo/service/impl/SSRFServiceImpl.ssrf3
14:03:55 [INFO] [SSRFService] detect okhttp ssrf
Okhttp SSRF
org/sec/cidemo/web/SSRFController.ssrf4
org/sec/cidemo/service/SSRFService.ssrf4
org/sec/cidemo/service/impl/SSRFServiceImpl.ssrf4
......
可选参数说明
参数 | 参数说明 | 参数类型 | 是否必须 |
---|---|---|---|
xxx.jar | 检测Jar文件路径 | String | 是 |
--springboot | 针对SpringBoot对Jar进行分析 | Boolean | 是 |
--package | 设置SpringBoot项目的包名 | String | 是 |
--module | 设置使用的检测模块(可包含多个) | String | 否 |
--debug | 设置使用调试模式(保存一些临时数据) | Boolean | 否 |
--jdk | 加入JDK中的rj.jar进行分析(可能耗时) | Boolean | 否 |
--all | 加入SpringBoot的其他依赖(可能耗时) | Boolean | 否 |
--output | 漏洞报告输出文件(默认result.txt) | String | 否 |
注意:
- 其中类型为
String
的需要在flag
之后加入字符串参数(例如--package org.sec
) - 类型为
Boolean
直接加入flag
即可(例如--debug
或--jdk
) - 项目包名参数必须设置(例如
org.sec
或com.xxx
等) - 可选检测模块用
|
分割可包含多个(例如--module SSRF|SQLI
)
开启检测模块关键字:SQLI
Sink类 | Sink方法 |
---|---|
java/sql/Statement | execute |
java/sql/Statement | executeQuery |
java/sql/Statement | executeUpdate |
org/springframework/jdbc/core/JdbcTemplate | update |
org/springframework/jdbc/core/JdbcTemplate | execute |
org/springframework/jdbc/core/JdbcTemplate | query |
org/springframework/jdbc/core/JdbcTemplate | queryForStream |
org/springframework/jdbc/core/JdbcTemplate | queryForList |
org/springframework/jdbc/core/JdbcTemplate | queryForMap |
org/springframework/jdbc/core/JdbcTemplate | queryForObject |
检测说明:
- Source是Controller输入的String型请求参数
- 该参数通过字符串拼接得到了SQL语句
- SQL语句进入了Sink方法
开启检测模块关键字:XXE
Sink类 | Sink方法 |
---|---|
org/jdom2/input/SAXBuilder | build |
javax/xml/parsers/SAXParser | parse |
javax/xml/transform/sax/SAXTransformerFactory | newTransformerHandler |
javax/xml/validation/SchemaFactory | newSchema |
javax/xml/transform/Transformer | transform |
javax/xml/validation/Validator | validate |
org/xml/sax/XMLReader | parse |
检测说明:
Sink方法的参数有多种重载,已针对这些类型做处理(污点传递)
java/lang/String
java/io/File
java/io/FileInputStream
org/xml/sax/InputSource
javax/xml/transform/stream/StreamSource
开启检测模块关键字:RCE
Sink类 | Sink方法 |
---|---|
java/lang/Runtime | exec |
java/lang/ProcessBuilder | start |
groovy/lang/GroovyShell | evaluate |
检测说明:
- 简单的命令执行,判断整条链中参数是否能进入危险方法
- 其中
ProcessBuilder
类初始化需要处理数组情况的污点传递
开启检测模块关键字:DOS
漏洞名 | 漏洞细节 |
---|---|
RE DOS | Pattern.matches(str,str) |
FOR DOS | for(int i=0;i<int;i++) |
ARRAY DOS | object[] array = new object[int] |
LIST DOS | List list = new ArrayList(int) |
MAP DOS | Map map = new HashMap(int) |
检测说明:
- 其中的
RE DOS
模块曾经发现某开源组件的RE DOS
(参考文章) - 如果传入的参数是
int
类型且作为数组或集合的初始化长度认为可能存在拒绝服务
开启检测模块关键字:REDIRECT
漏洞名 | 漏洞细节 |
---|---|
SERVLET REDIRECT | response.sendRedirect |
SPRING REDIRECT | return "redirect://str" |
SPRING REDIRECT | new ModelAndView("redirect://str") |
检测说明:
- 对于SPRING型,解决字符串拼接和包含
redirect://
问题 - 这里为了方便只分析了
Controller
层,实际中也大都在这里做重定向
开启检测模块关键字:LOG
Sink类 | Sink方法 |
---|---|
org/slf4j/Logger | log |
org/slf4j/Logger | error |
org/slf4j/Logger | warn |
org/apache/logging/log4j/Logger | log |
org/apache/logging/log4j/Logger | error |
org/apache/logging/log4j/Logger | warn |
检测说明:
- 关于日志注入的说明参考:OWASP
- 需要处理可能存在的字符串拼接问题
该项目的优点如下:
- 速度较快,一次分析大致需要几秒,曾经
CodeInspector
跑一次需要三分钟以上 - 不依赖于源码,直接提供SpringBoot的Jar基于字节码分析
- 实现了简单的数据流分析和模拟栈帧的动态分析,不同于传统的正则等方式
- ......(后续补充)
缺陷有很多,大概如下:
- 没有加入返回值的分析
- 目前判断规则比较直接,应该参考实际的项目改善
- 污点传递比较简单,应该结合实际情况改善
- 仅针对于SpringMVC的Source,可以加入Servlet等情况
- 数据流分析并不是真正的数据流分析,是一种快速简单但不准确的分析
- ......(后续补充)
关于该工具原理我写了五篇文章
- 我的博客:4ra1n
- 深入分析GadgetInspector核心代码
- Java自动代码审计工具实现
- 详解Java自动代码审计工具实现
- 基于污点分析的JSP Webshell检测
- 加载恶意字节码Webshell的检测
- 欢迎大佬们提出建议和意见
- 二次开发请注明来自于:4ra1n
- 工具仅用于安全研究,使用工具造成的任何后果使用者负责,与作者无关