红队-java代码审计生命周期
字数 2252 2025-08-11 21:26:29
Java代码审计生命周期与漏洞挖掘指南
一、Java代码审计生命周期概述
Java代码审计是一个系统化的过程,主要包括以下阶段:
- 源码获取
- 审计环境配置
- 代码审计
- POC&EXP编写
- 后渗透利用
- 相关文档输出
二、源码获取方法
-
开源/二次开发源码获取:
- 官网、GitHub、码云等平台
- 网盘搜索
- 咸鱼、淘宝、TG等交易平台
- 云市场
-
相似站点扫描:
- 批量扫描备份文件
- 通过相似站点getshell后打包源码
三、审计环境配置
基本审计工具配置:
- IDE:IDEA、VSCode
- JDK版本:根据源码支持的版本选择(通常JDK8)
- Web服务器:Tomcat
- 测试工具:Burp Suite
- 反编译工具:JD-GUI
四、快速代码审计方法
1. 快速定位可访问资源
方法一:提取全部JSP文件
find /domain/ -name "*.jsp"
用Burp批量测试返回200的路径,分析未认证可访问的JSP文件
方法二:分析web.xml
- 提取servlet-name路径
- 用Burp批量测试servlet路径
- 根据servlet-class逆向分析相关class代码
方法三:提取JS/HTML中的URL接口
- 批量提取JS/HTML中的URL和path路径
- 用Burp批量测试
2. Spring Boot项目结构分析
代码结构:
/src/main/java/
├── common/ # 通用类、工具类
├── config/ # 配置文件
├── controller/ # 控制器
├── dao/ # 数据访问层
├── entity/ # 实体类
├── interceptor/ # 拦截器
├── service/ # 业务逻辑层
│ ├── ExampleService # 接口类
│ └── ExampleServiceImpl # 实现类
├── utils/ # 工具类
├── dto/ # 数据传输对象
├── vo/ # 视图对象
├── constant/ # 常量
├── filter/ # 过滤器
└── component/ # 组件
资源目录结构:
/src/main/resources/
├── mapper/ # MyBatis的mapper.xml
├── static/ # 静态资源(JS/CSS/图片)
├── templates/ # 模板文件
├── application.properties # Spring Boot默认配置
├── META-INF/ # 配置应用程序、扩展程序
└── i18n/ # 国际化文件
3. Java请求传递流程
- 用户请求 → Tomcat等中间件 → DispatcherServlet
- 经过Filter和Interceptor
- DispatcherServlet分配到对应Controller
- Controller调用Service
- Service调用Dao进行数据库操作
- 返回响应
示例流程:
用户请求 → Filter → Interceptor → Controller → Service → Dao → Mapper.xml
五、常见漏洞审计方法
1. SQL注入漏洞
成因:用户输入直接拼接到SQL语句中
常见场景:
- DAO层拼接SQL:
"select * from user where id="+id - Hibernate:
session.createQuery("from Book where title like '%" + userInput + "%'") - MyBatis:
Select * from news where title like '%${title}%' Select * from news where id in (${id}) Select * from news where title ='java' order by ${time} asc
审计方法:
- 查找与数据库交互的代码
- 检查用户输入是否过滤
- 重点关注:
- MyBatis中的like、in和order by语句
- Hibernate中的createQuery()函数
修复方案:
// 使用预编译
String sql = "select * from db_user where username=? and password=?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, username);
stmt.setString(2, pwd);
ResultSet rs = stmt.executeQuery();
2. XSS漏洞
类型:反射型、存储型、DOM型
示例代码:
@RequestMapping("/xss")
public ModelAndView xss(HttpServletRequest request) {
String name = request.getParameter("name"); // 用户输入
ModelAndView mav = new ModelAndView("mmc");
mav.getModel().put("uname", name); // 直接输出
return mav;
}
审计方法:全局搜索用户输入与输出,检查过滤情况
修复方案:
- 配置全局过滤器:
<filter>
<filter-name>XssSafe</filter-name>
<filter-class>XssFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XssSafe</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 使用StringEscapeUtils:
StringEscapeUtils.escapeHtml(string);
StringEscapeUtils.escapeJavaScript(string);
3. XXE漏洞
成因:XML解析时允许引用外部实体
审计方法:查找以下XML解析函数:
javax.xml.parsers.DocumentBuilder
javax.xml.stream.XMLStreamReader
org.jdom.input.SAXBuilder
javax.xml.parsers.SAXParser
org.dom4j.io.SAXReader
org.xml.sax.XMLReader
...
修复方案:
- 禁用外部实体
- 使用白名单校验输入
- 使用dom4j构建XML(自动编码)
4. SSRF漏洞
利用方式:
- file协议任意文件读取
- http协议端口探测
支持协议:file, ftp, mailto, http, https, jar, netdoc
漏洞代码示例:
String url = request.getParameter("url");
URL u = new URL(url);
URLConnection conn = u.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
审计方法:查找网络请求相关函数:
HttpClient.execute
HttpClient.executeMethod
HttpURLConnection.connect
HttpURLConnection.getInputStream
URL.openStream
new URL()
openConnection()
getInputStream()
修复方案:
- 校验URL的Host和IP
- 禁止访问内网IP
- 检查跳转URL
5. 任意文件操作漏洞
类型:读取、下载、删除、修改
示例代码:
@GET
@Path("/images/{image}")
public Response getImage(@PathParam("image") String image) {
File file = new File("resources/images/", image); // 未过滤
return Response.ok().entity(new FileInputStream(file)).build();
}
审计方法:搜索关键字:
FileInputStream
getPath
getAbsolutePath
ServletFileUpload
修复方案:
- 使用File.getCanonicalPath()解析路径
- 配置全局安全策略
6. 命令执行漏洞
危险函数:
Runtime.exec()
Process
ProcessBuilder.start()
示例代码:
String dir = System.getProperty("dir");
Process process = Runtime.getRuntime().exec("cmd.exe /c dir" + dir);
审计方法:查找命令执行相关函数
修复方案:正则校验输入
if (!Pattern.matches("[0-9A-Za-z@.]+", dir)) {
// 拒绝非法输入
}
7. 反序列化漏洞
危险函数:
ObjectInputStream.readObject
ObjectInputStream.readUnshared
XMLDecoder.readObject
XStream.fromXML
ObjectMapper.readValue
JSON.parseObject
审计场景:
- 导入模板文件
- 网络通信
- 数据传输
- 日志存储
- 数据库存储
修复方案:
- 升级依赖jar包和JDK
- 反序列化前检查InputStream
8. 中间件漏洞
常见Java中间件:
Tomcat
WebLogic
WebSphere
JBoss
GlassFish
Jetty
Resin
审计方法:检查pom.xml中的中间件版本,匹配已知漏洞
9. 业务逻辑漏洞
主要类型:平行越权、垂直越权
审计方法:
- 检查每个
request.getParameter("userid")后是否有权限校验 - 验证当前用户与操作对象的所属关系
修复方案:
- 校验当前用户权限
- 从会话中获取用户标识,而非请求参数
六、其他重要漏洞
1. LDAP注入
漏洞代码:
NamingEnumeration<SearchResult> answers = context.search(
"dc=People,dc=example,dc=com",
"(uid=" + username + ")",
ctrls);
修复方案:严格校验输入参数
2. JNDI注入
关键函数:
InitialContext.lookup()
bind()
攻击方式:控制URI参数指向恶意RMI服务
3. RMI反序列化
关键类:
ObjectOutputStream.writeObject()
ObjectInputStream.readObject()
RMI协议格式:rmi://host:port/name
4. 表达式注入
危险函数:
SpelExpressionParser
getValue
漏洞代码:
<spring:eval expression="${param.lang}" var="lang" />
修复方案:
<c:set var="lang" value="${param.lang}"/>
七、自动化审计工具
推荐使用Cryin/JavaID工具自动识别危险函数:
检测规则示例:
XXE: "SAXReader", "DocumentBuilder", "XMLStreamReader"
反序列化: "readObject", "readUnshared", "Yaml.load"
SSRF: "HttpClient", "Socket", "URL", "HttpURLConnection"
文件操作: "MultipartFile", "createNewFile", "FileInputStream"
表达式注入: "SpelExpressionParser", "getValue"
命令执行: "getRuntime.exec", "ProcessBuilder.start"
八、POC&EXP编写
- 编写漏洞检测利用脚本(py/exe/jar等形式)
- 开发批量检测脚本
- 适配内存马注入
九、后渗透利用
- 定位数据库配置文件(可能需要解密)
- 获取业务敏感数据(如管理员凭证)
- 适配代理工具进行内网渗透
- 获取主机敏感信息
- 扩大攻击面
十、文档输出要求
-
漏洞文档:
- 完整漏洞细节及原理
- 复现步骤
-
工具文档:
- POC&EXP使用说明
-
环境文档:
- 环境搭建指南
- 环境密码信息
-
架构分析:
- 使用框架分析
- 鉴权机制
- 风险点总结
- 整体路由图
- 重要配置文件分析