PHP服务器安全审计:90%高危漏洞藏于配置末行
; extension=openssl.so
extension=eval.so 不是注释。是活的。就那么裸着。没分号,没空
|
两个月之前,我替一个老站长救急,他域名都快被墙成筛子了,SSH一登进去,php.ini尾巴上飘着三行红字—— ; extension=gd.so 不是注释。是活的。就那么裸着。没分号,没空格,eval.so 后面还跟了个换行符,像刚被人用手指头戳进去的。 我盯着看了十八秒。手悬在键盘上没动。隔壁机房空调外机突然啸叫,持续了七秒,那种低频震得我左耳耳膜发痒——这玩意儿去年换过三次滤网,修它的人姓陈,总把扳手塞进牛仔裤后袋,走路一颠一颠的。 我原以为是运维半夜手抖抄错了配置模板。结果翻到 /etc/php/7.4/apache2/conf.d/99-custom.ini,末尾赫然又是三行:extension=pcntl.so、extension=sockets.so、extension=sysvshm.so。全开着。没人动过。连个时间戳都没有。只有监控大屏右下角在闪,蓝光一跳一跳,像心电图平线里偷偷爬出的早搏。 这哪是配PHP?这是给黑客递刀,还帮着磨了刃。 你知道最荒诞的是什么吗?不是那个站点被黑完拖去挖矿——是他们在查日志时发现,攻击链起点是 phpinfo() 页面里的“Loaded Configuration File”路径,往下扫了一眼,直接切到文件末尾,改了两行……就进来了。连SQL注入都没用上。纯靠你亲手写的最后一行。 我见过三个版本的灾难现场: 我敢打包票:你服务器上至少有两个 php.ini 或 .user.ini,它们不在同一级目录,内容也不同步。不信你现在 ssh 进去,敲 php --ini,看输出的“Additional .ini files parsed”那串路径,然后 cd 过去 ls -la,数数哪个文件修改时间最新。别信 git log,别信部署脚本,信最后那行回车前的空格有没有对齐。 那天下午三点十七分,运维老张来办公室递烟,打火机盖弹开时“咔”一声脆响,他右手小指指甲缝里嵌着蓝色绝缘胶带残渣——上个月贴过交换机标签。他说:“你非说末行有问题,那咱俩一起逐行 diff?”我摆手说不用。我说:“你先把 php-fpm.conf 里 pm.max_children 后面那行删了。”他愣住:“后面?后面是空行啊。”我摇头:“空行也是行。上面那行没回车,你粘贴时多按了一次 Ctrl+V,末尾混进了 invisible zero-width space。”他当场打开 vim :set list,光标停在那行末尾——果然,有个 ^@ 在闪。 优胜劣汰是真的。真不是我吓唬人。三个月前群里有个人晒优化成果,PHP响应从382毫秒干到215,配图全是缓存命中率和OPcache hit rate,底下有人问:“disable_functions里留了 pcntl_fork 吗?”他回:“留了,有用。”没人接话。第二天他站打不开,源码里多了个 /wp-content/mu-plugins/.sys/ ——里头全是进程劫持 shell,入口就是 pcntl_fork + stream_socket_client。 窗外天黑得特别早,才五点四十一分,路灯就自动亮了。我关掉浏览器第27个标签页(里面还在跑 php -v 测试结果),剩下那三个标签页分别是 tail -f /var/log/apache2/error.log、vim /etc/php/8.1/cli/php.ini、和一个微信对话框——运营小林刚发来截图:“客户说后台上传不了头像,是不是CDN缓存问题?”我拇指悬在键盘上方,没回。 说句难听的:很多人的“安全加固”,其实是在给木桶补最上面那块板。而PHP配置的末行,往往是桶底唯一没补漆的裂缝。你以为你在加固系统,其实你在为0day铺红毯——还是带绒布滚边的那种。 上次审计完那个站,我在本地搭了个沙盒,装了七个不同小版本的PHP,每个都故意在 php.ini 最后补了半行不完整语法,然后跑 test.php 里只有一行 ——六个报错,一个不报,还继续执行。猜猜是哪个?是 7.4.33。不是最新版,也不是最旧版。就是它。它会吞掉末行语法错误,静默加载。这事我没写进报告,怕客户以为我在甩锅。我只在交接单手写了一句:“请确认所有 php.ini 的最后一行是空行,且该空行必须含 LF。” 桌上的外卖盒还没拆,辣子鸡丁已经凝出一层红油。我把它推到显示器右边,挡住右下角那个一直在闪的告警图标——是zabbix,不是阿里云。闪的是“PHP-FPM pool www process number exceeds limit”,但真正该报警的,是 /etc/php//apache2/php.ini 结尾处那个没写完的 extension=imap.so… 算了,先不动它。 你要真想干点啥,今晚回去就做三件事:
文章配图,仅供参考 3. 别再信“配置已同步”的口头承诺。同步的永远是中间段,末行是活的,会呼吸,会繁殖,会在你提交前一分钟自己长出来。我不确定这方法能防住APT组织。但我敢说,它拦得住90%的扫荡型黑产。剩下的事……等下次再聊。我得去把老张塞进抽屉里的那包烟摸出来,他忘了拿走,烟盒侧面印着“金芒果”,是去年园区年会发的。抽一根压压惊。 (编辑:PHP编程网 - 金华站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


PHP调试总卡壳?16年日志老炮3步揪出90%隐藏Bug
90%高危漏洞藏于日志盲区:服务器安全审计实战
PHP调试总卡壳?9年容器运维师揭秘3个被忽略的断点技巧
PHP安全编码三大致命坑:15年网安工程师亲述
多媒体服务器安全审计:90%漏洞源于3个被忽视配置
PHP工程师必避的5大服务器选型陷阱与调优实战
VR工程师转PHP:3天调试实战通关


浙公网安备 33038102330481号