Hello, chào mừng đến bài writeup của mình về SSTI (Server-Side Template Injection)
Duới đây là source mà mình thuờng rất hay dùng để tìm payloads và mình nghĩ nó rất là hữu ít.
Source: https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection
Ok! Cùng nhau giải lab này thôi.
Đầu tiên, khi các bạn truy cập lab thì đây là page chính.
Dưới phần “My Pages” có hai pages nhỏ. Mình sẽ truy cập vào hai page đó để xem RESPONSE là gì.
404Eror Page
robots.txt
Có vẻ như tên page sẽ đuợc phản chiếu lại trên page. Để kiểm tra độ chính xác, chúng ta sẽ thử truy cập vào “/arenacookie”
Yeah! Có vẻ như chúng ta vừa tim ra “injeciton point.” Tức là web sẽ phản hồi lại tùy vào input của người dùng. Đây là nơi chúng ta sẽ thực hiện SSTI.
Khi các bạn muốn tìm ra SSTI, đầu tiên chúng ta phải xác định ngôn ngữ (template) nào mà server (máy chủ) sử dụng. Dùng diagram duới đây để chúng ta xác định.
Chúng ta sẽ thử payload cơ bản nhất để xác định SSTI {{7*7}}
. Chúng ta còn có thể thử các payload cơ bản khác duới đây, tuy nhiên để bài viết ngắn gọn, mình sẽ vào thẳng vấn đề.
A ha!, chúng mình đã tìm đúng chỗ. Lý do mà chúng ta thấy số 49 là vì khi mình send cái request có chứa {{7*7}}, server sẽ nghĩ đây là code cần chạy nên server sẽ xử lý và trả lại số 49 cho chúng ta.
Đến đây, chúng ta đã loại đuợc một vài template. Để xác định đuợc chính xác hơn, chúng ta sẽ dùng payload sau đây {{7*'7'}}
Nếu kết quả là 7777777
thì template là Jinja2.
Nếu kết quả là như mong đợi thì chúng ta phải thử các payload khác.
Chính là nó, Jinja2
Đây là phần thú vị nhất, tìm flag.txt
Bây giờ chúng ta đã xác định đuợc Template mà server sử dụng là Jinja2. Dùng đuờng link sau đây để tìm payload nào.
Link: Flask Jinja2 Pentesting | Exploit Notes
Các bạn kéo xuống đến phần “RCE” sẽ thấy payload cùa chúng ta tìm.
Sau một lúc thử và sai, thì mình tìm ra payload này
Payload: {{ request.application.__globals__.__builtins__.__import__('os').popen('id').read() }}
Chúng ta đã gần hơn rồi. Bây giờ là payload để tìm flag (…popen(‘cd …; cat flag.txt’)…)
Payload: {{ request.application.__globals__.__builtins__.__import__('os').popen('cd ..;cat flag.txt').read() }}
Chúc mừng! Bạn đã tìm đuợc flag. Nếu các bạn có cách nào khác, comment để mình có thể học từ các bạn nhé.