游客发表

phpeval函数漏洞利用

发帖时间:2026-10-17 04:53:11

一个不起眼的数漏搜索框,一段被忽略的洞利输入,就可能让整个服务器沦陷。数漏eval()函数在PHP里就像一把双刃剑——它能把字符串当代码执行,洞利方便是数漏真方便,但一旦被攻击者摸到入口,洞利后果直接是数漏灾难性的。

举个真实案例。洞利某年某电商后台的数漏优惠券模块,程序员为了“灵活”处理模板,洞利写了这么一行:eval('$result = '.$user_input.';')。数漏用户输入的洞利是数字,比如5,数漏代码就变成$result = 5;。洞利看起来没毛病。数漏可攻击者输入的不是数字,而是1;system('cat /etc/passwd');//,那这行代码就变成了$result = 1;system('cat /etc/passwd');//;。服务器直接乖乖吐出系统文件。整个过程不需要任何花哨工具,一个HTTP请求就完事。

漏洞的本质在于,eval()执行的内容里混入了用户可控数据,而你却没有做任何过滤。PHP官方手册里白纸黑字写着“eval()语言结构是非常危险的”,但架不住总有开发者图省事。我见过不少老项目,代码里到处是eval()拼接变量,问就是“之前的人这么写的,我改不动”。

更隐蔽的利用方式藏在二次编码和拼接逻辑里。攻击者可以先把payload做URL编码,或者利用数组键名绕过简单的正则过滤。比如你过滤了system,人家改用sys\u0074em(PHP 7+支持unicode转义),照样执行。又或者,你只检查了$_POST['data'],但人家通过$_COOKIE传参,你根本没防到那一路。

修复方案不复杂,核心就一条:永远不要将用户输入直接或间接拼入eval()。如果非用不可,那就白名单——只允许预定义好的几个值,其他一律拒绝。更稳妥的做法是彻底抛弃eval(),改用call_user_func()配合反射,或者干脆用模板引擎的变量赋值机制。

我见过一个开发团队,被eval()漏洞搞到服务器被挖矿程序植入,CPU飙到100%,最后花了三天清理后门。负责人后来在代码评审里立了规矩:谁再写eval(),谁请全组喝奶茶。这办法虽然粗暴,但比任何安全文档都管用。

说到底,eval()不是不能碰,但碰之前得问自己三遍:这数据源头可信吗?过滤彻底了吗?有没有更安全的替代方案?答案只要有一丝犹豫,那就别用。安全这行,偷懒的代价从来都是翻倍的。

    热门排行

    友情链接