一、缘起:一封普通的测试任务邮件

2025年第一季度,我所在的安全团队接到某金融科技平台的渗透测试需求。与往常不同,这次测试范围不仅包含常规的Web应用,还涉及新上线的移动端API接口和后台管理系统。客户特别强调:"希望发现真正能造成业务影响的漏洞,而非仅仅扫描器报出的低危问题。"

在正式开始前,我们团队按照标准流程进行了测试边界确认:

  • 授权范围:example.com域名及其子域名

  • 测试时间窗:工作日晚间20:00-次日6:00

  • 禁止测试项:客户生产数据库的DML操作

  • 特殊要求:重点关注交易支付链路

二、突破:从薄弱环节打开缺口

2.1 信息收集阶段的意外收获

使用子域名枚举工具时,我发现了一个异常的二级域名:dev-ops.example.com。该域名未在官方文档中提及,却响应200状态码。更关键的是,页面显示的是Jenkins持续集成平台登录界面,且版本号(2.346.3)存在已知的CVE-2022-XXXX认证绕过漏洞。

技术细节:

# 使用定制化EXP进行漏洞验证 curl -X POST 'http://dev-ops.example.com/securityRealm/createAccount' \ -d 'username=test123&password=Test@12345&confirm=Test@12345'

执行后系统返回"Success"状态,表明任意用户注册漏洞真实存在。通过此漏洞,我成功获得了Jenkins系统的操作权限,能够查看所有的构建任务和代码仓库信息。

2.2 横向移动:密钥泄露的连锁反应

在Jenkins的"编译配置"文件中,发现了硬编码的阿里云OSS访问密钥:

access_key = 'LTAI5t**********' secret_key = 'W8Y2b**********'

使用这些凭据,我顺利访问了客户的对象存储桶,发现了更严重的问题:

  • 3个生产环境数据库备份文件(含用户敏感信息)

  • 应用程序配置文件(包含Redis、MySQL连接密码)

  • 前端源码映射文件(暴露API调用逻辑)

三、深入:业务逻辑漏洞的精准打击

3.1 支付环节的金额篡改漏洞

通过分析前端代码,我发现支付请求中存在未经验签名的参数:

// 问题代码片段 const paymentRequest = { orderId: '202512061524001', amount: 299.00, // 前端传递,服务端未二次校验 currency: 'CNY', timestamp: Date.now() }

通过Burp Suite拦截修改amount值为0.01后,系统竟然接受了该请求并完成订单状态变更。这意味着攻击者可以任意篡改支付金额,以极低价格购买高价值商品。

3.2 会话管理缺陷导致的垂直越权

在测试管理员功能时,我注意到会话令牌的生成机制存在问题。普通用户token与管理员的差异仅在于末尾标识符:

  • 普通用户:eyJhbGci****.eyJzdWI****.SflKxw***user

  • 管理员:eyJhbGci****.eyJzdWI****.SflKxw***admin

通过修改token尾缀,我成功以普通用户身份访问了管理员后台,能够执行用户数据导出、权限配置等敏感操作。

四、漏洞修复与防护建议

4.1 紧急修复措施

  1. Jenkins安全加固:

    • 立即升级至最新安全版本

    • 启用双因素认证

    • 限制访问IP范围

  2. 密钥管理整改:

    • 撤销泄露的OSS访问密钥

    • 使用密钥管理系统替代硬编码

    • 建立密钥轮换机制

  3. 业务逻辑修复:

    • 支付金额必须服务端重新计算

    • 引入请求签名机制防篡改

    • 会话令牌增加高强度签名验证

4.2 纵深防御体系建设

建议客户建立四层防护体系:

  1. 代码安全:SAST/DAST工具集成CI/CD

  2. 基础设施安全:网络隔离、最小权限原则

  3. 监控预警:异常行为检测、实时告警

  4. 应急响应:漏洞披露流程、灾备方案

五、反思与总结

这次渗透测试最深的体会是:系统最危险的漏洞往往不在技术层面,而在架构设计和开发流程中。那个允许任意用户注册的Jenkins漏洞,本质是开发人员为了方便测试而遗留的后门;支付金额篡改问题,则源于前端与后端信任边界模糊。

作为软件测试从业者,我们应该:

  • 培养攻击者思维:不仅要验证功能是否正确,更要思考如何被滥用

  • 关注供应链安全:第三方组件、开发工具同样需要安全评估

  • 推动安全左移:在需求分析、设计阶段就介入安全考虑

安全是一个持续的过程,而非一次性项目。每一次渗透测试,都是我们与未知攻击者之间的一场预演。只有比攻击者想得更远、测得更深,才能真正构筑起可靠的安全防线。

更多推荐