Skip to content

路径遍历/任意文件读取漏洞 (Path Traversal / Arbitrary File Read) #9

@kai0sec

Description

@kai0sec

项目存在路径遍历/任意文件读取漏洞,可能导致敏感信息泄露,如果结合文件上传漏洞,甚至可能导致远程代码执行。

漏洞详情:

漏洞点:
漏洞存在于 app/yunshop.php 文件的 parseRoutefindRouteFile 方法中。

漏洞描述:
parseRoute 方法中,$pluginName 变量直接从用户输入 request()->input('route') 中获取,并且没有进行充分的路径清理或验证。这个 $pluginName 随后被用于构造文件路径,例如:$path = base_path() . '/plugins/' . $pluginName . '/src';

findRouteFile 方法中,这个可能被篡改的 $path 进一步被用于构造 $controllerFile$controllerFile = $path . ($isPlugin ? '/' : '/controllers/') . $ucFirstRoute . 'Controller.php';

如果 $pluginName 包含路径遍历字符(如 ../),攻击者就可以操控最终的文件路径,使其指向应用程序预期目录之外的任意文件。虽然代码中使用了 is_file() 进行文件存在性检查,但如果结合文件上传漏洞,或者服务器上存在其他可利用的 PHP 文件,这可能导致远程代码执行。

概念验证 (POC):
假设应用程序运行在 http://your-domain.com,并且 /addons/yun_shop/api.php 是一个可访问的入口点,它处理 route 参数。

HTTP 请求示例 (尝试读取 /etc/passwd 文件,假设为 Linux 服务器):

GET /addons/yun_shop/api.php?route=plugin.anything/../../../../../../etc/passwd HTTP/1.1
Host: your-domain.com

漏洞利用原理:
当后端收到这个请求时,YunShop::parseRoute 方法内部会拼接出类似 [base_path()]/plugins/anything/../../../../../../etc/passwd/src 的路径。通过一系列的 ../,这个路径会向上遍历目录,最终可能指向文件系统的根目录,然后尝试访问 /etc/passwd。这可能导致敏感文件的内容被读取。

影响:

  • 信息泄露: 攻击者可以读取服务器上的任意敏感文件(例如配置文件、日志文件、源代码等)。
  • 拒绝服务: 尝试包含非 PHP 文件或不存在的文件作为 PHP 代码可能导致应用程序崩溃。
  • 远程代码执行(潜在): 如果应用程序存在文件上传漏洞,攻击者可以上传一个恶意 PHP 文件,然后通过路径遍历漏洞包含并执行它,从而完全控制服务器。

建议的修复措施:

  1. 严格输入验证和过滤: 对所有用户提供的、用于构建文件路径的输入(例如 route 参数中的插件名)进行严格的验证和过滤。不允许使用路径遍历字符(例如 .../\)。
  2. `白名单机制: 尽可能使用白名单机制,只允许已知的、合法的插件名称或文件路径。
  3. `使用 Laravel 提供的安全方法: 尽可能使用 Laravel Eloquent ORM 或 Query Builder 提供的安全方法来构建数据库查询,避免直接拼接用户输入到原始 SQL 语句中。
  4. `权限最小化: 确保运行应用程序的用户具有最小的权限,以限制潜在攻击的影响范围。
  5. **禁用危险函数:** 如果某些 PHP 函数(如 eval()system()exec()等)在应用程序中不是必需的,应在php.ini` 中禁用它们,以减少远程代码执行的风险。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions