eval()函数最直接严重风险是远程代码执行(RCE),攻击者通过未过滤的用户输入(如$_GET['code'])注入任意PHP代码,实现服务器完全控制,典型利用包括执行系统命令、读取敏感文件、写入Webshell。

PHP 的 eval() 函数最直接、最严重的风险是远程代码执行(RCE)——攻击者一旦控制其输入,就能在服务器上执行任意 PHP 代码,等同于拿下整台服务器。
核心漏洞类型
代码注入(Code Injection)
当用户可控数据(如 $_GET['code']、$_POST['expr'])未经校验就拼入 eval(),攻击者可注入完整 PHP 语句。例如:
-
?code=system('id');→ 执行系统命令 -
?code=file_get_contents('/etc/passwd');→ 读取敏感文件 -
?code=include '/var/www/shell.php';→ 加载 Webshell
典型危险调用模式
以下写法几乎必然导致高危漏洞:
-
eval($_REQUEST['input']);(全参数通吃,最危险) -
eval("echo $_GET['data'];");(字符串拼接闭合被绕过) -
$func = $_GET['callback']; eval("$func();");(动态函数调用+eval 双重放大) -
assert($_POST['a']);(PHP 7.1 之前等效于 eval,常被用于绕过 WAF)
为什么过滤/转义基本无效?
因为 eval() 执行的是语法完整的 PHP 代码,不是普通字符串。常见误区:
立即学习“PHP免费学习笔记(深入)”;
- 用
addslashes()或htmlspecialchars()处理变量 → 无法阻止语句级注入(如"); system('ls'); //) - 只检查单个变量内容 → 攻击者通过破坏整体语句结构实现注入(如闭合引号、插入分号、注释后续代码)
- 依赖简单关键词黑名单(如屏蔽
system)→ 易被大小写、编码、拼接、反射等方式绕过
连带危害不止于 RCE
成功利用后往往引发连锁风险:
- 横向渗透:通过
exec('ssh ...')或数据库连接跳转内网 - 持久化后门:写入一句话木马、篡改配置文件、创建隐藏管理员账号
- 数据泄露:读取
.env、数据库凭证、JWT 密钥、源码 - 拒绝服务:执行
while(1) sleep(1);或shell_exec('rm -rf /');



















