eval注入漏洞的利用原理与防御方案

eval注入漏洞的利用原理与防御方案

1024KB1024KB 网络安全与合规 2026-08-19 11:59:12 浏览 58197 字数 909

eval注入是一种高危代码执行漏洞,攻击者通过向eval函数传入恶意字符串,可在目标系统上执行任意PHP代码,直接导致服务器沦陷。该漏洞的根本原因在于动态执行用户输入未做充分过滤,任何允许用户控制输入参数的eval调用都是潜在风险点。据OWASP《Top 10 Web Application Security Risks》数据,注入类漏洞长期位居威胁排行榜前三,其中eval注入因其破坏力极强而被列为关键高危项。

eval注入的原理

eval函数将字符串参数作为PHP代码执行,与直接编写代码无异。当程序接收用户输入并拼接到eval参数中时,攻击者可通过闭合语句、插入恶意代码实现控制。例如以下代码存在脆弱点:

<?php
$code = $_GET['code'];
eval('$result = ' . $code . ';');
?>

攻击者传入code=1; system('id');即可执行系统命令。这种漏洞常见于动态计算、模板引擎、CMS插件等场景。

eval注入的常见利用场景

场景一:动态方程计算。在线计算器或数学公式解析功能中,开发者直接使用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,需严格限制输入:

  • 对输入内容进行白名单校验,仅允许特定字符集(如数字和运算符)。
  • 使用正则匹配确保输入格式符合预期,拒绝任何非预期字符。
  • 在沙箱环境中执行eval,并限制函数白名单(如disable_functions禁止所有危险函数)。

另外,代码审计时需重点关注eval、assert、preg_replace(/e)、create_function、call_user_func等动态执行函数,检查入参是否可控。通过静态分析工具(如PHPStan、RIPS)可自动发现大部分隐患。

分享到:

评论

加载中...
我
还没有评论,快来抢沙发吧~