Java自动代码审计工具,尤其针对Spring框架,核心原理是模拟JVM栈帧进行分析,无需提供源码,通过一个JAR包即可
该项目暂时不能用于实战,我将逐渐完善和添加规则
一个Java自动代码审计工具,尤其针对Spring框架,也可自行改造以适配其他情况
提供一个SpringBoot的Jar包即可进行自动代码审计,底层技术基于字节码分析
能够生成跨越接口和实现的方法调用关系图(CallGraph)并模拟JVM栈帧实现简单的数据流分析
注意:该工具不能确定存在漏洞,只能证明某条调用链上存在危险操作,所以建议结合人工做进一步分析
支持漏洞类型(Sink)
注意
该工具将Source
固定为SpringMVC
类型,可以抽出核心部分,改写用来挖各种框架的漏洞
之前改写后挖到几个Apache
项目的鸡肋洞,正在申请CVE
中
示例:针对我写好的 靶机 进行SSRF漏洞的检测
配置靶机下载地址:SIDemo
命令:java -jar SpringInspector.jar sidemo.jar --springboot --package org.sec --module SSRF
可选参数说明
参数 | 参数说明 | 参数类型 | 是否必须 |
---|---|---|---|
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 |
检测说明:
开启检测模块关键字: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 | java.util.regex.Pattern.matches(str,str) |
RE DOS | org.apache.commons.lang3.Validate.matchesPattern(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") |
检测说明:
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 |
检测说明:
该项目的优点如下:
CodeInspector
跑一次需要三分钟以上缺陷有很多,大概如下:
关于该工具原理我写了五篇文章