0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Hướng Dẫn Chi Tiết về Lỗ Hổng CVE-2024-34351: Server-Side Request Forgery (SSRF) trong Server Actions của NextJS

Đăng vào 1 tháng trước

• 4 phút đọc

Giới thiệu

Trong tuần vừa qua, các nhà nghiên cứu từ Assetnote.io đã công bố một bài viết quan trọng liên quan đến lỗ hổng SSRF xảy ra trong Server Actions của NextJS, phiên bản nhỏ hơn 14.1.1. Bạn có thể tham khảo chi tiết bài viết đó qua liên kết: Assetnote Research. Bài viết này sẽ tổng hợp những ghi chú và kết quả thực nghiệm của tôi sau khi tái hiện lại lỗ hổng này trong môi trường của mình.

Hướng dẫn cài đặt NextJS

Việc cài đặt NextJS rất đơn giản. Bạn có thể sử dụng công cụ create-next-app để bắt đầu.

Trước tiên, với Node.js đã được cài đặt, hãy chạy lệnh sau:

npx create-next-app cve-2024-34351

Kiểm tra trên GitHub, phiên bản có lỗ hổng này là 14.1.0, được phát hành vào ngày 19 tháng 01 năm 2024. Mặc định, create-next-app sẽ cài đặt phiên bản mới nhất. Để chuyển sang phiên bản có lỗi, bạn cần chạy thêm các lệnh sau:

Copy
cd cve-2024-34351
npm i -S next@14.1.0

Cuối cùng, để có thể truy cập vào server phát triển của NextJS, hãy sử dụng lệnh:

Copy
npx next dev

Bạn có thể truy cập địa chỉ http://localhost:3000 để kiểm tra.

Phân tích Lỗ Hổng SSRF

Điều kiện cần có để khai thác lỗi

Để khai thác được lỗ hổng này, cần đáp ứng các điều kiện sau:

  • Next.js (<14.1.1) phải chạy trong chế độ tự host.
  • Ứng dụng Next.js sử dụng Server Actions.
  • Server Action thực hiện việc chuyển hướng đến một path tương đối bắt đầu bằng /.

Điều kiện 1: Self-hosted NextJS

Điều kiện đầu tiên là NextJS cần được triển khai trong môi trường tự host. Theo tài liệu chính thức của NextJS, bạn có thể triển khai bằng Node.js Server. Để xây dựng và triển khai, hãy chạy các lệnh:

Copy
npx next build
Copy
npx next start

Bạn có thể kiểm tra thông tin ứng dụng đang sử dụng bằng cách nhập lệnh next.version trong console, hoặc tìm kiếm trong các file JavaScript trong dự án.

Điều kiện 2: Sử dụng Server Actions

Trước khi đi vào điều kiện này, hãy cùng nhau xem cách xử lý ảnh với component _next/image.

Khi thêm hình ảnh vào ứng dụng, bạn sẽ gặp các lỗi sau nếu hình ảnh không tồn tại hoặc không được phép lấy từ localhost. Do đó, cần cấu hình trong file next.config.js để cho phép. Tuy nhiên, với cấu hình mặc định, NextJS đã có CSP bảo vệ:

  • CSP mặc định được cấu hình từ phiên bản 12.1.0, giúp bảo vệ chống lại XSS.

Điều kiện 3: Redirect về URL tương đối

Cuối cùng, chúng ta tìm hiểu về việc redirect đến một URL tương đối. Việc này có phổ biến hay không và liệu có cách nào dễ dàng phát hiện được hay không?

Để thiết lập các route đơn giản, bạn có thể tạo một thư mục mới search trong thư mục app, sau đó tạo file page.js với nội dung:

javascript Copy
'use client';

import { useFormState } from 'react-dom';
import { handleSearch } from '@/app/lib/actions';

export default function Search() {
    const initialState = { keyword: "hogehoge" };
    const [state, dispatch] = useFormState(handleSearch, initialState);
    return (
        <form action={dispatch}>
            <div>
                <h1>Tìm kiếm</h1>
                <input
                    type="text"
                    id="keyword"
                    placeholder={state.keyword}
                />
                <button type="submit">Tìm kiếm</button>
            </div>
        </form>
    );
}

Tiếp theo, hãy tạo thư mục lib và thêm file actions.js:

javascript Copy
"use server";

import { redirect } from "next/navigation";

export const handleSearch = async (data) => {
    redirect("/login");
};

Kiểm tra giá trị header Next-Action

Qua việc truy cập đến http://localhost:3000/search, bạn sẽ thấy giao diện tìm kiếm, cùng với việc kiểm tra header Next-Action, bạn có thể phát hiện được thông tin cần thiết để khai thác. Nếu bạn cố gắng sửa đổi các header như Host, bạn sẽ gặp phải một số lỗi, điều này cho thấy cần thiết phải lấy giá trị Next-Action đúng để có thể khai thác lỗ hổng này.

Kết luận

Lỗi SSRF này là một lỗ hổng bảo mật nghiêm trọng mà các lập trình viên cần lưu ý. Việc hiểu rõ cấu trúc và cách thức vận hành của NextJS sẽ giúp bạn phát hiện và ngăn chặn các lỗ hổng tương tự trong các ứng dụng của mình.

Tham khảo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào