前言:
CVE-2025-55182(React2Shell
一年没有挖洞了,居然不知道去年有出现这个未授权就可以rce的漏洞
我一直以为是node.js漏洞,听同学说才知道是react漏洞,
半年多了,按道理来说这个漏洞应该已经修完了
但是我不相信,我想继续挖
正题:
知己知彼方能百战百胜,先了解下漏洞原理
这个和log4j的漏洞有点像,听说的CVE-2025-55182(React2Shell
面试官问
最近很火的react2shell漏洞原理,,如何回答
第一层:一句话概括(考察是否抓到本质)
这是一个位于 React Server Components (RSC) Flight 协议反序列化过程中的原型链污染漏洞,攻击者通过构造恶意引用,最终劫持 JavaScript 的
Function构造函数实现任意代码执行。
第二层:技术细节(考察对 JavaScript 原型链和 React 内部机制的理解)
2.1 漏洞发生在哪里?
漏洞核心位于 React 服务端用于解析 Flight 协议数据的 reviveModel 函数。这个函数负责把客户端传来的序列化数据(chunks)还原成 JavaScript 对象。
2.2 根本原因是什么?
关键代码如下(简化):
javascript
function reviveModel(value) {
for (const key in value) {
if (hasOwnProperty.call(value, key)) { // ⚠️ 问题行
value[key] = reviveModel(value[key]);
}
}
}
问题在于 :hasOwnProperty.call(value, key) 这个检查是在攻击者可控的对象 value 上执行的。
在 JavaScript 中,所有对象继承自 Object.prototype,包含 hasOwnProperty、constructor、__proto__ 等内置方法。如果攻击者能够覆盖或篡改 value.hasOwnProperty,就能让这个检查形同虚设,从而允许访问原型链上的敏感属性。
2.3 如何从原型链污染走向 RCE?
攻击者通过精心构造多个相互引用的 chunks,实现以下利用链:
| 步骤 | 操作 | 效果 |
|---|---|---|
| 1 | 制造一个带有 then 属性的对象(Thenable) |
让 React 误以为它是一个 Promise |
| 2 | 通过 $1:__proto__:then 语法沿原型链爬升 |
获取到 Chunk.prototype.then |
| 3 | 通过 $1:constructor:constructor |
拿到全局 Function 构造函数 |
| 4 | 将恶意代码字符串传入 Function() |
在服务器上执行任意 JavaScript |
简单说 :Flight 协议的设计允许引用跳转,而 reviveModel 在解析时没有限制原型链访问,导致攻击者可以从一个普通对象一路爬到 Function 构造函数。
明天挖洞这个漏洞,今天先睡觉了
语法
org="China Education and Research Network Center"&&app="next.js" && country="CN"
今天挖到厦门大学的信息泄露,嘻嘻,有实力了
