某租车系统JAVA代码审计
字数 1271 2025-08-18 11:37:02
Java代码审计实战教学:租车系统漏洞分析与挖掘
1. 系统概述
1.1 系统简介
- 基于租车业务场景的O2O服务平台
- 功能包括:商务租车、接送机、旅游租车、企业租车、自驾租车、婚庆用车等
- 后台管理模块:车辆库管理、门店管理、员工管理、司机管理、订单管理、活动管理、评价管理、财务管理、统计等
1.2 技术栈
- 未使用Struts2或Spring框架的传统JAVA WEB项目
- 数据库:MySQL
- 部署环境:Tomcat 8.5
2. 代码审计方法论
2.1 审计流程
- 功能点梳理:先浏览系统功能,不直接看代码
- 潜在漏洞预测:根据功能点推测可能存在的漏洞类型
- 代码回溯:通过功能点定位到具体代码实现
- 漏洞验证:通过测试验证推测的漏洞
2.2 常用审计技巧
- 使用全局搜索功能快速定位代码(如Eclipse的Search功能)
- 关注用户输入点和数据处理流程
- 重点检查敏感操作(如订单处理、支付逻辑等)
3. 漏洞挖掘实战
3.1 用户注册功能审计
3.1.1 短信验证码功能
- 功能点:获取手机动态码
- 潜在风险:短信炸弹漏洞
- 审计发现:缺少频率限制和验证机制
3.1.2 密码重置功能
- 审计发现:功能被阉割,无法测试
3.2 用户资料修改功能
3.2.1 存储型XSS漏洞
- 漏洞位置:基本资料修改、收货地址修改
- 测试方法:
// 测试payload woaini"<> - 漏洞确认:输入未经任何过滤直接存储和显示
- 攻击场景:管理员查看用户信息时触发XSS
3.2.2 SQL注入审计
- 代码分析:
public Integer addAddress(Integer userId, String name, String tel, String address) { Object args[] = { name, tel, address, userId }; String sql = "insert into user_address (user_address_name,user_address_tel,user_address_content,user_address_user) values(?,?,?,?)"; Serializable flag = jdbc.insertBackId(sql, args); // 采用预编译 jdbc.close(); return Integer.valueOf(flag.hashCode()); } - 审计结论:使用预编译语句,不存在SQL注入漏洞
3.3 订单功能审计
3.3.1 价格参数篡改漏洞
- 漏洞位置:订单提交功能
- 关键代码:
public void addGoodsOrder(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException { // ... String price=request.getParameter("price"); // 直接获取未校验 // ... order_id=ss.addGoodsOrder(..., price, ...); // ... } - 漏洞利用方式:
- 抓包直接修改price参数
- 修改页面表单中的hidden字段value值
- 风险:可任意修改订单价格
3.3.2 订单越权访问审计
- 代码分析:
// 订单取消功能 if(输入的订单与用户自身订单匹配) { // 执行取消操作 } - 审计结论:有用户归属校验,不存在越权漏洞
3.3.3 积分支付逻辑审计
- 潜在风险:负积分导致积分反增不减
- 审计发现:积分从session获取,未发现明显漏洞
4. 审计总结与防御建议
4.1 发现漏洞汇总
- 存储型XSS漏洞(用户资料修改处)
- 价格参数篡改漏洞(订单提交处)
- 短信炸弹漏洞(验证码获取处)
4.2 修复建议
4.2.1 XSS防御
// 对所有用户输入进行HTML编码
import org.apache.commons.lang3.StringEscapeUtils;
String safeInput = StringEscapeUtils.escapeHtml4(userInput);
4.2.2 价格参数校验
// 添加价格校验逻辑
try {
double priceValue = Double.parseDouble(price);
if(priceValue <= 0 || priceValue > MAX_ALLOWED_PRICE) {
throw new IllegalArgumentException("Invalid price");
}
} catch(NumberFormatException e) {
// 处理非法输入
}
4.2.3 短信验证码防护
// 添加频率限制
String ip = request.getRemoteAddr();
if(rateLimiter.exceedsLimit(ip)) {
return "请求过于频繁";
}
4.3 通用安全建议
- 所有用户输入必须进行验证和过滤
- 敏感操作(如支付)必须在服务端进行严格校验
- 使用预编译SQL语句防止SQL注入
- 实施CSRF防护机制
- 关键业务操作添加日志记录
5. 审计经验分享
- 功能导向审计:先梳理功能再分析代码,效率更高
- 敏感点关注:重点关注用户输入、支付逻辑、权限控制等关键环节
- 漏洞关联思考:一个功能点可能关联多种漏洞类型
- 测试验证:审计发现必须通过实际测试验证
- 框架特性了解:了解不同框架的安全机制和常见漏洞
通过本案例可以掌握基本的Java代码审计方法和常见漏洞挖掘技巧,适用于中小型Java Web项目的安全审计工作。