Home / Sharenewshort / Khai thác LFI qua XSS trong Prince PDF Generator — Phân tích kỹ thuật

Khai thác LFI qua XSS trong Prince PDF Generator — Phân tích kỹ thuật

TL;DR

Một tính năng preview PDF sử dụng engine PrinceXML có API JavaScript PDF.attachFile(...). Nếu ứng dụng cho phép người dùng chèn HTML vào nội dung được render, kẻ tấn công có thể tận dụng attachFile để đính kèm file hệ thống (ví dụ file:///etc/passwd) vào PDF đầu ra, từ đó lộ thông tin nội bộ — một biến thể của Local File Inclusion (LFI) xuất phát từ XSS.


Bối cảnh kỹ thuật

  • Ứng dụng cho phép người dùng cung cấp HTML để render thành PDF (ví dụ endpoint previewTemplate).
  • Engine dùng để render PDF là PrinceXML — điều này có thể được xác nhận qua metadata của PDF (ví dụ Producer: Prince ...).
  • PrinceXML hỗ trợ JavaScript trong tài liệu PDF và cung cấp API như window.PDF.attachFile() để đính kèm file vào PDF.

Mô tả lỗ hổng và chuỗi tấn công

  1. Injection đầu vào: attacker chèn HTML/JS vào trường được render.
  2. JS runtime của Prince: mặc dù runtime bị hạn chế (nhiều API web tiêu chuẩn như fetch không có), vẫn hỗ trợ nạp external script hoặc thực thi một số API nội bộ.
  3. API đích: PDF.attachFile("<url>", "<name>") cho phép đính kèm file vào PDF. Nếu kẻ tấn công truyền file:///etc/passwd, engine sẽ lấy file từ hệ thống file máy chủ và gắn nó như một attachment trong file PDF sinh ra.
  4. Khai thác: attacker tải PDF xuống, sử dụng công cụ (ví dụ pdfdetach từ poppler) để liệt kê và trích xuất file đính kèm, xem nội dung file nhạy cảm.

Ví dụ payload JS (minified cho môi trường Prince):

<script>
window.addEventListener('load',function(){
  PDF.attachFile('file:///etc/passwd','passwd.txt');
});
</script>

Sau khi PDF được sinh ra và tải về, attacker có thể:

pdfdetach -list report.pdf
pdfdetach -saveall report.pdf
cat passwd.txt

Những khó khăn ban đầu và tư duy khám phá

  • Nhiều payload XSS quen thuộc (onload/onerror/iframe) không hoạt động do runtime bị giới hạn.
  • Bước quyết định là xem xét tài liệu PrinceJS để tìm API hỗ trợ đính kèm file — đây là hướng tiếp cận sáng tạo: không phải tấn công DOM hay mạng trực tiếp, mà repurpose API hợp lệ của engine.

Hậu quả thực tế

  • Lộ dữ liệu cục bộ trên server (Local File Inclusion) mà không cần truy cập hệ thống file qua các kênh truyền thống.
  • Mất bí mật, rò rỉ thông tin cấu hình, khóa, hoặc các file chứa thông tin người dùng — tùy vào quyền chạy tiến trình Prince.

Khuyến nghị cho Red Teamers

  • Khi test PDF generator, kiểm tra mọi API JavaScript nội bật — đặc biệt các hàm thao tác file, upload, hoặc kết nối hệ thống.
  • Thử payload file:/// với PDF.attachFile hoặc các cơ chế nạp tài nguyên nội bộ khác.
  • Kiểm tra metadata PDF để xác định engine và phiên bản (ví dụ Producer: Prince ...) để tra tài liệu API phù hợp.

Khuyến nghị bảo mật cho Developer/DevOps

  1. Tắt JavaScript trong tài liệu PDF nếu không cần thiết. Không bật JavaScript cho nội dung đến từ người dùng.
  2. Vô hiệu hoá các API rủi ro: nếu không cần chức năng đính kèm file, cấu hình hoặc biên dịch/khởi chạy Prince để tắt attachFile hoặc chặn truy cập file địa phương.
  3. Chạy engine trong sandbox: tách tiến trình render khỏi môi trường có quyền truy cập file hệ thống quan trọng; giới hạn quyền đọc file và quyền người dùng hệ thống.
  4. Sử dụng cờ bảo mật của Prince: Prince có tuỳ chọn để ngăn chặn truy cập file nội bộ (ví dụ --no-local-files); bật cờ này cho môi trường xử lý input không tin cậy.
  5. Validate & sanitize input: hạn chế nội dung HTML cho phép, hoặc chỉ cho phép template engine server-side sinh HTML an toàn thay vì đưa HTML thô từ người dùng vào Prince.
  6. Audit & logging: ghi nhận hành vi attach file, phát hiện sự khác thường khi các file hệ thống bị đính kèm vào PDF.

Phòng thủ bổ sung & kiểm thử

  • Tự động hoá kịch bản kiểm thử cho PDF service: gửi payload chứa file:/// và kiểm tra xem PDF có file đính kèm không.
  • Kiểm tra quyền người dùng chạy tiến trình Prince; nếu tiến trình chạy dưới quyền root, mức rủi ro cực kỳ cao — chuyển sang user ít quyền hơn.
  • Rà soát chính sách access control và sandboxing (AppArmor, SELinux, chroot, containerization).

Kết luận

Khai thác LFI thông qua XSS ở PrinceXML là một ví dụ điển hình về việc kết hợp tính năng hợp lệ của thư viện để làm lộ dữ liệu nhạy cảm. Việc phòng thủ yêu cầu tắt/giới hạn JavaScript, vô hiệu hoá API rủi ro, và áp dụng sandboxing cùng kiểm thử chủ động. Khi vận hành dịch vụ render PDF từ input người dùng, hãy luôn giả định rằng bất kỳ API nào cho phép truy cập tài nguyên bên ngoài đều là đường dẫn tấn công tiềm ẩn.

Source link: Local File Inclusion via XSS in Prince PDF Generator

Leave a Reply

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *