SpringInspector
2022-4-12 13:37:7 Author: github.com(查看原文) 阅读量:54 收藏

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

一个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
  • 工具仅用于安全研究,使用工具造成的任何后果使用者负责,与作者无关

文章来源: https://github.com/y35uishere/SpringInspector
如有侵权请联系:admin#unsafe.sh