Taiwanese Hacker Orange Tsai's CTF Journey and the Untold Stories Behind It
CTFs are often dismissed as esports divorced from reality, but Orange Tsai sees them as the particle accelerator of cybersecurity. While digging through PHP source code to build a challenge, he discovered that a single file_exists() call could trigger PHAR deserialization, a full year before the technique was presented at Black Hat. In another competition, a newline character casually slipped in by a player uncovered a remote code execution vulnerability in Nginx and PHP-FPM. Hacking for fun ended up rewriting the real world.

Phrack 第 72 期 · 第 5 篇
在网络安全的世界里,有一个来自台湾的传奇人物,名叫 Orange Tsai 蔡政達 。
他不是那种只在新闻标题里出现的“黑客”,他是真正在“拆解”互联网的人。他是Pwn2Own黑客大赛的冠军,Pwnies奖(安全界的“奥斯卡”)的得主。在2021年,黑客们最常利用的15个顶级漏洞中,有大约60%是他发现并报告的。
但Orange Tsai最近写的文章,不是为了炫耀他在微软或VPN上又找到了什么惊天漏洞。他想讲一个更根本的故事——关于他的“初恋”,那个将他塑造成今天的样子的“游乐场”:黑客攻防竞赛(CTF)。
我们很多人,甚至包括一些专业人士,都倾向于认为CTF(Capture the Flag,夺旗赛)只是一种“电竞”。参赛者们在48小时内,不眠不休地解答主办方设计的、各种刁钻古怪的谜题。
人们普遍批评CTF“越来越脱离现实”。
但Orange Tsai要告诉我们:我们都错了。
这些“游戏”非但没有脱离现实,它们反而是真实世界网络安全的“粒子加速器”。它们是一个充满“野性创造力”的实验室,不断孕育出全新的攻击技术,甚至“意外”地撞破了支撑互联网的底层支柱。
他给我们讲了几个“游戏成真”的精彩故事。
故事一:当“检查文件是否存在”,变成了“引爆核弹”
在PHP(一种构建了全球无数网站的语言)安全领域,黑客们最喜欢的“大杀器”之一叫做“反序列化”。
你可以把它想象成一种“分子传送”:开发者把一个“对象”(比如一个用户A)打包成一串文本(序列化),传来传去。当需要时,再用一个叫 unserialize() 的函数把这串文本“传送”回活生生的用户A(反序列化)。
问题是,如果一个黑客能控制这串文本,他就可以不传送回“用户A”,而是传送回一个“邪恶的入侵者”。
因此,开发者们学乖了。他们死死守住了 unserialize() 这个“传送门”,不让任何可疑的文本靠近。
攻击者们似乎无路可走了。直到CTF登场。
2017年,Orange Tsai本人正在为一场CTF比赛设计挑战。他为了好玩,在业余时间阅读PHP的源代码,他发现了一个惊天秘密。
PHP有一种自己的压缩包格式,叫PHAR。为了方便管理,这个压缩包会把自己的“元数据”(比如包里有啥)也用“序列化”的方式打包存储。
真正的“Aha! 时刻”来了:Orange发现,PHP的设计是,无论你对这个PHAR文件做什么,哪怕只是用 file_exists() 函数去“检查一下这个文件是否存在”,PHP的底层都会自动、热情地帮你把那个“元数据”给“反序列化”。
这个发现彻底改变了游戏规则。
那扇被重兵把守的 unserialize() 大门?黑客们不再需要从正门硬闯了。他们只需要诱导程序去“看一眼”他们精心伪造的PHAR压缩包(比如伪装成一张图片),“核弹”就会在系统内部被引爆。
Orange Tsai为他的CTF设计了这个“魔法文件”挑战。当时,这个技巧还只在小圈子里流传。一年后,另一位安全研究员Sam Thomas在Black Hat(全球顶级黑客大会)上,独立地发表了完全相同的攻击技术,并展示了它如何攻破Typo3、WordPress等真实世界的重量级应用。
这个诞生于“游戏”的奇思妙想,整整领先了真实世界一年。
故事二:那个“意外”撞出来的史诗级漏洞
如果说PHAR的故事是CTF“预言”了未来,那下面这个故事,就是CTF“意外”地绊倒了现在。
2019年,一场“真实世界CTF”(Real World CTF)正在举行。主办方的目标很明确:让选手们攻破最新版Chrome浏览器的防线。这是一个“前端”挑战。
但一位ID为 @d90pwn 的选手,在解题时“分心”了。
他随手向服务器的网址(URL)里塞进了一个“换行符”,这是一个非常规的、几乎无意义的“捣乱”操作。然而,服务器的反应却极其诡异——它没有按预期报错,反而吐出了一些本不该出现的内部信息。
@d90pwn 当时一头雾水。在紧张的比赛中,他没能解开这个谜团。
但比赛结束后,好戏才刚开始。
@d90pwn 和他的朋友们(@neex 和 @beched)对这个“诡异的换行符”展开了侦探般的调查。他们发现,自己无意中绊到了一根“世纪电线”。
他们揭开了一个潜藏多年的史诗级漏洞(CVE-2019-11043)。这个漏洞存在于PHP-FPM中——这是Nginx服务器(运行着全球上亿网站)和PHP配合工作最主流的模式之一。
这个漏洞的成因极其微妙:Nginx在处理带“换行符”的URL时会产生一个罕见的“误解”,而PHP-FPM的底层逻辑又恰好有一个微小的计算失误,两个看似无害的小问题撞在一起,奇迹般地允许黑客实现“远程代码执行”(RCE)——也就是彻底接管服务器。
Orange Tsai在文章中感叹:这个漏洞的藏匿方式是如此“刁钻”,以至于传统的自动化扫描工具(Fuzzing)几乎不可能发现它。
它之所以被曝光,唯一的原因是:
在一场CTF比赛中,一群顶尖黑客为了一个完全不同的目标,正在对一个系统进行“密集的、不计后果的、疯狂的试错”。
真正的“夺旗”
Orange Tsai的文章,是他写给CTF社区的一封情书。
他想告诉世界,CTF远非“脱离现实的无聊游戏”。它是一种文化,一种“为了好玩而黑客”的纯粹精神。
在这种精神下,主办方会疯狂到发明一个“9比特的CPU”来折磨选手;而选手们则会在这种“高压”和“趣味”的激励下,爆发出最耀眼的“创意火花”。
这些火花,有的照亮了被遗忘的“安全古迹”,有的则点燃了全新的“科技树”。
最终,这些“游戏玩家”们带给真实世界的,远比几面“旗帜”要多得多。
繁体中文版 https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/
Originally published on the WeChat account 网安志异, 2025-10-28 · original
Comments