摘要本文是 bWAPP 靶场系列的第九篇聚焦于PHP Code InjectionPHP 代码注入漏洞。文章从零基础角度出发首先讲解什么是 PHP 代码注入、它和 OS 命令注入的本质区别、为什么eval()函数如此危险。随后按照 Low、Medium、High 三个安全级别逐一进行源码分析、通关演示和防御方案讲解。特别地本文加入了大量真实世界的经典案例——从 2026 年刚刚曝光的 MetInfo CMS 未授权代码注入CVE-2026-29014CVSS 9.8到 Mirasvit Magento 扩展的 PHP 对象注入CVE-2026-45247再到 Everest Forms Pro WordPress 插件被黑客在野利用——帮助读者理解这个漏洞在现实世界中的毁灭性威力。一、前言在前八篇文章中我们分别介绍了环境搭建、三种反射型 HTML 注入、存储型 HTML 注入、iFrame 注入以及普通型和盲注型的 OS 命令注入。这些漏洞的共同点是攻击者通过注入“数据”来达到攻击目的。但今天我们要讲的漏洞攻击方式完全不同。PHP 代码注入PHP Code Injection——攻击者不再满足于注入“命令”或“标签”而是直接在服务器上注入并执行 PHP 代码还记得我们之前讲的 OS 命令注入吗攻击者通过注入; whoami来执行系统命令。而 PHP 代码注入更进一步攻击者直接注入 PHP 代码本身——比如phpinfo()、system(id)、甚至是一整套 Webshell。如果说 OS 命令注入是“让服务器执行外部命令”那 PHP 代码注入就是“让服务器执行攻击者编写的程序”。两者的区别就像“让人去跑腿买东西”和“让人完全按你的指令行事”——后者拥有完全的掌控力。二、PHP 代码注入概述2.1 什么是 PHP 代码注入PHP 代码注入PHP Code Injection是指攻击者通过未经验证的用户输入将恶意的 PHP 代码注入到应用程序中并被服务器成功解析和执行的一种攻击方式。简单来说你输入了什么 PHP 代码服务器就执行什么 PHP 代码。一个最典型的例子?php $input $_GET[code]; eval(echo . $input . ;); ?如果用户正常输入123服务器执行的代码是eval(echo 123;);但如果用户输入的是123; phpinfo(); //服务器执行的代码变成了eval(echo 123; phpinfo(); //;);phpinfo()被执行了服务器把所有的 PHP 配置信息都展示给了攻击者——数据库密码、文件路径、PHP 版本……一切尽收眼底。2.2 PHP 代码注入 vs OS 命令注入——一张表说清楚这是初学者最容易混淆的概念。我们用一张表彻底讲明白对比维度OS 命令注入PHP 代码注入注入内容操作系统命令如whoami、lsPHP 代码如phpinfo()、system()执行环境Shell命令行解释器PHP 解释器典型函数system()、exec()、shell_exec()eval()、assert()、preg_replace()的/e修饰符可控范围操作系统命令集整个 PHP 语言包括调用系统命令灵活性受限于 Shell 命令极高——可以写任意复杂的程序危害等级极高极高且更灵活关键区别OS 命令注入只能执行“命令”而 PHP 代码注入可以执行“程序”——你可以写循环、写函数、写文件、建立网络连接……理论上可以做任何 PHP 能做的事。2.3 为什么会产生 PHP 代码注入漏洞根本原因只有一句话应用程序使用了危险的代码执行函数且用户输入被直接传递给了这些函数没有经过任何过滤或验证。最危险的 PHP 函数包括函数作用风险等级eval()将字符串作为 PHP 代码执行极高assert()检查断言也可执行代码极高preg_replace()的/e修饰符将替换内容作为 PHP 代码执行极高PHP 7 已移除create_function()创建匿名函数并执行高include()/require()包含并执行文件高配合文件包含漏洞其中eval()是最危险的官方文档明确警告“eval()语言构造非常危险因为它允许执行任意 PHP 代码。因此不鼓励使用它。”2.4 PHP 代码注入的危害PHP 代码注入的危害是所有 Web 漏洞中最严重的之一完全控制 Web 应用攻击者可以执行任意 PHP 代码相当于拿到了 Web 应用的“管理权限”读取任意文件通过file_get_contents()读取配置文件、源代码、数据库密码写入 Webshell通过file_put_contents()在服务器上写入一个后门文件实现持久化控制执行系统命令通过system()、exec()等函数执行任意操作系统命令操作数据库通过 PHP 的数据库扩展直接读写数据库内网渗透以 Web 服务器为跳板攻击内网其他系统三、PHP 代码注入的历史背景与真实案例3.1 历史背景从“动态执行”到“安全噩梦”PHP 作为一种灵活的脚本语言提供了eval()等动态代码执行能力。这种能力在早期被广泛用于模板引擎、配置系统、动态函数调用等场景——开发者可以把“代码”当作“数据”来处理。然而灵活性往往伴随着安全风险。当开发者开始把用户输入直接传给eval()时灾难就开始了。2000 年代初随着 PHP 的普及PHP 代码注入漏洞开始大量涌现。最典型的是preg_replace()的/e修饰符——它允许在正则表达式替换时执行 PHP 代码被大量滥用。PHP 官方在 PHP 5.5.0 中废弃了/e修饰符在 PHP 7.0.0 中彻底移除了它。但eval()依然存在依然被大量开发者使用尤其是在 CMS、模板引擎和配置系统中——漏洞也依然存在。3.2 经典案例一MetInfo CMS 未授权 PHP 代码注入CVE-2026-29014时间2026 年 4-5 月编号CVE-2026-29014CVSS 评分9.8严重这是离我们最近、影响范围极广的一个 PHP 代码注入案例。MetInfo 是一款开源的企业内容管理系统CMS在中国拥有大量用户。安全研究人员 Egidio Romano 发现MetInfo CMS 7.9、8.0 和 8.1 版本中存在一个未认证的 PHP 代码注入漏洞。漏洞根源在/app/system/weixin/include/class/weixinreply.class.php文件中程序在处理微信 API 请求时没有对用户输入进行充分的过滤和净化导致远程、未认证的攻击者可以注入并执行任意 PHP 代码。攻击方式攻击者只需发送精心构造的请求携带恶意 PHP 代码即可在目标服务器上以 Web 服务器权限执行任意代码。影响攻击者可以完全控制受影响的服务器。在野利用该漏洞于 2026 年 4 月 7 日被修复但4 月 25 日起已被黑客在野利用。到 5 月 1 日针对中国和香港 IP 地址的攻击活动大幅激增。目前互联网上仍有约 2000 个 MetInfo 实例可被访问大部分位于中国。3.3 经典案例二Mirasvit Magento 扩展 PHP 对象注入CVE-2026-45247时间2026 年 5-6 月编号CVE-2026-45247CVSS 评分9.8严重MagentoAdobe Commerce是全球最流行的电子商务平台之一。Mirasvit Full Page Cache Warmer 是一个被成千上万家 Magento 商店使用的扩展插件。安全研究人员发现该扩展的CacheWarmer cookie存在一个PHP 对象注入漏洞——攻击者可以将精心构造的序列化 PHP 对象注入到 cookie 中当服务器反序列化这些对象时配合 Magento 及其依赖库中已有的gadget chain利用链可以实现远程代码执行RCE。最可怕的是该漏洞无需身份验证即可利用。攻击者不需要任何用户名和密码只要向目标网站发送一个恶意 cookie就能执行任意 PHP 代码。CISA 介入美国网络安全和基础设施安全局CISA将该漏洞添加到已知被利用漏洞目录KEV要求联邦机构在3 天内完成修补。3.4 经典案例三Everest Forms Pro WordPress 插件——黑客在野利用时间2026 年 6 月编号CVE-2026-3300CVSS 评分9.8严重Everest Forms Pro 是一个流行的 WordPress 表单构建插件。安全研究人员发现该插件的Complex Calculation复杂计算功能存在 PHP 代码注入漏洞——攻击者可以在表单字段中注入 PHP 代码实现未认证的远程代码执行。在野利用该漏洞已在野外被积极利用长达两个月。攻击者注入的 PHP 代码会调用 WordPress 的wp_insert_user()函数创建一个新的管理员账户用户名为“diksimarina”从而完全控制受害网站。这个案例的警示意义插件生态是攻击的重灾区——WordPress 插件数量庞大质量参差不齐PHP 代码注入可以导致完全的控制权沦陷——攻击者直接创建管理员账户漏洞披露后迅速被利用——防御必须争分夺秒3.5 经典案例四Code Snippets WordPress 插件CVE-2025-13035时间2025 年编号CVE-2025-13035Code Snippets 是一个允许用户在 WordPress 管理后台直接添加和管理 PHP 代码片段的插件——这本身就是一个“高危”功能。研究人员发现该插件 3.9.1 及之前的所有版本都存在PHP 代码注入漏洞。攻击者可以利用该漏洞注入并执行任意 PHP 代码。讽刺的是一个专门用于“管理 PHP 代码”的插件因为对用户输入处理不当反而成了代码注入的入口。四、bWAPP PHP Code Injection 漏洞实战了解了 PHP 代码注入的基础知识和真实案例后现在让我们进入 bWAPP 靶场亲手体验这个漏洞的攻防全过程。4.1 漏洞页面介绍在 bWAPP 主界面选择PHP Code Injection点击“Hack”按钮进入漏洞页面。这个页面的功能是页面会显示信息参数你输入的内容。关键点这个“消息”不是简单地显示在页面上而是被当作 PHP 代码执行页面的 URL 类似http://localhost/bWAPP/phpi.php?messagehello当你访问这个 URL 时message参数的值会被传递给 PHP 的eval()函数执行。五、Low 安全级别5.1 通关步骤将安全级别设置为Low然后开始攻击。步骤一正常使用功能在浏览器地址栏中访问http://localhost/bWAPP/phpi.php?messagehello页面会显示hello——看起来就是一个普通的页面没有什么特别之处。步骤二注入 phpinfo()——查看服务器配置核心现在将message参数的值改为phpinfo()http://localhost/bWAPP/phpi.php?messagephpinfo()发生了什么页面不再是显示“phpinfo()”这个字符串而是直接显示了一整页的 PHP 配置信息——PHP 版本、已加载的扩展、服务器 API、环境变量、配置路径……这说明什么phpinfo()被当作 PHP 代码成功执行了步骤三注入 system()——执行系统命令既然可以执行任意 PHP 代码那就可以通过 PHP 的system()函数来执行操作系统命令http://localhost/bWAPP/phpi.php?messagesystem(whoami)页面会显示当前 Web 服务器运行的用户名如www或daemon。http://localhost/bWAPP/phpi.php?messagesystem(id)显示当前用户的 ID 信息。http://localhost/bWAPP/phpi.php?messagesystem(ls -la)列出当前目录下的所有文件。步骤四读取敏感文件通过 PHP 的file_get_contents()读取系统文件http://localhost/bWAPP/phpi.php?messageprint_r(file_get_contents(/etc/passwd))在 Linux 系统中这会显示/etc/passwd文件的内容——所有系统用户的列表。步骤五写入 Webshell最危险攻击者可以写入一个永久的后门文件http://localhost/bWAPP/phpi.php?messagefile_put_contents(shell.php, ?php system($_GET[cmd]); ?)这会在服务器上创建一个名为shell.php的文件内容是一个一句话木马。之后攻击者只需访问http://localhost/bWAPP/shell.php?cmdwhoami就可以随时执行任意系统命令——服务器已被完全控制。5.2 源码分析打开 bWAPP 源码目录下的phpi.php文件查看 Low 级别的核心代码?php if(isset($_REQUEST[message])) { // Low级别security_level0 才会进入eval执行分支 if($_COOKIE[security_level] ! 1 $_COOKIE[security_level] ! 2) { eval (echo . $_REQUEST[message] . ;); } } ?代码解析接收参数方式为$_REQUEST[message]支持 GET/POST 传参并非原文只写的$_GET[message]执行逻辑受 Cookiesecurity_level控制仅当安全等级不为 Medium (1)、High (2) 时即 Low0才会执行 eval用户可控输入message无任何过滤、校验直接拼接进 eval 函数内执行 PHP 代码内置错误抑制符代码执行报错不会直接抛出页面当我们输入phpinfo()时实际执行的代码是eval(echo . phpinfo() . ;); // 拼接完整字符串 eval(echo phpinfo();); // PHP解释器执行 echo phpinfo();phpinfo()作为合法 PHP 函数直接被执行页面输出 PHP 环境信息。漏洞根源危险函数eval()直接拼接、执行未经任何过滤校验的用户可控输入攻击者可传入任意 PHP 语句实现代码执行。5.3 如何防御对于 Low 级别暴露的 PHP 代码注入漏洞分层给出可靠防御措施方案一彻底弃用 eval ()最优、推荐首选eval 属于高危危险函数仅展示文本的业务场景完全不需要动态执行 PHP 代码直接转义输出即可// 移除eval危险执行逻辑 // eval (echo . $_REQUEST[message] . ;); // 纯文本输出htmlspecialchars转义特殊字符同时防御XSS echo htmlspecialchars($_REQUEST[message], ENT_QUOTES, UTF-8);方案二业务强制要求动态执行代码使用严格白名单校验仅放行预设允许的内容不在白名单内直接拦截杜绝任意代码传入$message $_REQUEST[message]; // 预设合法内容白名单 $allowed [hello, world, test]; if (in_array($message, $allowed)) { eval(echo . $message . ;); } else { echo font color\red\Invalid input/font; }六、Medium 安全级别6.1 通关步骤将安全级别切换为Medium再次访问页面。尝试一直接注入 phpinfo()输入之前的 payloadhttp://localhost/bWAPP/phpi.php?messagephpinfo()点击访问——不成功页面显示的是phpinfo()这个字符串本身而不是执行结果。尝试二尝试绕过构造 Payload1;phpinfo()访问链接http://localhost/bWAPP/phpi.php?message1;phpinfo()页面依旧纯文本输出1;phpinfo()后端没有执行任何 PHP 代码注入失效。6.2 源码分析Medium 级别的核心代码if(isset($_REQUEST[message])) { // Low级别(0)存在eval触发PHP代码注入 if($_COOKIE[security_level] ! 1 $_COOKIE[security_level] ! 2) { ? pi?php eval (echo . $_REQUEST[message] . ;);?/i/p ?php } // Medium(1)、High(2)共用同一套安全处理逻辑 else { ? pi?php echo htmlspecialchars($_REQUEST[message], ENT_QUOTES, UTF-8);?/i/p ?php } }代码解析参数接收使用$_REQUEST[message]同时兼容 GET、POST 两种传参方式仅 Low 等级会进入eval()动态执行 PHP 代码分支Medium、High 全部跳过 eval 执行逻辑页面直接原生调用htmlspecialchars()处理输出htmlspecialchars仅转义 HTML 特殊字符 不会过滤; ( ) $等 PHP 语法符号但缺少 eval 执行环境代码无法解析运行。6.3 如何防御Medium 级别的防护逻辑具备根本性安全核心优势不在于字符过滤而是彻底移除高危函数 eval ()消除攻击入口PHP 代码注入成立的核心条件是eval()、assert()等动态执行函数舍弃 eval 后不存在代码执行土壤叠加 XSS 防护htmlspecialchars转义输出同步防御跨站脚本漏洞无绕过风险区别于依靠黑名单过滤的防护手段根源杜绝漏洞不存在绕过 Payload。七、High 安全级别High高级等级说明将 Cookie 修改为security_level2切换高级后端代码、执行逻辑、防护效果与 Medium 完全一致同样不再调用 eval 函数仅使用 htmlspecialchars 转义输入后输出所有 PHP 代码注入 Payload 均无法执行不存在任何注入漏洞区分 1 和 2 仅为 bWAPP 全站统一三级 UI 模板、适配自动化批量测试脚本设计本页面无分层防护逻辑高级无需单独重复实验步骤与源码分析测试效果、安全结论和中级完全相同。八、三种安全级别对比总结级别是否使用 eval()输入处理漏洞状态Low使用eval()无任何过滤存在严重漏洞Medium移除eval()htmlspecialchars()转义安全High移除eval()htmlspecialchars()转义安全九、PHP 代码注入的防御方案总结9.1 开发人员必知的防御措施方案一彻底避免使用 eval()最核心这是防御 PHP 代码注入最根本、最有效的方法。// 危险永远不要这样做 eval(echo . $user_input . ;); ​ // 安全直接输出 echo htmlspecialchars($user_input, ENT_QUOTES, UTF-8);官方 PHP 手册明确警告“eval()语言构造非常危险因为它允许执行任意 PHP 代码。因此不鼓励使用它。”什么时候可以接受使用eval()几乎从不。如果确实需要动态执行代码如模板引擎应该使用成熟的、经过安全审计的第三方库如 Twig、Smarty而不是自己用eval()实现。方案二禁用危险函数在php.ini中通过disable_functions禁用危险函数disable_functions eval, assert, system, exec, shell_exec, passthru, popen, proc_open注意eval()是语言构造而非函数无法通过disable_functions禁用。要禁用eval()需要使用 PHP 扩展如suhosin或通过 opcache 的blacklist功能。方案三输入验证白名单如果确实需要用户输入来控制程序逻辑使用白名单验证$allowed_actions [view, edit, delete]; if (!in_array($_GET[action], $allowed_actions)) { die(Invalid action); } // 安全地使用 $action方案四最小权限原则Web 服务器应该以最低权限用户运行如www而不是root。即使发生代码注入攻击者的破坏范围也有限。方案五使用安全的模板引擎如果需要在页面中嵌入动态内容使用成熟的模板引擎如 Twig、Smarty它们默认会对输出进行安全转义并且不会使用eval()来执行用户代码。9.2 安全测试人员必知的检测方法基础检测在参数中注入phpinfo()观察是否显示 PHP 配置信息。系统命令检测注入system(whoami)观察是否返回用户名。文件操作检测注入file_put_contents(test.txt, test)然后尝试访问test.txt。查看页面源码如果页面显示了、等字符的 HTML 实体lt;、gt;说明使用了htmlspecialchars()转义。测试不同参数不要只盯着message测试所有用户可控的参数。十、总结通过本次对bWAPP平台PHP代码注入漏洞的完整学习我们系统梳理了该漏洞的核心原理、分级特征、危害差异、真实漏洞案例与标准化防御规范PHP代码注入是攻击者借助未校验的可控输入插入恶意PHP代码由服务端解析执行的高危漏洞其与OS命令注入核心区别为前者执行PHP脚本、后者调用系统指令PHP代码注入攻击手段更灵活、造成的危害更严重eval()、assert()、带/e修饰符的preg_replace()均为易触发该漏洞的高危函数其中eval()风险最高靶场phpi.php页面划分三档安全等级Low级别直接拼接用户输入至eval函数且无任何过滤可实现任意PHP代码执行存在严重安全漏洞Medium与High级别处理逻辑完全一致均彻底移除eval执行逻辑并搭配htmlspecialchars做HTML实体转义输出不存在代码注入利用空间该类漏洞广泛存在于各类商用CMS、WordPress插件与商城拓展中如MetInfo CMS、Mirasvat Magento扩展、Everest Forms Pro、Code Snippets等多款组件均爆出过高评分远程代码执行漏洞部分漏洞已出现在野攻击利用厂商及安全机构要求紧急修复综合防护核心准则为业务无刚需则坚决避免使用eval等动态执行函数处理用户输入输出内容统一做HTML实体编码输入校验采用严格白名单机制服务器配置禁用高危执行函数同时服务进程遵循最小权限部署从代码、配置、权限多层维度杜绝PHP代码注入风险。写在最后PHP 代码注入是 Web 安全中最危险的漏洞类型之一。它让攻击者从“注入数据”升级到了“注入程序”——这不再是信息泄露的问题而是服务器完全沦陷的问题。从 2026 年刚刚曝光的 MetInfo CMS 漏洞到影响数千家 Magento 商店的 Mirasvit 漏洞再到 WordPress 插件生态中不断涌现的代码注入——PHP 代码注入从未消失而且正在变得更加普遍。记住三句话eval()是恶魔——永远不要用它处理用户输入用户输入是数据不是代码——永远不要把数据当代码执行移除eval()就移除了 PHP 代码注入的最大入口重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。