-
Notifications
You must be signed in to change notification settings - Fork 153
Description
项目存在路径遍历/任意文件读取漏洞,可能导致敏感信息泄露,如果结合文件上传漏洞,甚至可能导致远程代码执行。
漏洞详情:
漏洞点:
漏洞存在于 app/yunshop.php 文件的 parseRoute 和 findRouteFile 方法中。
漏洞描述:
在 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 文件,然后通过路径遍历漏洞包含并执行它,从而完全控制服务器。
建议的修复措施:
- 严格输入验证和过滤: 对所有用户提供的、用于构建文件路径的输入(例如
route参数中的插件名)进行严格的验证和过滤。不允许使用路径遍历字符(例如.、..、/、\)。 - `白名单机制: 尽可能使用白名单机制,只允许已知的、合法的插件名称或文件路径。
- `使用 Laravel 提供的安全方法: 尽可能使用 Laravel Eloquent ORM 或 Query Builder 提供的安全方法来构建数据库查询,避免直接拼接用户输入到原始 SQL 语句中。
- `权限最小化: 确保运行应用程序的用户具有最小的权限,以限制潜在攻击的影响范围。
**禁用危险函数:** 如果某些 PHP 函数(如eval()、system()、exec()等)在应用程序中不是必需的,应在php.ini` 中禁用它们,以减少远程代码执行的风险。