红队java代码审计生命周期
字数 1310 2025-08-24 20:49:22
Java代码审计生命周期与漏洞分析指南
一、红队Java代码审计生命周期
-
源码获取途径
- 开源/二开项目(官网、GitHub、码云)
- 相似站点批量扫描备份文件
- 网盘搜索、咸鱼、淘宝、TG等平台
- 云市场获取
-
审计环境配置
- 开发工具:IDEA、VSCode
- 运行环境:JDK8(根据源码支持版本)、Tomcat
- 辅助工具:Burp Suite、JD-GUI
-
代码审计方法
- 快速审计方法:
- 提取全部JSP文件进行目录扫描
- 分析web.xml中的servlet路径
- 批量提取JS/HTML中的URL接口
- 关键sink函数定位
- 快速审计方法:
-
后续流程
- POC&EXP编写
- 后渗透利用
- 相关文档输出
二、SpringBoot项目结构分析
代码目录结构
/src/main/java/
├── common/ # 通用类、工具类
├── config/ # 配置文件
├── controller/ # 控制器
├── dao/ # 数据访问层
├── entity/ # 实体类
├── interceptor/ # 拦截器
├── service/ # 业务逻辑处理
│ ├── Service接口
│ └── ServiceImpl实现类
├── utils/ # 工具类
├── dto/ # 数据传输对象
├── vo/ # 视图对象
├── constant/ # 常量
├── filter/ # 过滤器
└── component/ # 组件
资源目录结构
/src/main/resources/
├── mapper/ # MyBatis的mapper.xml
├── static/ # 静态资源
├── templates/ # 模板文件
├── application.properties # 配置文件
└── META-INF/ # 配置信息包
三、Java请求传递流程
-
请求处理流程
- 用户请求 → Tomcat → DispatcherServlet
- 经过Filter和Interceptor
- 分配到对应Controller
- 调用Service处理业务逻辑
- 涉及数据库操作时调用Dao层
-
分层架构
- 视图层(View)
- 控制层(Controller/Action)
- 服务层(Service)
- 业务逻辑层(BO)
- 实体层(Entity/VO/Bean)
四、常见漏洞审计与修复
1. SQL注入漏洞
审计方法:
- 查找SQL拼接点:
+ id、${title}、${id} - 重点关注:
- MyBatis中的like、in和order by语句
- Hibernate中的createQuery()函数
修复方案:
// 使用预编译
String sql = "select * from users where username=? and password=?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
2. XSS漏洞
审计方法:
- 全局搜索用户输入与输出点
- 检查是否直接输出用户输入
修复方案:
// 配置全局过滤器
<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解析函数:
DocumentBuilder, XMLStreamReader, SAXBuilder, SAXParser, XMLReader, SAXSource, TransformerFactory, SchemaFactory, Unmarshaller
修复方案:
// 禁用外部实体
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
4. SSRF漏洞
审计方法:
- 查找网络请求函数:
HttpClient.execute(), HttpURLConnection.connect(), URL.openStream(), new URL(), openConnection()
修复方案:
// 验证URL是否为内网地址
private static boolean isInnerIP(String url) {
String host = new URL(url).getHost();
InetAddress ia = InetAddress.getByName(host);
String ip = ia.getHostAddress();
return ip.startsWith("10.") || ip.startsWith("192.168.")
|| ip.startsWith("172.16.") || ip.startsWith("127.");
}
5. 文件操作漏洞
审计方法:
- 搜索文件操作函数:
FileInputStream, getPath, getAbsolutePath, ServletFileUpload
修复方案:
// 使用规范路径
File file = new File("resources/images/", image);
String canonicalPath = file.getCanonicalPath();
if (!canonicalPath.startsWith("/var/www/resources/images/")) {
throw new SecurityException("Invalid file path");
}
6. 命令执行漏洞
审计方法:
- 搜索危险函数:
Runtime.exec(), ProcessBuilder.start(), GroovyShell.evaluate()
修复方案:
// 使用白名单校验
if (!Pattern.matches("[0-9A-Za-z@.]+", input)) {
throw new IllegalArgumentException("Invalid input");
}
7. 反序列化漏洞
审计方法:
- 查找反序列化操作:
ObjectInputStream.readObject(), XMLDecoder.readObject(), XStream.fromXML(), ObjectMapper.readValue()
修复方案:
- 升级依赖库版本
- 使用白名单校验反序列化类
五、其他重要漏洞
1. JNDI注入
审计方法:
- 查找
InitialContext.lookup()调用 - 检查参数是否可控
修复方案:
// 限制JNDI查找
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "false");
System.setProperty("com.sun.jndi.cosnaming.object.trustURLCodebase", "false");
2. 表达式注入
审计方法:
- 查找
SpelExpressionParser.getValue() - 检查Spring表达式是否包含用户输入
修复方案:
// 避免直接使用用户输入构建表达式
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setRootObject(safeObject);
Expression exp = parser.parseExpression(safeExpression);
六、自动化审计工具
推荐使用Cryin/JavaID进行危险函数识别:
# 关键函数搜索模式
XXE: "SAXReader", "DocumentBuilder", "XMLStreamReader", "SAXBuilder"
Deserialization: "readObject", "readUnshared", "Yaml.load", "fromXML"
SSRF: "HttpClient", "Socket", "URL", "ImageIO", "HttpURLConnection"
File: "MultipartFile", "createNewFile", "FileInputStream"
SpEL: "SpelExpressionParser", "getValue"
Exec: "getRuntime.exec", "ProcessBuilder.start", "GroovyShell.evaluate"
七、后渗透利用
-
数据库信息获取
- 查找数据库配置文件位置
- 解密数据库密码(如有加密)
-
业务攻击面扩展
- 获取管理员/用户凭证
- 适配代理工具进行内网渗透
-
敏感信息收集
- 主机敏感文件扫描
- 进一步扩大利用范围
八、文档输出要求
-
漏洞文档
- 完整漏洞细节及原理分析
- 复现步骤与截图
-
工具文档
- POC/EXP使用说明
- 环境搭建指南
-
架构分析
- 框架使用情况
- 鉴权机制分析
- 风险点总结
- 整体路由梳理
- 重要配置文件说明
通过以上系统化的审计方法,可以全面覆盖Java应用程序的安全风险点,有效发现和修复各类安全漏洞。