记一处任意文件上传没拿到webshell却拿到服务器的故事
字数 1309 2025-08-25 22:58:21
任意文件上传漏洞利用:从Web到服务器的权限获取
漏洞概述
本文记录了一个通过任意文件上传漏洞最终获取服务器权限的完整过程。虽然最初未能通过上传Webshell获取控制权,但通过巧妙的目录遍历技术,最终成功替换SSH公钥获得了服务器root权限。
漏洞发现过程
1. 信息收集阶段
- API文档泄露:发现一个暴露的API文档,泄露了服务器配置信息和真实IP
- 真实IP暴露:云服务器真实IP未做保护措施
- 端口扫描:对目标IP进行端口扫描,识别开放服务
2. 漏洞识别
- 未授权上传功能:发现Web应用中存在未授权访问的文件上传功能点
- 任意文件上传:能够上传任意文件到服务器
漏洞利用过程
第一阶段:Webshell上传尝试
- 直接上传Webshell文件(如PHP、JSP等)
- 上传成功但文件不执行(可能原因:文件类型限制、执行权限问题、路径限制等)
第二阶段:目录遍历利用
当Webshell无法执行时,尝试利用目录遍历技术:
- 测试能否通过上传功能访问系统其他目录
- 确认可以跨目录访问(如访问
/root/.ssh/目录)
第三阶段:SSH密钥替换攻击
- 定位SSH授权密钥文件:
/root/.ssh/authorized_keys - 将自己的公钥写入该文件
- 通过SSH连接服务器,成功获取root权限
技术要点分析
1. 任意文件上传漏洞
- 允许用户上传任意文件到服务器
- 常见限制:文件类型检查、大小限制、文件名处理
- 绕过方法:修改Content-Type、使用特殊扩展名、双扩展名等
2. 目录遍历技术
- 利用
../等路径遍历符号访问系统其他目录 - 需要服务器未正确限制文件上传路径
- 可用于访问敏感系统文件或目录
3. SSH密钥替换攻击
- 原理:将攻击者公钥添加到服务器的
authorized_keys文件中 - 前提条件:
- 能够写入目标文件
- 服务器允许SSH密钥认证
- 知道或能猜测SSH服务端口
防御措施
1. 防止任意文件上传
- 严格验证文件类型(内容检查而非仅扩展名)
- 限制上传目录权限,禁止执行权限
- 使用随机生成的文件名
- 将上传文件存储在Web根目录外
2. 防止目录遍历
- 规范化文件路径,过滤
../等特殊字符 - 使用chroot jail限制文件系统访问
- 设置严格的目录权限
3. 保护SSH服务
- 禁用root直接登录
- 使用强密码或双因素认证
- 定期检查
authorized_keys文件 - 限制SSH访问IP
总结与经验
- 信息收集至关重要:全面的信息收集能发现更多攻击面
- 多角度思考:当直接攻击路径受阻时,寻找间接利用方式
- 权限提升思路:从Web漏洞到系统权限的转换思维
- 防御纵深:系统需要多层防护,单一防护措施容易被绕过
扩展思考
-
如果无法访问
/root/.ssh/目录,还有哪些可能的利用方式?- 尝试写入crontab定时任务
- 修改Web服务器配置文件
- 写入系统启动脚本
-
在云环境下,此类攻击可能造成的更大影响:
- 获取云服务API密钥
- 横向移动攻击同VPC内其他主机
- 获取敏感数据存储访问权限
-
自动化检测方法:
- 定期检查系统关键文件完整性
- 监控异常文件修改行为
- 实施文件系统变更审计