eval注入是一种高危代码执行漏洞,攻击者通过向eval函数传入恶意字符串,可在目标系统上执行任意PHP代码,直接导致服务器沦陷。该漏洞的根本原因在于动态执行用户输入未做充分过滤,任何允许用户控制输入参数的eval调用都是潜在风险点。据OWASP《Top 10 Web Application Security Risks》数据,注入类漏洞长期位居威胁排行榜前三,其中eval注入因其破坏力极强而被列为关键高危项。
eval函数将字符串参数作为PHP代码执行,与直接编写代码无异。当程序接收用户输入并拼接到eval参数中时,攻击者可通过闭合语句、插入恶意代码实现控制。例如以下代码存在脆弱点:
<?php
$code = $_GET['code'];
eval('$result = ' . $code . ';');
?>攻击者传入code=1; system('id');即可执行系统命令。这种漏洞常见于动态计算、模板引擎、CMS插件等场景。
场景一:动态方程计算。在线计算器或数学公式解析功能中,开发者直接使用eval计算表达式,未做任何过滤。场景二:模板引擎的变量替换。部分简陋模板引擎将用户传入的模板字符串直接eval,导致代码执行。场景三:CMS插件中的配置项。某些插件允许管理员填写PHP代码作为配置,若未做权限校验,低权限用户也可能利用。各场景的风险等级对比如下:
| 场景 | 攻击难度 | 危害程度 | 典型防御 |
|---|---|---|---|
| 动态方程计算 | 低 | 高 | 使用数学表达式解析库 |
| 模板引擎变量替换 | 中 | 高 | 禁用eval,改用编译型模板 |
| CMS配置项 | 中 | 极高 | 严格权限控制+白名单 |
许多开发者尝试用正则或关键词黑名单阻止eval注入,但攻击者有多种绕过方式。例如过滤system、exec等函数,仍可通过passthru、shell_exec、proc_open等替代函数执行命令。或者使用字符串拼接、base64_decode、chr函数组合构造恶意代码。以下表格对比常见过滤与绕过方法:
| 过滤方式 | 绕过方法示例 | 成功率 |
|---|---|---|
过滤system关键词 | s"yst"em使用双引号拼接 | 高 |
过滤eval调用 | assert($_POST['c']);利用assert同样执行代码 | 高 |
| 过滤括号 | require 'shell.php';通过文件包含间接执行 | 中 |
更隐蔽的绕过方式包括利用preg_replace的/e修饰符(PHP 5.5之前)或create_function(已废弃)等历史遗留函数。
最彻底的防御是避免使用eval函数,改用安全的替代方案。例如动态计算使用数学表达式解析器(如MathParser库),模板引擎选用Smarty、Twig等编译型方案。若必须使用eval,需严格限制输入:
disable_functions禁止所有危险函数)。另外,代码审计时需重点关注eval、assert、preg_replace(/e)、create_function、call_user_func等动态执行函数,检查入参是否可控。通过静态分析工具(如PHPStan、RIPS)可自动发现大部分隐患。
评论
加载中...