PHP代码注入漏洞深度解析:一个被低估的安全威胁
近期在排查一个线上应用的安全问题时,我们发现了一个普遍存在却又极易被忽略的代码执行漏洞,其原理与以下这段典型示例高度相似。
复制代码
代码如下:
$code="${${eval($_GET[c])}}";
?>
请注意这段代码。如果在浏览器中访问如下URL: https://www.phpeval.cn/test.php?c=phpinfo(); ,您会惊讶地发现,phpinfo()函数被成功执行了。若尝试传入c=echo 11111;,字符串“1111”也会被直接输出到页面。这清晰地证明了,攻击者通过URL参数注入的任意PHP代码已被服务器解析并运行。
实际上,许多PHP开发者在编写动态代码逻辑时,常常会误判这种风险。他们惯用的做法是将待执行的代码包裹在双引号内,并认为仅通过过滤用户输入中的双引号字符就能有效防御代码注入攻击。然而,这种防护措施是远远不够的,利用PHP变量变量的复杂语法特性,攻击者依然可以轻松绕过。
另一种常见但同样危险的使用模式如下所示:
复制代码
代码如下:
$code=addslashes($_GET[c]);
eval(""$code"");
?>
如果攻击者提交如下请求: https://www.site.cn/test.php?c=${${phpinfo()}};,那么phpinfo()函数同样会被执行。更高级的、具有隐蔽性的攻击手法是链式传递:
https://www.site.cn/test.php?c=${${eval($_GET[d])}};&d=phpinfo();
在此场景下,参数d所承载的恶意代码也将被成功解析与执行,使得安全防御变得更为困难。
彻底的安全加固方案
此类安全漏洞的根源在于对eval()函数的不当使用。eval函数会将传入的字符串参数直接作为PHP代码来执行,这为应用程序引入了极高的安全风险,极易导致远程代码执行(RCE)漏洞。因此,最根本且最有效的解决方案是在开发规范中明确禁止使用eval函数。对于必须实现的动态逻辑,应寻求使用更安全的替代方案,例如通过call_user_func()等函数进行严格控制的回调,或采用设计良好的数据驱动架构,从而在根源上杜绝代码注入攻击。
