Web - Simple SSTI (Server-side Template Injection)

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.

image

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
image

robots.txt
image

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”
image

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.
image

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.

assets_-L_2uGJGU7AVNRcqRvEi_-M7O4Hp6bOFFkge_yq4G_-M7OCvxwZCiaP8Whx2fi_image

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 đề.
image
image

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.
image

Chính là nó, Jinja2
image

Đâ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é.