PHP服务器安全审计:90%高危漏洞藏于配置末行
|
两个月之前,我蹲在IDC机柜前换一块坏了的RAID卡,风扇声像一千只鸭子在啃铁皮。监控大屏右下角弹出一条PHP-FPM进程OOM报警,我顺手切到ssh,cat /etc/php/8.1/fpm/pool.d/www.conf —— 然后就看见末行那行:env[LD_PRELOAD] = /var/lib/php/session/.so。不是注释,没加#,不是模板残留,就是活生生裸着的一行。我盯了十八秒,手机响了,是运维老张发来个捂眼哭笑表情包,配字:“备案号刚过审,CDN刷完缓存,蜘蛛昨天抓了三百七十二页”。
文章配图,仅供参考 我原以为是某个灰产脚本扫进来留的后门,结果一查git log,是三个月前小王提的PR,标题写着“优化session加载性能”,review人是我自己,我当时扫了三行diff,看到session.save_handler = files就点了approve。现在看,他把env[LD_PRELOAD]硬塞进pool配置里,和php.ini里的disable_functions完全不冲突——因为FPM池级env变量根本不在disable_functions管辖范围。这个我敢打包票,翻过源码,fpm_env.c第421行,setenv()调用前压根不走disable_functions校验链。 工位上还堆着昨天没拆的盒饭,酸辣粉汤渍在塑料盖边缘结了薄壳。我重新打开那个配置文件,手指悬在delete键上停了两秒,然后删掉了末行。没重启,先test -f /var/lib/php/session/.so —— 存在。再ps aux | grep ld_preload,没匹配。但你知道最气的是什么?那个.so文件mtime是上个月17号,比小王提PR早五天。也就是说,他不是写错了,是抄了别人现成的恶意模板,连时间戳都没改。我截图甩进群里,@了小王,他回了个“卧槽”,然后撤回,再发:“我抄的是知乎某篇‘PHP高性能技巧’…链接我找不到了。” 后来我们把全站32台PHP服务器的pool.d目录全pull下来grep -n "env\\[",发现29台有类似末行注入:有的是env[PATH]后面接了/var/tmp,有的是env[LD_LIBRARY_PATH]指向一个不存在的路径——但不存在不等于没风险,FPM照样读配置、照样尝试加载、照样报错日志里不打warning。而剩下3台,一台是新装机还没配池,一台是被安全组直接drop了所有env设置(管理员手动删了整段env块),还有一台……等等,这台我记不清了,这个我说不准。当时在腾讯云控制台切实例列表切快了,好像有个灰色小三角没点开。 办公室空调滴水,每四十七秒“嗒”一声,砸在隔壁工位的金属笔筒里。李姐端着保温杯路过,看我屏幕,说:“上次那个XXCMS插件审计也是,关键payload就藏在config.php最后一行空格后面。”我没接话。她走后我打开XXCMS的vendor目录,搜了下config.php,发现它结尾是?> (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Linux PHP开发环境搭建:零基础实战指南
PHP调试总卡壳?90%新手忽略的3个断点技巧
服务器安全审计:90%高危漏洞藏于日志盲区
PHP安全编码三大致命坑:90%站长都踩过
VR工程师转PHP:三天调试实战通关
PHP架构师私藏调试心法:3行代码秒定90%线上故障
PHP工程师破局:外链建设才是高并发系统的隐性权重杠杆

