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:
- Giao diện người dùng React chấp nhận tệp XML (tải lên/tin nhắn).
- Frontend gửi tệp đến API.
- 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://
). - 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
// 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
<?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
// 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
// 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
// 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