别致的上传思路导致getshell的案例
字数 1626 2025-08-10 00:23:58

奇安信攻防社区案例教学:别致的上传思路导致getshell

0x01 案例概述

本案例讲述了一次授权渗透测试中,通过SQL注入获取后台凭证,然后利用开发遗留的上传接口实现getshell的过程。案例展示了如何从登录框开始,逐步深入,最终获取服务器权限的技术路径。

0x02 技术细节详解

1. SQL注入攻击阶段

1.1 发现注入点

  • 目标系统:某子域名登录页面
  • 注入点:手机号/密码登录表单
  • 发现方式:在手机号参数后添加单引号'触发数据库报错
  • 关键信息泄露:
    • 物理路径
    • 密码列名为userpwd

1.2 注入利用技巧

  • 初始尝试:or '1'='1绕过失败

  • 信息收集策略:

    • 通过information_schema.columns查询包含userpwd列的所有表
    • SQL语句:select * from information_schema.columns where column_name = 'userpwd'
    • 结果:缩小到3个表(相比直接查400多个表效率大幅提升)
  • 最终在coupon_user表中获取有效凭证:

    • 账号:133xxxx3333
    • 密码:xxxx

1.3 关键技巧总结

  1. 当数据库表数量庞大时,优先根据已知列名反向查询表名
  2. 利用information_schema数据库获取元数据
  3. 避免盲目跑全库,减少对敏感数据的触及

2. 文件上传getshell阶段

2.1 后台发现

  • 使用获取的凭证成功登录后台
  • 发现多个上传功能点,但都使用腾讯云接口:
    • 上传接口:uploader/uploadTencentCloud
    • 文件存储位置:腾讯云对象存储

2.2 上传接口绕过思路

  1. 观察命名规律

    • 新接口命名为uploadTencentCloud
    • 推测可能存在旧版upload接口
  2. 接口探测

    • 直接尝试将uploader/uploadTencentCloud改为uploader/upload
    • 结果:成功触发本地文件上传功能
  3. 验证思路

    • 检查其他站点是否存在类似情况
    • 确认是开发遗留问题而非刻意设计

2.3 成功getshell

  • 上传webshell到本地服务器
  • 默认存储路径:/upload目录
  • 获取服务器权限

2.4 关键技巧总结

  1. 当遇到云存储上传接口时,尝试探测是否存在本地上传遗留接口
  2. 常见云上传接口命名模式:
    • uploadTX (腾讯云)
    • uploadOSS (阿里云OSS)
    • uploadS3 (AWS S3)
  3. 最简单的upload接口往往是最先开发的版本

0x03 完整攻击链总结

  1. 信息收集:发现子域名登录页面
  2. 漏洞发现:SQL注入漏洞(报错型)
  3. 数据提取:通过列名反向查询表名获取凭证
  4. 后台登录:使用获取的账号密码
  5. 功能探测:寻找上传功能点
  6. 接口绕过:通过修改上传接口路径
  7. getshell:上传webshell获取权限

0x04 防御建议

针对SQL注入

  1. 使用预编译语句(PreparedStatement)或ORM框架
  2. 实施最小权限原则,避免使用高权限数据库账户
  3. 自定义错误页面,避免泄露敏感信息
  4. 对用户输入进行严格过滤和验证

针对文件上传漏洞

  1. 彻底移除不再使用的旧接口
  2. 实施统一的文件上传服务,避免多套实现
  3. 文件上传安全措施:
    • 严格的文件类型检查(MIME类型+扩展名)
    • 随机化文件名
    • 设置文件存储目录不可执行
    • 对图片文件进行二次渲染
  4. 定期进行代码审计,清理废弃接口

0x05 扩展思考

  1. 接口探测自动化:可开发脚本自动探测常见上传接口变种
  2. 云存储与本地存储的混合架构:如何安全地设计混合存储方案
  3. 开发流程管理:如何确保废弃接口被彻底移除
  4. 防御纵深:即使上传webshell成功,如何通过其他安全措施阻止攻击者获取系统权限

本案例展示了渗透测试中"坚持尝试"的重要性,以及在看似没有漏洞的情况下,通过深入分析和合理推测最终找到突破口的完整过程。

奇安信攻防社区案例教学:别致的上传思路导致getshell 0x01 案例概述 本案例讲述了一次授权渗透测试中,通过SQL注入获取后台凭证,然后利用开发遗留的上传接口实现getshell的过程。案例展示了如何从登录框开始,逐步深入,最终获取服务器权限的技术路径。 0x02 技术细节详解 1. SQL注入攻击阶段 1.1 发现注入点 目标系统:某子域名登录页面 注入点:手机号/密码登录表单 发现方式:在手机号参数后添加单引号 ' 触发数据库报错 关键信息泄露: 物理路径 密码列名为 userpwd 1.2 注入利用技巧 初始尝试: or '1'='1 绕过失败 信息收集策略: 通过 information_schema.columns 查询包含 userpwd 列的所有表 SQL语句: select * from information_schema.columns where column_name = 'userpwd' 结果:缩小到3个表(相比直接查400多个表效率大幅提升) 最终在 coupon_user 表中获取有效凭证: 账号:133xxxx3333 密码:xxxx 1.3 关键技巧总结 当数据库表数量庞大时,优先根据已知列名反向查询表名 利用 information_schema 数据库获取元数据 避免盲目跑全库,减少对敏感数据的触及 2. 文件上传getshell阶段 2.1 后台发现 使用获取的凭证成功登录后台 发现多个上传功能点,但都使用腾讯云接口: 上传接口: uploader/uploadTencentCloud 文件存储位置:腾讯云对象存储 2.2 上传接口绕过思路 观察命名规律 : 新接口命名为 uploadTencentCloud 推测可能存在旧版 upload 接口 接口探测 : 直接尝试将 uploader/uploadTencentCloud 改为 uploader/upload 结果:成功触发本地文件上传功能 验证思路 : 检查其他站点是否存在类似情况 确认是开发遗留问题而非刻意设计 2.3 成功getshell 上传webshell到本地服务器 默认存储路径: /upload 目录 获取服务器权限 2.4 关键技巧总结 当遇到云存储上传接口时,尝试探测是否存在本地上传遗留接口 常见云上传接口命名模式: uploadTX (腾讯云) uploadOSS (阿里云OSS) uploadS3 (AWS S3) 最简单的 upload 接口往往是最先开发的版本 0x03 完整攻击链总结 信息收集 :发现子域名登录页面 漏洞发现 :SQL注入漏洞(报错型) 数据提取 :通过列名反向查询表名获取凭证 后台登录 :使用获取的账号密码 功能探测 :寻找上传功能点 接口绕过 :通过修改上传接口路径 getshell :上传webshell获取权限 0x04 防御建议 针对SQL注入 使用预编译语句(PreparedStatement)或ORM框架 实施最小权限原则,避免使用高权限数据库账户 自定义错误页面,避免泄露敏感信息 对用户输入进行严格过滤和验证 针对文件上传漏洞 彻底移除不再使用的旧接口 实施统一的文件上传服务,避免多套实现 文件上传安全措施: 严格的文件类型检查(MIME类型+扩展名) 随机化文件名 设置文件存储目录不可执行 对图片文件进行二次渲染 定期进行代码审计,清理废弃接口 0x05 扩展思考 接口探测自动化 :可开发脚本自动探测常见上传接口变种 云存储与本地存储的混合架构 :如何安全地设计混合存储方案 开发流程管理 :如何确保废弃接口被彻底移除 防御纵深 :即使上传webshell成功,如何通过其他安全措施阻止攻击者获取系统权限 本案例展示了渗透测试中"坚持尝试"的重要性,以及在看似没有漏洞的情况下,通过深入分析和合理推测最终找到突破口的完整过程。