某SRC站点从源码泄露到getshell
字数 1176 2025-08-27 12:33:49
从源码泄露到Getshell:某SRC站点渗透测试全记录
1. 漏洞发现阶段
1.1 源码泄露漏洞
- 发现目标站点存在源码泄露漏洞
- 通过直接访问
xxx.com/www.zip可下载完整站点源码 - 源码为.NET架构,使用MVC模式开发
1.2 源码分析工具
- 使用DNSPY工具进行.NET程序集反编译
- 重点分析控制器(Controller)代码
2. 漏洞挖掘过程
2.1 文件上传漏洞分析
-
发现两处潜在的文件上传点:
第一处上传点:
- 位于用户注册登录后的功能中
- 构造上传包测试失败,服务器抛出错误
- 确认该处不可利用
第二处上传点:
- 文件类型判断存在缺陷:
base.Request.Headers["X-File-Type"] // 判断文件类型 base.Request.Headers["X-File-Extension"] // 判断文件后缀 - 仅简单检查
X-File-Type值,未对后缀进行有效验证 - 确认存在任意文件上传漏洞
2.2 权限问题阻碍
- 尝试构造上传报文失败
- 发现该控制器声明了权限限制
- 普通注册用户无访问该控制器的权限
- 需要寻找越权漏洞或通过注入获取高权限
3. SQL注入漏洞分析
3.1 发现注入点
- 在UserController中发现存在SQL注入的代码:
// sel参数存在注入 public ActionResult SomeFunction(string sel) { // 存在SQL拼接 }
3.2 注入测试
- 确认注入确实存在
- 但使用
select等关键字时被拦截
3.3 框架防护机制
- 发现ServiceStack.OrmLite.OrmLiteUtils中有SQL注入检测
- 非法SQL片段令牌(IllegalSqlFragmentTokens)包含:
select, insert, delete, update, drop, alter, truncate, etc. - 框架级防护使注入利用困难
4. 越权漏洞利用
4.1 发现越权点
- 找到用户更新函数:
public ActionResult UpdateUser(UserModel user) { // 无权限控制 } - 该函数本应仅供管理员使用,但未做权限控制
- 普通用户可直接构造报文访问该函数
4.2 越权操作步骤
- 更新ID为1的用户(管理员)的邮箱为攻击者邮箱
- 通过密码找回功能发送重置链接至攻击者邮箱
- 重置管理员账户密码
4.3 成功获取管理员权限
- 使用重置后的密码登录系统
- 确认获得管理员权限
5. 最终Getshell
5.1 利用文件上传漏洞
- 使用管理员权限构造上传报文
- 上传ASP文件时发现会被删除
- 使用后缀名大小写绕过(如.aSp)
5.2 验证Getshell
- 访问上传的webshell文件
- 确认成功解析执行
6. 漏洞总结与防御建议
6.1 漏洞链
- 源码泄露漏洞 → 2. 权限绕过漏洞 → 3. 文件上传漏洞
6.2 防御建议
-
源码泄露防护:
- 禁用开发环境下的源码压缩包访问
- 生产环境移除调试和开发文件
-
文件上传安全:
- 实施严格的文件类型和后缀验证
- 不要依赖客户端提供的文件类型信息
- 使用白名单机制限制可上传文件类型
-
权限控制:
- 所有敏感操作实施严格的权限检查
- 遵循最小权限原则
-
SQL注入防护:
- 使用参数化查询
- 避免直接拼接SQL语句
-
密码重置安全:
- 实施多因素认证
- 对敏感操作(如邮箱修改)进行二次验证
-
输入验证:
- 对所有用户输入进行严格验证
- 实施服务器端验证,不依赖客户端验证