作者lance70176 (十三夜)
看板Soft_Job
标题[心得] PHP 爆大洞,别人熬夜,我们切一刀下班
时间Fri Oct 23 06:53:00 2026
这周 PHP 圈最热闹的不是新版本,而是一个叫「PHP2Shell」的漏洞。
名字听起来很像加油站,实际上是把你的伺服器直接加满油、送给骇客开走。
CVE-2026-109618/109619,CVSS 9.2,不用登入就能远端执行程式。
最可怕的一句话是:「连只印 Hello World 的页面都会中」。
━━━━━━━━━━━━━━━
▍它到底怎麽打进来的?(技术一点点就好)
━━━━━━━━━━━━━━━
简单说,攻击者丢一个特制的超大上传表单(multipart),
在请求一开始就把记忆体灌爆。
PHP 脑袋当机的那一瞬间,留下一份「做到一半」的资料,
收尾时却把它当成真的拿来用,於是就能执行任意程式。
重点来了:这一切发生在 PHP「解析上传表单」的阶段。
你写得再漂亮的登入检查、签名验证、副档名过滤,通通还没轮到上场。
等於小偷不是从门进来,是在你盖房子打地基的时候就先躲进去了。
官方说「唯一可靠的解法是升级 PHP」,修补版本是
8.2.35/8.3.36/8.4.27/8.5.12。
然後我打开公司的主机一看:7.4、7.1……
官方的回答是:8.1 以下,祝你好运。
━━━━━━━━━━━━━━━
▍这不是演习,是已经在发生的事
━━━━━━━━━━━━━━━
其实两周前就有一波大量攻击。
我们这边损失大约 24 万,朋友的公司更惨,一天实际损失百万。
漏洞公告出来之前,有人早就在用了。
我一个在骇客圈的朋友说得更直接:「这招我们用了十年以上了,一招打天下。」
官方公告是这礼拜才出来,但对某些人来说,
这只是把用了十年的祖传秘方正式公开而已。
━━━━━━━━━━━━━━━
▍「全部升级」听起来很正确,但……
━━━━━━━━━━━━━━━
我们一间公司 20 几个专案、100 多个站,很多还架在已经停止维护的旧框架上。
光是其中一套支付系统,评估升到 PHP 8.3 就要 6~8 人天。
而且原样换上去会整站回 500,因为旧框架会把 PHP 8 的一堆警告当成错误丢出来。
另外,原本用 error_reporting(0) 藏起来的型别问题,
在 PHP 8 全部会跳出来咬人。
100 多个站一个一个这样升?升完大概也过年了。
我在某大集团资讯部的朋友,现在就还在熬夜加班升版本。
但其实,按照下面的上策或中策,他可以早点下班。
━━━━━━━━━━━━━━━
▍框架老了?其实可以自己改(这段比较硬核一点)
━━━━━━━━━━━━━━━
很多人把框架当成神主牌,官方不支援就只能整套重写。
但 PHP 框架说穿了,就是一堆跟着专案一起打包的 PHP 档。
它是你的程式码,不是黑盒子,坏了就打开来修。
这次的 ThinkPHP 5.0 就是例子。
换上 PHP 8.3 之後整站 500,追下去发现根因只有一个:
框架会把 PHP 8 新增的「提醒」当成「错误」丢出来,等於一张黄牌就直接判出场。
改框架里一行,告诉它「提醒就记下来,不要判出场」,整站就恢复正常。
全专案真正会死的地方只有 3 处,各改一两行。
PHP 本身也一样。
官方虽然不出 7.x 的修补版,但修补的原始码是公开的。
sury 做的事,就是把修补补进旧版 PHP 再重新打包。
CentOS 没有现成套件?自己编一份带修补的 PHP,也不是什麽黑魔法。
这件事我不是第一次做。
当年 PHP 7 刚推出,Laravel 4.2 官方不支援 PHP 7,很多团队只能整套重写成
Laravel 5。
我那时候选择直接改框架,把 4.2 改到能在 PHP 7 上稳定跑。
例如 PHP 7 把一部分错误改成新的 Error 类型,旧框架的错误处理只接得住旧的
Exception,一出错就是一整页空白。
把这些接缝一个一个补起来,比整套重写便宜太多。
不过升级最可怕的往往不是「会坏」,而是「默默变了」。
举个例子:
"abc" <= 0
这行在 PHP 7 是 true,在 PHP 8 变成 false。
如果你的金额检查刚好这样写,升级後就可能把奇怪的金额放行。
程式不会报错,帐会错。
所以我们升级时,是让 7.4 和 8.3 同时跑同一份程式,把支付回调、
金额路径的结果逐一比对,确认两边一模一样才算数。
━━━━━━━━━━━━━━━
▍上中下三策
━━━━━━━━━━━━━━━
【上策】套社群回补套件,程式一行都不用改
Debian/Ubuntu 的 PHP 套件维护者 Ondrej Sury(sury.org)很佛心,替 PHP 5.6
到 8.5 每个版本都出了修补套件。
连 7.4、7.1 这种官方不管的版本都有。版本号不变,只多一个套件修订号。
apt 升级、重启 PHP-FPM,收工。
缺点:只限 Debian/Ubuntu。CentOS 的朋友请往下看。
【中策】把图片上传独立成一台新版 PHP(我最推)
既然漏洞的大门是「上传表单」,那就别让上传请求碰到旧 PHP。
‧原站的 Nginx 只把「上传图片」那几条路径转到一台独立主机(PHP 8.4.27)
‧其他所有 multipart 请求一律 403,旧 PHP 根本收不到
‧上传主机负责验签名、验档案内容、把图片重新编码(夹带的恶意程式码顺便洗掉)
‧存放目录不能执行程式,主机也没有任何资料库权限,被打也拿不到资料
‧前端网址、栏位一个都不用改,出事拿掉 Nginx 一行转发就回到原状
100 多个站要改,升级是处理不来的,不如弄一台共用的图片上传服务。
远古产品切开就好,这应该是改动最小的方案。
【下策】全面升级 PHP 8,必要时连框架一起改
这是唯一的根治法,也是技术债的总清算。
就像上面说的,框架其实改得动,难的是 100 多个站每个都要改、每个都要测。
长期一定要做,但不适合在「骇客已经在门口」的时候当第一步。
顺带一提,「只把 session.upload_progress 关掉」不够。
它只挡住其中一条路,另一个 CVE 靠的是灌爆记忆体,跟上传进度无关。
━━━━━━━━━━━━━━━
▍其实 15 年前就有人这样干了
━━━━━━━━━━━━━━━
15 年前我在 Yahoo! 还是个菜比巴。那时 Yahoo! 跟 PHP 之父 Rasmus Lerdorf
有合作,就已经用类似的做法,把上传这种高风险的东西独立出去。
前辈特别跟我提过,说是 PHP 之父的建议。当时我听了还不懂,现在懂了,
而且懂得有点痛。
照 PHP 之父当年的说法:一堆框架架在 PHP 上,早就千疮百孔,
小漏洞他也管不了了。
(他当时还来台湾招志愿者帮忙翻译中文文件。)
外商那时还教了我另一件事:「最高权限只用一瞬间」。
伺服器启动的时候,确实需要 root(最高权限)来做几件事,例如占用 80/443
这种特殊的埠、读取 HTTPS 凭证。
但这些事一做完,真正负责接客、执行 PHP 的那些工作程序,
就全部换成权限很小的帐号(例如 nginx、www-data)。
打个比方:
店长早上用万能钥匙开完大门,就把钥匙收进保险箱;
整天在柜台收钱的是工读生,他手上只有收银机的钥匙。
小偷就算骗倒了工读生,也拿不到万能钥匙,开不了金库。
PHP2Shell 让骇客拿到的,就是「正在执行 PHP 的那个帐号」的权限。
如果你的 PHP 是用 root 在跑,那就等於工读生身上挂着万能钥匙,
一被骗就全盘皆输;
如果是权限很小的帐号,骇客进得来,也只能在一个很小的房间里打转。
这次我们的独立上传服务也是同一套思路:它用专属的受限帐号在跑,
只能写图片资料夹,连一个资料库帐号都没有。
漏洞不一定挡得住,但损害可以先算好上限。
有朋友吐槽:「其他语言也跟着爆啊,总不是同一个人吧?」
说得对,每个语言都有洞,只是 PHP 这次的比较严重,而且全世界跑 PHP
的老系统实在太多了。
━━━━━━━━━━━━━━━
▍结论
━━━━━━━━━━━━━━━
1. 今天就做:关掉 session.upload_progress、Nginx 挡掉不必要的上传
2. Debian/Ubuntu:套 sury 回补,当天收工
3. 套不了的:把上传独立出去,先把大门关上
4. 长期:该升级的还是要升,但可以从容地升
资安不一定要靠熬夜,有时候是靠「把对的那一刀切下去」。
祝大家今晚都能准时下班 XD
--
最喜欢的一句话是?
世界和平
最尊敬的人是?
德蕾莎修女
请说一句话。
大家都要幸福喔~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.116.54.124 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1792709592.A.CA3.html
1F:推 nicetw20xx: 推实战经验分享 10/23 08:24
2F:推 nicetw20xx: 另外小帐权限不够、还是可以靠组合技突破 10/23 08:28
3F:→ nicetw20xx: 现在渗透agent太恶心了,希望最後别像魔鬼终结者3那样 10/23 08:31
4F:推 lchcoding: 推佛心! 10/23 08:37
5F:推 nicetw20xx: 另外os有解感觉也可以考虑换os 10/23 08:42
6F:推 oopFoo: 推分享。这时ai应该就很有用了,port sury到其他os? 10/23 08:46
7F:→ sinclaireche: 发文也修一下吧 ai味太重 10/23 08:57
8F:→ kd992102: ai感真的超重 10/23 09:18
9F:嘘 KyuubiKulama: Ai 文 10/23 09:21
10F:→ nh60211as: 不是而是 10/23 10:14
11F:嘘 kimi112136: ai ..... 10/23 10:27
12F:推 newbout: 看到开头直接 end 10/23 10:30
13F:推 workhardplz: 文章有用就好 不懂有ai味又怎样 10/23 10:44
14F:嘘 Obama19: AI喂屎 有人还吃得很香 10/23 10:47
15F:嘘 dream1124: AI 10/23 10:55
16F:推 wulouise: 我觉得这篇重点都有讲到,没什麽多余filler不错了 10/23 11:43
17F:→ MOONY135: 文章看起来很有ai感 应该是某个地方转过来的吧 10/23 12:26
18F:嘘 fgh81113: ai 10/23 12:58
19F:嘘 qwer338859: AI废文 10/23 13:16
20F:→ shadow0326: 是废话长说型的AI呢 10/23 13:17
21F:→ yunf: 又不是现在才知道你可以想像他是骇客界的ETF 10/23 14:26
22F:→ yunf: 把所有能用的招都尽可能输入进去 10/23 14:26
23F:嘘 VScode: 真的太长了,这不就交给ai修就好吗 10/23 14:34
25F:→ yunf: 真的交给ai修会天下大乱 10/23 14:41
26F:→ yunf: 现在是hotfix版的ddos忙中有错 10/23 14:42
27F:→ yunf: 过不久这些agent的阶段性任务就结束变得毫无价值 10/23 14:43
28F:嘘 jonathan793: ai干文 10/23 14:43
29F:→ yunf: 你现在还会用hijackthis吗? 10/23 14:44
30F:→ yunf: 这是瘫痪MIS的视力和脑力 10/23 14:45
34F:→ yunf: 还记得heartbleed是怎麽被塞进更新的吗? 10/23 14:53
35F:嘘 bill0205: AI味太明显 10/23 14:54
36F:→ yunf: 如果我没猜错以後这种大量修补更新会变成常态 10/23 14:56
37F:→ yunf: 他就是要把速度加到你没用ai跟不上 10/23 14:57
38F:→ yunf: 就像垃圾邮件和简讯一样 10/23 14:57
39F:→ yunf: SPAM 虽然是老招但你根本不知道里面有什麽新梗 10/23 14:59
40F:→ yunf: 你觉得现在很快的电脑次世代眼中会慢得像蜗牛 10/23 15:01
41F:→ yunf: 想像一下脚本小子变成口令小子 10/23 15:02
42F:→ yunf: 已经太多漏洞是根本不需要你帐密就能取得权限 10/23 15:07
43F:→ yunf: 所以安全策略在什麽2FA MFA根本就是假议题 10/23 15:08
44F:→ yunf: 只是要让你相信你是安全的 10/23 15:09
47F:→ nash888: AI文 没人想看 10/23 15:38
48F:→ lance70176: 已经尽量AI修的给普通人看得懂 AI上限是靠驾驶员 10/23 16:34
49F:→ lance70176: 其实没AI我也能做 靠AI加速而已 10/23 16:36
50F:→ lance70176: 能AI简单处理都升级好了 但有大企业不能升级的点 10/23 16:37
51F:→ lance70176: 文章TA是分享给那些卡死再无法升级路上的人 10/23 16:37
52F:→ lance70176: 不是只管一两个小站 什麽都喊AI帮忙最终迟早失业的人 10/23 16:38
53F:→ Obama19: 哥你推文也是AI文体 你被AI同质化了吗 怕 10/23 19:02
54F:→ yam276: 哥 你光标题就充满AI味了 10/23 19:15
55F:→ lance70176: 总感觉推文有人不懂讨论技术 跟女版一样再谈感觉... 10/23 19:18
56F:→ lance70176: 是不是AI对我不重要 我只注重实际帮助就是 10/23 19:19
57F:推 workhardplz: 不知道大家的程式有没有ai感嘻嘻 10/23 19:53
58F:嘘 wuyiulin: 你连文章都要 AI写。 10/23 20:23
59F:→ lance70176: 我都落实 AI 旅游, AI 原型图, AI 选酒, AI 买表 10/23 20:37
60F:→ lance70176: 还AI写工具, AI 写 APP, 靠 AI 搞技术海外赚不少钱呢 10/23 20:37
61F:推 ikachann: 所以一些老旧专案定期重构是必要的 毕竟很多旧技术也没 10/23 20:49
62F:→ ikachann: 继续更新维护 10/23 20:49
63F:→ ella123555: 好AI 10/24 00:12
64F:推 viper9709: 找个解封包的防火墙挡起来有没有用... 10/24 00:31
65F:推 cancelpc: 内容有价值。我长期写程式。中英文文法烂的一塌糊涂,现 10/24 00:44
66F:→ cancelpc: 在也都用AI润饰。 10/24 00:44
67F:→ cancelpc: 其实可以用AI把旧PHP语法的程式,无痛迁移新版PHP。至於 10/24 00:46
68F:→ cancelpc: 其他就看绑多少套件。 10/24 00:46
69F:推 ILoveAMD: 请问骇客已经用了10年以上这个说法 有证据吗? 10/24 06:00
70F:→ ILoveAMD: 这个漏洞已知 只是认为无法利用 这次是AI写出攻击程式 10/24 06:02
71F:推 wizozd84070: 谢分享。这篇有AI味道,但有认真看完内容~ 10/24 06:11
72F:→ sinclaireche: 这就是包装失败还要怪人 10/24 10:17
73F:→ lance70176: 骇客十年就是我朋友亲身经历 10/24 10:29
74F:推 kanding255: ai味好重 10/24 13:58
75F:→ Romulus: 写文章用AI哪有什麽问题 只要内容好又好读就好 10/24 16:07
76F:→ Romulus: 这篇内容很好 会嫌AI味的就两种人 一种是彻底反AI 只要扯 10/24 16:09
77F:→ Romulus: 到AI就一律先痛骂一顿强行丢进垃圾桶 10/24 16:10
78F:→ Romulus: 另一种就是不看内容 反正闻到AI味就直接认定是AI slop 10/24 16:10
79F:→ Romulus: 俗称只能用二分法看世界的人 10/24 16:10
80F:→ Romulus: 至於叫AI修的人 虽然不知道是没看内容还是看不懂内容 10/24 16:12
81F:→ Romulus: 但这篇就是在教大家该怎麽叫AI修才正确……………… 10/24 16:12
82F:→ Romulus: 喔还可能是以为现在真的只要和agent说一声「把公司的php 10/24 16:12
83F:→ Romulus: 漏洞修好」就可以睡觉的人 那就good luck 10/24 16:12
84F:嘘 lturtsamuel: 连标题都能满满ai味真不简单 10/24 16:14
85F:推 justptt978: 用低权限跑服务 这很重要 10/24 19:26
86F:推 descent: 感谢分享 10/24 22:20
87F:嘘 asdfghjklasd: 讲那麽多..早就应该升级系统及 php版本了 10/24 22:43
88F:→ asdfghjklasd: 我客户找两光的做网站公司 10/24 22:43
89F:→ asdfghjklasd: 用的是 php8.1 我在年初都升升到 8.4了 10/24 22:44
90F:→ asdfghjklasd: 而且我前三四年交给他们的是 freebsd 13.1 10/24 22:44
91F:→ asdfghjklasd: 我都升到新版本了 网站前端也架简单waf 10/24 22:45
92F:→ yunf: 不升级一定有它们的考量 10/24 23:15
93F:→ yunf: 不然就直接绑定升级就好了 10/24 23:15
94F:→ yunf: 等於说你打一个备份钥匙给守卫任何洽公都可以直接去开 10/24 23:16
95F:→ yunf: 送瓦斯查水表外卖只要你有里就可以开你家门 10/24 23:17
96F:嘘 acgotaku: 为什麽你的格式跟 gpt 产出这麽像 10/25 03:19
97F:→ lance70176: 客户同行有月流水破百亿的 PHP 5.6 不升自有理由 10/25 03:20
98F:→ lance70176: 我1/3 客户升级 AI可以半天搞定 有的就是升了会挂 10/25 03:21
99F:→ lance70176: 不是所有工作都可以叫 AI 一句帮我升级搞定 10/25 03:21
100F:→ lance70176: 百亿流水敢失误中断半天看看 老板还不劈人 10/25 03:22
101F:→ lance70176: 所以才会有补丁方案 再慢慢升上去 10/25 03:22
102F:→ lance70176: 同样评估 老板愿意花高薪找我 而不是相信AI是有原因 10/25 03:23
103F:嘘 asdfghjklasd: 有百偣流水还不花钱改... 10/25 04:11
104F:嘘 angusyu: 我为什麽要在这看AI文 10/25 16:32
105F:推 guanting886: 银行的房子坏了、网路不通也是要找师傅修啊,有啥稀 10/25 16:53
106F:→ guanting886: 奇的吗@@ 10/25 16:53
107F:→ guanting886: 若某个行业的流水这麽高,版本却不敢升,我是建议每 10/25 16:56
108F:→ guanting886: 一个站都去要求占个一股(外面价值50~200) 10/25 16:56
109F:→ guanting886: 不然原本团队就可以处理的事情却不想做宁可让外人去 10/25 16:57
110F:→ guanting886: 处理核心系统,小心不要婊R 10/25 16:57
111F:→ yunf: 那是你还没到会被搞的层级 等你到了就知道安全的重要 10/25 17:49
113F:推 Romulus: ................那你修过实际上银行的老系统吗 10/25 18:46
114F:→ Romulus: 有时候不知道这种人是根本没出过社会在纯云 还是太强了 10/25 18:47
115F:→ Romulus: 没遇过所谓食古不化不求长进公司的系统 10/25 18:48
116F:→ Romulus: 整条路上只遇过理想上的先进系统 老板也都对他很好这样 10/25 18:49
118F:→ yunf: 没话语权人家叫你走你就得走 10/25 19:03
119F:→ yunf: 抖出PHP漏洞只是一个手段而已 10/25 19:04
120F:→ yunf: 真正目的是在修理那些不配合的人 10/25 19:05
121F:→ yunf: PHP後面就有一群看穿他手法的人 10/25 19:05
123F:推 LoveSports: 大大好强 外媒好几篇报导工程师熬夜好几天 10/25 20:59
124F:→ LoveSports: 好奇台湾有没有 结果跑来这边看到切一刀下班 10/25 21:00
125F:→ LoveSports: 难怪都没看到工程师乡民哀哀叫 10/25 21:00
126F:→ xam: 很久以前服务执行就是降到只有必要权限的帐号去跑啊 10/26 16:07
127F:→ xam: 怎麽现在又回到用root跑一堆服务的生态吗? 10/26 16:08
128F:嘘 papple23g: 不是 而是 简单说 重点来了 今天就做 10/31 18:22