渗透测试实战(一)
字数 1565 2025-08-25 22:58:20
渗透测试实战教学:从注入到上传漏洞利用
1. 目标发现与初步侦察
- C段扫描:通过扫描目标C段发现
.81服务器开放82端口,运行HTTP服务 - 服务识别:访问后发现是某文档系统登录页面,无验证码机制
- 攻击面分析:
- 弱口令爆破可能性
- SQL注入测试
- 目录扫描
- JS文件/接口分析
2. 认证突破技术
2.1 SQL注入利用
- 注入类型:盲注,但未闭合语句时会返回详细MySQL错误信息
- 特点:
- 单引号被转义,无法直接利用报错注入
- 可利用错误日志功能实现回显注入
- 利用过程:
- 使用sqlmap自动化探测和利用
- 发现非root用户权限
- 获取数据库表结构和字段信息
- 提取用户凭证用于登录
2.2 错误日志回显注入技术
- 漏洞原理:
- 系统将未闭合SQL语句的错误信息写入日志
- 通过
getErrorMsg函数从日志中SELECT读取错误信息 $row['usr_id']直接使用POST的username参数值
- 利用方式:
- 构造恶意username参数
- 错误信息被记录并回显
- 实现数据提取
3. 源码泄露利用
- 发现.git目录泄露
- 使用工具:lijiejie的.git泄露利用脚本
- 还原源码:
- 初步还原发现部分文件缺失(如project.php)
- 推荐使用GitTools进行完整commit还原
- 完整还原可获取最新配置文件和其他关键代码
4. 文件上传漏洞挖掘与利用
4.1 初步上传测试
- 发现上传点:文档管理系统中的PDF上传功能
- 绕过尝试:
- 前端校验可绕过
- 上传PHP文件成功但返回404
- 文件调用机制:
- 文件名存入数据库
- 通过参数调用:
project.php?fn=1.pdf&file=1.php - 文件可能存储在非web目录或路径不可知
4.2 深入上传漏洞利用
发现api.php中的危险函数:
move_uploaded_file($_FILES['snapshot']['tmp_name'], $dir .'/'. $filename)
漏洞特征:
- 文件后缀和路径完全可控
- 只需提供有效的用户名密码和构造的上传数据包
利用障碍:
- 配置文件路径问题:
- 原Windows路径:
c:/wamp/www/webname - 实际运行在Linux系统
- 直接迁移导致路径不匹配
- 原Windows路径:
目录穿越尝试:
- 初始想法:使用
../跳转到web根目录- Linux中无法跳过不存在的目录
- PHP上传特性:
../在PHP上传时反斜线后会被截断
- 替代方案:使用
..-..-a.php格式尝试
最终解决方案:
- 还原完整commit获取最新配置
- 发现host验证机制:
- 必须使用域名
beauty.xxxx.net访问 - IP直接访问无法成功上传
- 必须使用域名
- 使用
..-..-a.php文件名和正确host头成功上传
5. 关键工具与技术总结
-
.git泄露利用工具:
- lijiejie的exploit脚本(快速但不完整)
- GitTools(完整还原所有commit)
-
SQL注入利用:
- sqlmap自动化探测
- 非常规回显注入技术
-
文件上传绕过技术:
- 路径穿越的特殊格式
- Host头修改绕过
- 绝对路径与相对路径结合利用
6. 防御建议
-
认证层面:
- 实施强密码策略
- 添加验证码机制
- 使用预编译语句防御SQL注入
-
文件上传:
- 实施严格的白名单校验
- 固定存储路径,禁止用户控制
- 随机化存储文件名
-
配置安全:
- 迁移环境时检查路径配置
- 禁止.git等版本控制目录外部访问
- 错误信息不应对用户可见
-
代码安全:
- 避免使用危险函数如
move_uploaded_file直接拼接用户输入 - 实施输入验证和输出编码
- 避免使用危险函数如
7. 扩展思考
-
内网渗透可能性:
- 获取shell后可进行内网横向移动
- Linux代理进入内网可能发现更多漏洞
-
漏洞链构建:
- 信息泄露→注入→认证绕过→文件上传
- 展示了完整攻击链的构建过程
-
运维失误利用:
- 环境迁移不彻底
- 配置不一致
- 开发/生产环境差异