0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Nguy cơ XXE Injection trong React.js và cách bảo vệ

Đăng vào 1 giờ trước

• 3 phút đọc

Giới thiệu về XXE Injection

XXE (XML External Entity) là một lỗ hổng bảo mật xảy ra khi ứng dụng máy chủ xử lý XML một cách không an toàn. Ứng dụng React của bạn có thể dễ dàng kích hoạt lỗ hổng này khi người dùng tải lên hoặc gửi XML đến một API phân tích XML không an toàn. Trong bài viết này, chúng ta sẽ tìm hiểu cách XXE xâm nhập vào quy trình làm việc của React và cách phòng ngừa nó.

Cách XXE xâm nhập vào quy trình làm việc của React

Quá trình xâm nhập của XXE có thể diễn ra như sau:

  1. Giao diện người dùng React chấp nhận tệp XML (tải lên/tin nhắn).
  2. Frontend gửi tệp đến API.
  3. Bộ phân tích XML phía máy chủ mở rộng các thực thể bên ngoài (ví dụ: file://, http://).
  4. Kết quả: rò rỉ dữ liệu (ví dụ: /etc/passwd), SSRF hoặc treo bộ phân tích.

Ví dụ về bộ tải tệp React tối thiểu (mẹo UX an toàn)

Hãy sử dụng kiểm tra phía khách hàng cho UX, nhưng nhớ rằng bảo mật nằm ở phía máy chủ.

javascript Copy
// React: chỉ chấp nhận XML và từ chối DOCTYPE sớm (UX, không phải là bảo đảm)
function XmlUpload() {
  const onFile = async (e) => {
    const f = e.target.files?.[0];
    if (!f) return;
    if (!/(text|application)\/xml/.test(f.type)) return alert("Chỉ chấp nhận XML");
    const text = await f.text();
    if (/\<\!DOCTYPE/i.test(text)) return alert("DOCTYPE không được phép");
    await fetch("/api/parse-xml", { method: "POST", body: text, headers:{ "Content-Type":"application/xml" }});
    alert("Đã tải lên thành công");
  };
  return <input type="file" accept=".xml" onChange={onFile} />;
}

Ví dụ payload XXE (để hiểu rõ hơn)

xml Copy
<?xml version="1.0"?>
<!DOCTYPE data [
  <!ENTITY xxe SYSTEM "file:///etc/hosts">
]>
<data>&xxe;</data>

Mẫu Node.js dễ bị tấn công (không nên làm)

javascript Copy
// Express + libxmljs2 với các tùy chọn nguy hiểm
import express from "express";
import libxml from "libxmljs2";
const app = express();
app.post("/api/parse-xml", express.text({ type: "application/xml" }), (req, res) => {
  // ❌ NOENT=true thay thế các thực thể; DTD được phép
  const doc = libxml.parseXml(req.body, { noent: true, dtdload: true, nonet: false });
  res.json({ root: doc.root()?.name() });
});
app.listen(3000);

Phân tích Node.js an toàn (thay vào đó hãy làm như sau)

javascript Copy
// Không cho phép DTD + mở rộng thực thể + mạng
import express from "express";
import libxml from "libxmljs2";
const app = express();
app.post("/api/parse-xml", express.text({ type: "application/xml", limit: "200kb" }), (req, res) => {
  if (/\<\!DOCTYPE/i.test(req.body)) return res.status(400).send("DOCTYPE không được phép"); // phòng ngừa sâu
  const doc = libxml.parseXml(req.body, { noent: false, dtdload: false, dtdvalid: false, nonet: true, noblanks: true, recover: true });
  // ...trích xuất an toàn ở đây
  res.json({ ok: true });
});
app.listen(3000);

Giải pháp thay thế: sử dụng bộ phân tích không hỗ trợ DTD

javascript Copy
// fast-xml-parser: không giải quyết các thực thể bên ngoài
import { XMLParser } from "fast-xml-parser";
const parser = new XMLParser({ ignoreAttributes:false, allowBooleanAttributes:true });
const data = parser.parse(xmlString); // không mở rộng thực thể bên ngoài

Tăng cường quy trình của bạn (danh sách kiểm tra)

  • Chặn DOCTYPE và các thực thể bên ngoài ở phía máy chủ.
  • Ưu tiên các bộ phân tích không hỗ trợ DTD/XXE.
  • Thực thi các giới hạn nghiêm ngặt về Content-Type và kích thước.
  • Chạy API trong môi trường hạn chế mạng (không có quyền egress theo mặc định).
  • Thêm SAST/DAST vào CI; bao gồm các bài kiểm tra XXE.

Kết luận

Bảo vệ ứng dụng React của bạn khỏi lỗ hổng XXE là điều cần thiết để đảm bảo an toàn cho dữ liệu và hệ thống của bạn. Hãy kiểm tra sức mạnh của các bộ phân tích XML mà bạn đang sử dụng và thực hiện các biện pháp bảo mật thích hợp ngay hôm nay.

Thử nghiệm miễn phí

Quét trang web của bạn với Công cụ quét lỗ hổng trang web miễn phí của chúng tôi: https://free.pentesttesting.com/
Nó sẽ đánh dấu các nguy cơ web phổ biến và đưa ra mẹo khắc phục mà bạn có thể thực hiện ngay lập tức.

Dịch vụ liên quan (hỗ trợ nhanh từ nhóm của chúng tôi)

Dịch vụ CNTT Quản lý

Đảm bảo tính ổn định + bảo mật từ nền tảng. https://www.pentesttesting.com/managed-it-services/

Bảo mật ứng dụng AI

Bảo vệ LLMs, tác nhân và đường ống dữ liệu. https://www.pentesttesting.com/ai-application-cybersecurity/

Cung cấp dịch vụ bảo mật cho khách hàng của bạn

Kiểm toán và công cụ quét thương hiệu trắng cho các cơ quan/MSPs. https://www.pentesttesting.com/offer-cybersecurity-service-to-your-client/

Cập nhật thông tin: Đăng ký trên LinkedIn https://www.linkedin.com/build-relation/newsletter-follow?entityUrn=7327563980778995713

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