Template Engine là công cụ hỗ trợ xây dựng trang html bằng cách sử dụng các file template tĩnh, trong đó các biến hoặc placeholder sẽ được thay thế bằng dữ liệu thực tại runtime. Cách thức hoạt động cơ bản của ngôn ngữ template bao gồm back-end rendering và front-end rendering:

Một số template phổ biến:

vd:

$output = $twig->render("Dear {first_name},", array("first_name" => "Carlos"));

Template Injection là lỗ hổng bảo mật cho phép user chèn mã template vào một template có sẵn, khiến template engine thực thi mã đó

Lổ hổng phát sinh khi dữ liệu đầu vào được concatenate trực tiếp vào các template thay vì được truyền vào dưới dạng dữ liệu

Cũng với vd trên, nếu như truyền vào template input trực tiếp từ người dùng thay vì dữ liệu tĩnh, có thể dẫn đến SSTI:

$output = $twig->render("Dear " . $_GET['name']);

<http://website.com/?name={{7*7}>}
-> Dear 49

Quá trình khai thác lỗ hổng:

08baa50e-6dd5-4eb0-bf13-d6324ca75efb.webp

  1. Detect

    Đây là bước xác định có xảy ra lỗ hổng hay không , ở vị trí nào.

    Có thể sử dụng những phép tính đơn giản như {{7*7}}, tùy vào template. Nếu kết quả trả về chuỗi lạ hoặc kết quả phép tính, có thể xác định tồn tại lỗ hổng.

    Chuỗi ${{<%[%'"}}%\\. chứa các toán tử của hầu hết các Template phổ biến, các dấu hiệu SSTI có thể là

  2. Identify

    Sau khi xác định có lỗ hổng SSTI, cần nhận dạng template sử dụng để tấn công.

    https://github.com/Hackmanit/template-injection-table

    Bảng tương tác chứa các polyglot template injection

  3. Exploit

    Khi đã xác định template được sử dụng, cần xây dựng các payload để tìm kiếm các thông tin quan trọng.

    Quá trình khai thác thường gồm 3 giai đoạn: Read , Explore ,Attack

Một số ví dụ và flow attack: