Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Java自动代码审计工具,尤其针对Spring框架,核心原理是模拟JVM栈帧进行分析,无需提供源码,通过一个JAR包即可

License

Notifications You must be signed in to change notification settings

djthinksource/SpringInspector

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

43 Commits

Repository files navigation

SpringInspector

该项目暂时不能用于实战,我将逐渐完善和添加规则

一个Java自动代码审计工具,尤其针对Spring框架,也可自行改造以适配其他情况

提供一个SpringBoot的Jar包即可进行自动代码审计,底层技术基于字节码分析

能够生成跨越接口和实现的方法调用关系图(CallGraph)并模拟JVM栈帧实现简单的数据流分析

注意:该工具不能确定存在漏洞,只能证明某条调用链上存在危险操作,所以建议结合人工做进一步分析

支持漏洞类型(Sink)

  • SQL注入检测
  • 服务器端请求伪造漏洞检测
  • XML外部实体注入漏洞检测
  • 远程命令执行漏洞检测
  • 针对Java的拒绝服务漏洞检测
  • URL重定向漏洞检测
  • 日志注入漏洞检测

注意

该工具将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.seccom.xxx等)
  • 可选检测模块用|分割可包含多个(例如--module SSRF|SQLI)

SQL注入

开启检测模块关键字: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

检测说明:

  1. Source是Controller输入的String型请求参数
  2. 该参数通过字符串拼接得到了SQL语句
  3. SQL语句进入了Sink方法

XXE

开启检测模块关键字: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方法的参数有多种重载,已针对这些类型做处理(污点传递)

  1. java/lang/String
  2. java/io/File
  3. java/io/FileInputStream
  4. org/xml/sax/InputSource
  5. javax/xml/transform/stream/StreamSource

RCE

开启检测模块关键字:RCE

Sink类 Sink方法
java/lang/Runtime exec
java/lang/ProcessBuilder start
groovy/lang/GroovyShell evaluate

检测说明:

  1. 简单的命令执行,判断整条链中参数是否能进入危险方法
  2. 其中ProcessBuilder类初始化需要处理数组情况的污点传递

DOS

开启检测模块关键字: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)

检测说明:

  1. 其中的RE DOS模块曾经发现某开源组件的RE DOS(参考文章)
  2. 如果传入的参数是int类型且作为数组或集合的初始化长度认为可能存在拒绝服务

URL重定向

开启检测模块关键字:REDIRECT

漏洞名 漏洞细节
SERVLET REDIRECT response.sendRedirect
SPRING REDIRECT return "redirect://str"
SPRING REDIRECT new ModelAndView("redirect://str")

检测说明:

  1. 对于SPRING型,解决字符串拼接和包含redirect://问题
  2. 这里为了方便只分析了Controller层,实际中也大都在这里做重定向

LOG注入

开启检测模块关键字: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

检测说明:

  1. 关于日志注入的说明参考:OWASP
  2. 需要处理可能存在的字符串拼接问题

优点

该项目的优点如下:

  1. 速度较快,一次分析大致需要几秒,曾经CodeInspector跑一次需要三分钟以上
  2. 不依赖于源码,直接提供SpringBoot的Jar基于字节码分析
  3. 实现了简单的数据流分析和模拟栈帧的动态分析,不同于传统的正则等方式
  4. ......(后续补充)

缺陷

缺陷有很多,大概如下:

  1. 没有加入返回值的分析
  2. 目前判断规则比较直接,应参考实际的项目改善
  3. 污点传递比较简单,应该结合实际情况改善
  4. ......(后续补充)

参考

关于该工具原理我写了五篇文章

  1. 我的博客:4ra1n
  2. 深入分析GadgetInspector核心代码
  3. Java自动代码审计工具实现
  4. 详解Java自动代码审计工具实现
  5. 基于污点分析的JSP Webshell检测
  6. 加载恶意字节码Webshell的检测

其他

  • 欢迎大佬们提出建议和意见
  • 二次开发请注明来自于:4ra1n
  • 工具仅用于安全研究,使用工具造成的任何后果使用者负责,与作者无关

About

Java自动代码审计工具,尤其针对Spring框架,核心原理是模拟JVM栈帧进行分析,无需提供源码,通过一个JAR包即可

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 100.0%

AltStyle によって変換されたページ (->オリジナル) /