建站新手必避的7大运维坑:第5个数据泄露风险90%人忽视
|
凌晨三点十七分,告警声像指甲刮黑板——不是短信,是机房顶灯突然全亮的那种物理告警。我摸手机的时候听见空调嗡的一声抽停,冷风直接糊在后颈上,湿的。DBA老周在微信里发了个“?”,没语音,就一个问号,后面跟了个咖啡杯emoji,但那个杯子是空的。我回他“nginx日志里搜‘phpinfo’”,他三秒后回“刚清了三台”,然后就没音了。对面工位后端小杨换了一双拖鞋,灰蓝条纹,左脚后跟磨得发白。 去年中考期间,教育局那套报名系统被扫出三百七十二条告警,其中三百六十九条来自同一段URL:/wp-content/plugins/seo-by-rank-math/admin/class-rank-math-admin.php?tab=import_export&step=export&file=../../../../etc/passwd。你猜怎么着?他们压根没装Rank Math——那是个镜像站,用Docker Compose起的测试环境,忘了关调试模式,连带把整个宿主机的/var/run/docker.sock挂进去了。老板当时在会议室跟教委领导讲“国产信创替代方案”,我蹲在机柜底下拔网线,手抖得差点把光模块磕碎。这哪是建站?这是拿生产网当靶场打彩弹。
文章配图,仅供参考 第5个坑——就是这个:临时测试环境开着debug=true、.env暴露、phpinfo()开着、git目录没删、备份文件放webroot下、config.php.bak权限777,还美其名曰“方便排查”。我原以为是权限配置疏忽,结果翻日志发现——是开发本地起的Docker,commit推到GitLab时自动触发CI/CD,CI跑完顺手把整个build目录rsync到测试服务器,连.git和vendor/composer/autoload_static.php一起拖过去。而那个autoload_static.php里,赫然藏着去年12月他写在注释里的MySQL密码明文。不是base64,是纯ASCII。我敢打包票,那串密码最后三位是“8aK”,因为他在Jira里提需求时写的ID后缀就是这个。有人非说“反正只是测试站”,可扫描器不看host头,只认IP+端口+响应体。它不管你是dev.example.com还是192.168.123.45:8080,只要HTTP状态码200、Content-Length大于500、Response里有“X-Powered-By: PHP/7.4.33”,它就往下挖。去年五月到现在,我们漏扫平台捕获的主动外泄事件,七成源头不是主站,是三个子域名:test.、stage.、legacy.。legacy那台跑着十年前的老Discuz!后台登录页居然还能POST /admincp.php?action=runquery,里面SQL语句全在GET参数里,连单引号都不转义。你跟我说“优胜劣汰”?对,淘汰的就是这批人——淘汰得一点动静没有,等甲方审计报告下来才看见红章盖在第17页“高危项:未授权访问致数据库完整泄露”。 小杨刚才问我:“要不要给所有测试机加个waf规则,拦截‘…/…/…/etc/passwd’?”我说别费劲,先把jenkins里那个叫“auto-deploy-test”的pipeline删了。他哦了一声,手机响了一声没接,我看屏幕反光里是他钉钉图标弹出来又缩回去。DBA老周后来补了句:“其实昨天调休申请又被驳回了,说是‘重大保障期禁止调休’。”我看了眼值班表,上面写着“中考专项保障:6.15–6.18”,可今天是6月22号。没人改表,也没人撕掉。我原以为是行政手误,结果今早看见后勤在贴新值班表,第二行用红笔加了“含延长期”,没写截止日。 最绝的是啥?最绝的是他们把phpinfo()页面藏在/login/redirect.php?to=phpinfo——用302跳转绕WAF,结果爬虫抓跳转链的时候,顺手把整个跳转逻辑存进了Elasticsearch的原始日志字段里。我们现在查这个漏洞,得先curl -I http://test.xxx.com/login/redirect.php?to=phpinfo,再grep Location,再跟进Location头,再检查响应体。一共四步,缺一步就看不到phpinfo。我昨天跟后端复现,光是确认这四步走法,来回跑了十八秒。中间老周端着杯子路过,杯沿上一圈咖啡渍,正好卡在他工牌照片右下角,盖住半只耳朵。他放下杯子时候说了一句:“这玩意儿……跟当年XX银行那个一样,不是技术问题,是人以为自己已经修好了。” 我不屑。真不屑。你信不信?就那种看着告警邮件标题写着“疑似数据外泄:/backup/config.zip”,点开附件内容却是WordPress默认wp-config-sample.php的人——他还截图发群里说“看,安全组拦截成功”。我就问他一句:“你确定那是sample,不是real?”他愣三秒,重下了个config.zip,打开——里面wp-db-name是production_xxx,wp-db-user是app_ro,wp-db-password是Y7mQ#f2$ZcRt(没错,就是那个Y7开头的),而wp-config-sample.php里根本不会填这些字段。他手指停在键盘上,没敲回车,手机又响一声,这次我看见是他老婆来电,名字备注是“娃发烧”。 我现在盯着监控屏,右边第三个面板还在刷着curl -v http://staging.xxx.com/wp-content/debug.log的返回体。HTTP/1.1 200 OK,content-length: 217453。里面第三行写着“DB_PASSWORD = ‘x9F%g2@k!sP3’”。我不准备动它。就让它挂着。等明天早上8:05——运维晨会前五分钟,我再截图发到大群。不用配字,就图。标题也不加,就留白。至于是不是删它?我还没想好。或者……让新人来删? (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


