3v@l
Introduction
PicoCTF 2025
Category: Web Exploitation
Write-up date: 19/03/2025
Question: ABC Bank's website has a loan calculator to help its clients calculate the amount they pay if they take a loan from the bank. Unfortunately, they are using an eval function to calculate the loan. Bypassing this will give you Remote Code Execution (RCE). Can you exploit the bank's calculator and read the flag? The website is running Here.
Point: Medium
Vulnerability
Recon
Đề bài cho sẵn là trang web tính toán của ngân hàng ABC Bank's sử dụng eval một function nào đó để tính toán. Bybass được sandbox của trang web này thì chúng ta sẽ có thể RCE được.
Khi truy cập trang web, thì ta nhận được form tính toán của ngân hàng.

Mở trang network thì có thể thấy server sử dụng trên nền của python Server: Werkzeug/3.0.6 Python/3.8.10
Vậy nên syntax của payload RCE sẽ dựa trên python.
Khi kiểm tra đến source code thì ta nhìn thấy có phần todo được comment vào website:
TODO
------------
Secure python_flask eval execution by
1.blocking malcious keyword like os,eval,exec,bind,connect,python,socket,ls,cat,shell,bind
2.Implementing regex: r'0x[0-9A-Fa-f]+|\\u[0-9A-Fa-f]{4}|%[0-9A-Fa-f]{2}|\.[A-Za-z0-9]{1,3}\b|[\\\/]|\.\.'
Như ta có thể thấy, trang đã blacklist toàn bộ những từ khóa như
os,eval,exec,bind,connect,python,socket,ls,cat,shell,bind và chặn hết các mã hex, unicode, binary, các dấu gạch chéo,
đóng mở ngoặc nhọn đề phòng chúng ta rce.
Exploit
Đề bài của bài này dễ thở hơn SSTI, khi chúng ta có quyền truy cập thẳng vào __import__() mà không phải qua bất kỳ
trung gian nào. Nhưng có một vấn đề ở đây là từ khóa os ở đây đã bị block. Thì ở đây ta có thể dùng string concat để
né được filter __import__('o'+'s'). Tiếp đó, như bài ssti thì ta có thể dùng câu lệnh popen ở đây để tương tác với
shell và RCE.
Tuy nhiên một trở ngại tiếp theo là flag của bài này được đặt ở folder gốc /flag.txt mà chúng ta lại
đang ở folder /app, nếu muốn truy cập thì sẽ cần dùng đến dấu . và dấu /. Để né filter . hoặc / thì chúng ta
sẽ sử dụng hai chiến thuật chính:
- Dùng các câu lệnh của shell để bybass:
Để biết trên hệ thống gì, trước hết chúng ta hãy thử câu lệnh echo $0. Payload:
Cách này đòi hỏi chúng ta kết hợp nhiều lệnh với nhau để né được filter. Như ta đã biết, câu lệnh tr có thể thay đổi
một hoặc nhiều chữ cái này thành các chữ cái khác. Dựa trên việc đó kết hợp với biến môi trường
$0 ($0 là gì) ta có thể viết được payload shell như sau
nl là câu lệnh dùng để thay thế cat, câu lệnh này sẽ đọc file ra và đánh số từng dòng một.
echo $0 ở đây dùng để in ra /bin/sh, còn tr -d dùng để xóa những chữ cái binsh có trong chuỗi trước, khi đó cả
cụm sẽ trả về là //. Mà trong linux, không có thư mục nào không có tên nên linux tự đổi thành /. Từ đó kết hợp lại
ta có câu lệnh là nl /flag* (in ra tất cả các file có bắt đầu bằng flag trong folder /)
- Dùng base64 để bybass:
Cách này mình đánh giá là thân thiện hơn, khi ta chỉ cần import hàm base64 vào và decode payload shell mà chúng ta viết từ trước, ví dụ như:
Kết hợp với payload trên ta có payload cuối cùng là