---
# System prepended metadata

title: My Bidda SrdnlenCTF

---

# Task
![](https://hackmd.io/_uploads/ByounT2f6.png)

## Recon
Trang web này có cách chức năng chính như sau:
- Thứ nhất là chức năng ```send us bidda``` người dùng nhập vào đó các trường thông tin như là tên, url, và dân số
- Thứ hai là chức năng xem các bidda ta nhập tên và hiện ra các dữ liệu ta vừa nhập
Nhưng đó không phải là tất cả sau khi nhập vào đó thông tin ta sẽ được điều hướng đến một trang khác trang này sẽ render ra mã html với các thông tin mà ta đã điền vào
![](https://hackmd.io/_uploads/B1JRpT2Ma.png)
## Source code analysis
Trang web sử dụng flask để code khiến ta khá là chắc là nó bị ssti nhưng cứ kiểm tra source code cho chắc ăn xem ở đây [đây](https://github.com/khacminh03/CTF-Write-Up/tree/main/srdnlen)
Phân tích đoạn đầu của source code

```python=
class Bidda:
  def __init__(self, name, population, image):
    self.name = name
    self.population = population
    self.image = image

  def __repr__(self):
    return self.name

random_string = ''.join(random.choice(string.ascii_letters) for i in range(10))
env = jinja2.Environment(loader=PackageLoader("app"),
                         block_start_string='@'+random_string,
                         block_end_string=random_string+'@',
                         variable_start_string='!'+random_string,
                         variable_end_string=random_string+'!')
```

Dễ thấy chương trình khởi tạo một class với ```name```, ```population```, ```image``` rồi lại khởi tạo một chuỗi ngẫu nhiên
Nhưng cái quan trọng nhất chính là biến ```env``` nhận thư viện ```jinja2``` cài đặt môi trường trích nguyên văn của chat gpt khi đưa đoạn code này vào là:

"Đoạn mã bạn đưa ra là một phần của mã Python sử dụng thư viện Jinja2 để cấu hình môi trường mẫu (template environment) của Jinja2. Jinja2 là một hệ thống mô phỏng mạnh mẽ được sử dụng để tạo và hiển thị nội dung dựa trên mẫu. Trong đoạn mã này, bạn đang cấu hình môi trường mẫu với các cài đặt tùy chỉnh, bao gồm:

1. `PackageLoader("app")`: Đây là cách bạn cấu hình một trình tải (loader) cho môi trường mẫu. Trong trường hợp này, bạn đang sử dụng `PackageLoader` để tải các mẫu từ gói "app". Điều này thường sử dụng trong trường hợp bạn muốn nạp các mẫu từ một gói hoặc module cụ thể trong ứng dụng của bạn.

2. `block_start_string`, `block_end_string`, `variable_start_string`, `variable_end_string`: Đây là các chuỗi được sử dụng để định nghĩa cú pháp cho các khối và biến trong mẫu. Jinja2 cho phép bạn định nghĩa cú pháp tùy chỉnh cho các thành phần này. Trong trường hợp này, bạn đã thay đổi các chuỗi bắt đầu và kết thúc của các khối và biến bằng cách sử dụng các giá trị `random_string` để tạo cú pháp duy nhất cho ứng dụng của bạn.

Điều này giúp bạn tạo ra một môi trường mẫu tùy chỉnh với cú pháp độc đáo mà bạn có thể sử dụng trong các mẫu Jinja2 của mình, thay vì sử dụng cú pháp mặc định."

Vậy là ta có thể vậy là các block mà ta đưa vào có thể bị obfucate đi khiến cho câu lệnh không được thực thi chẳng hạn như là payload {{7 * 7}} sẽ bị hiểu thành một đoạn string bình thường do chúng ta không đúng định dạng mà người viết đặt ra đó chính là ```!+randomString + payload + randomString!``` kiểu kiểu như vậy
Nhưng làm thế nào để có thể biết được randomString là cái gì thực sự mà nói đến đây mình rất là bế tắc nhưng cảm ơn một bạn ở trên discord đã hint cho mình đó chính là dùng chức năng ```find my bidda``` để in ra được đoạn string random đó với cú pháp là 
```http://mybidda.challs.srdnlen.it/inspect_bidda?name=variable_start_string```
Và ta có được kết quả là 
![](https://hackmd.io/_uploads/B11AZR2Ma.png)
Nhưng tại sao ta có thể call được đến biến đấy
Là do dòng này ```tmp = env.__dict__.get(name)``` ở file inspect_bidda.html dòng này lấy giá trị của ```env``` rồi lại gọi đến dictionary và get lấy tên của nó vậy nếu như ta get lấy variable_start_string thì ta có thể lấy được random string đấy
thử lại với payload như sau
```!YqwNTZXWTZ 7 * 7 YqwNTZXWTZ!```
![](https://hackmd.io/_uploads/Ski8QAhGa.png)
Vậy là ta đã có thể triển khai ssti được rồi

Final payload
```!YqwNTZXWTZ lipsum.__globals__["os"].popen('cat flag.txt').read() YqwNTZXWTZ!```

## Flag
![](https://hackmd.io/_uploads/SkmxN03fT.png)

