POC详情: 9d9c39a1e0b862aaa439f251b464f7ee4951f369

来源
关联漏洞
标题: Next.js 安全漏洞 (CVE-2025-29927)
描述:Next.js是Vercel开源的一个 React 框架。 Next.js 14.2.25之前版本和15.2.3之前版本存在安全漏洞,该漏洞源于如果授权检查发生在中间件中,可能绕过授权检查。
描述
CVE-2025-29927
介绍
### **CVE-2025-29927 — Уязвимость обхода авторизации в Next.js**  


#### **🔍 Описание**  
**CVE-2025-29927** — критическая уязвимость в Next.js, позволяющая злоумышленникам обходить проверки авторизации, реализованные через **Middleware**. Уязвимость возникает из-за некорректной обработки заголовка `x-middleware-subrequest`, что приводит к полному или частичному игнорированию middleware-функций.  

![image](https://github.com/user-attachments/assets/344873ce-6b84-4c22-931f-f4fa7a502955)


#### **📌 Условия эксплуатации**  
- Сервер использует Next.js **v11.1.4 – v15.2.2**.  
- В проекте задействован **Middleware** (файл `middleware.js`/`middleware.ts` или `_middleware.js`/`_middleware.ts` в старых версиях).  
- Middleware применяется для:  
  - Контроля доступа (авторизация/аутентификация).  
  - Перенаправления запросов (например, локализация).  

---

### **⚡ Сценарии атак**  

#### **1. Обход авторизации**  
**Как работает?**  
Если Middleware проверяет права доступа к `/admin`, атакующий может отправить запрос с заголовком:  
```http
'X-Middleware-Subrequest': 'src/middleware:src/middleware:src/middleware:src/middleware:src/middleware'
```  
**Результат**:  
- Next.js пропускает выполнение Middleware.  
- Защищенный маршрут обрабатывается **без проверки прав**.  

#### **2. Отказ в обслуживании (DoS) через кеш-отравление**  
**Как работает?**  
Если Middleware перенаправляет пользователей (например, с `/` на `/en`), атакующий может:  
1. Обойти перенаправление, отправив запрос с `x-middleware-subrequest`.  
2. Получить ответ **404/500** (если корневой маршрут `/` не обработан).  
3. Если ответ кешируется CDN, все пользователи начнут получать ошибки.  

---

### **🔧 Технические детали**  
Уязвимость возникает в коде Next.js при обработке заголовка `x-middleware-subrequest`:  
```javascript
const subreq = params.request.headers['x-middleware-subrequest']; // [1]
const subrequests = typeof subreq === 'string' ? subreq.split(':') : []; // [2]
const depth = subrequests.reduce((acc, curr) => (curr === params.name ? acc + 1 : acc), 0); // [3]

if (depth >= MAX_RECURSION_DEPTH) { // [4]
  return { response: NextResponse.next() }; // Пропуск Middleware!
}
```  
**Что происходит?**  
1. Заголовок извлекается из запроса.  
2. Разбивается по символу `:`.  
3. Если значение повторяется **≥5 раз** (например, `middleware:middleware:...`), Next.js **пропускает Middleware**.  

---

### **🛡️ Способы защиты**  

#### **1. Обновление Next.js**  
Установите одну из исправленных версий:  
- **Next.js 15.2.3+**  
- **Next.js 14.2.25+**  

#### **2. Блокировка заголовка на уровне сервера**  
- **Nginx**:  
  ```nginx
  proxy_set_header x-middleware-subrequest "";
  ```  
- **Apache (`.htaccess`)**:  
  ```apache
  <IfModule mod_headers.c>
    RequestHeader unset x-middleware-subrequest
  </IfModule>
  ```  
- **Express.js**:  
  ```javascript
  app.use((req, res, next) => {
    delete req.headers['x-middleware-subrequest'];
    next();
  });
  ```  

#### **3. Использование WAF**  
Настройте правила для блокировки запросов с `x-middleware-subrequest`.  

---

### **📌 Пример эксплуатации**  
**Исходные условия**:  
- Next.js v14.2.24.  
- Middleware проверяет доступ к `/admin`.
- Для теста можно взять представленное приложение 
- Запуск приложения:
```bash
yarn
yarn bev
```  

**Шаги атаки**:  
1. Запускаем наш прокси:  
   ```bash
   python exploit.py
   ```
   Наш заголовок будет автоматически подставляться. 
2. Переходим на localhost:8080/admin
   Видим страницу админки.

Репозиторий создан в образовательных целях.

### **ℹ️ Дополнительная информация**  
Тестовое приложение было взято у https://github.com/yugo-eliatrope
文件快照

[4.0K] /data/pocs/9d9c39a1e0b862aaa439f251b464f7ee4951f369 ├── [3.1K] exploit.py ├── [5.0K] README.md └── [4.0K] vuln_app ├── [ 118] next.config.mjs ├── [ 653] package.json ├── [4.0K] public │   └── [ 25K] favicon.ico ├── [4.0K] src │   ├── [4.0K] features │   │   └── [4.0K] login │   │   └── [3.3K] LoginForm.tsx │   ├── [1.5K] middleware.ts │   ├── [4.0K] pages │   │   ├── [6.8K] admin.tsx │   │   ├── [4.0K] api │   │   │   ├── [4.0K] auth │   │   │   │   └── [ 577] logout.ts │   │   │   └── [1.3K] login.ts │   │   ├── [1.2K] _app.tsx │   │   ├── [ 459] _document.tsx │   │   ├── [4.0K] fonts │   │   │   ├── [ 66K] GeistMonoVF.woff │   │   │   └── [ 65K] GeistVF.woff │   │   ├── [8.9K] index.tsx │   │   └── [ 673] login.tsx │   ├── [4.0K] styles │   │   ├── [ 608] globals.css │   │   └── [2.7K] Home.module.css │   ├── [4.0K] ui │   │   └── [2.1K] Layout.tsx │   └── [4.0K] utils │   └── [ 562] auth.ts ├── [ 492] tsconfig.json └── [ 38K] yarn.lock 12 directories, 22 files
神龙机器人已为您缓存
备注
    1. 建议优先通过来源进行访问。
    2. 如果因为来源失效或无法访问,请发送邮箱到 f.jinxu#gmail.com 索取本地快照(把 # 换成 @)。
    3. 神龙已为您对POC代码进行快照,为了长期维护,请考虑为本地POC付费,感谢您的支持。