Writeup Final Exam 0x06

Tổng quan Challenge
Challenge có 4 flags trong 1 trang web
Thông tin hệ thống:

Đây là giao diện web:

Và chức năng chỉ có đăng nhập, đăng ký và mình cần đăng nhập để sử dụng các chức năng khác
K06FE FLAG 01

Việc đầu tiên mình cần làm là đăng ký 1 tài khoản và sử dụng nó như một user bình thường.
Sau khi đăng nhập thì mình thấy có một số chức năng chính cho user như sau: Xem ảnh, xem profile, đổi mật khẩu.
Khi mình bấm vào xem 1 bức ảnh thì thấy được: Ảnh, tiêu đề ảnh và email của người post ảnh.
Bùm!!! Hiện luôn email của admin là admin@example.com.

Ngay sau khi lấy được tài khoản admin thì mình lập tức đăng xuất tài khoản user và thực hiện bruteforce mật khẩu admin (bằng list mật khẩu của cookie arena cho từ trước). Trong khi chờ kết quả thì mình thử SQL injection ở form đăng nhập bằng 2 payload đơn giản là ' và ''.
Và cả 2 đều không đưa ra kết quả gì đáng chú ý. Về form đăng nhập thì mình tạm coi đó là không có lỗi để test thêm các chức năng bên trong trước.
Tiếp tục quay lại với chức năng xem Profile thì xem được những thông tin sau: Email, Username, Role và ID. Mình có hơi nghi ngờ chỗ ID vì nó được gán bằng 2 (có thể admin được gán bằng 1 và ID = ID + 1 khi có user mới ??)

Để kiếm chứng lại thì mình đã tạo thêm 1 user mới và bùm!! Your UserID = 3, thế là đã biết khả năng cao ID của admin = 1.

Kiểm tra thêm 1 vòng thì chức năng này không có gì ngoài xem Profile. "Chắc là lỗi nằm ở chức năng cuối đấy :vv"
Vào chức năng chage password thì thấy luôn đổi mật khẩu mới và xác nhận mật khẩu mới mà không cần nhập mật khẩu cũ (Bắt đầu nghi nghi rồi).

Mình thử đổi mật khẩu và submit để bắt được request xem nó có gì. Và có thể thấy luôn POST request có nội dung password-1=1&password-2=1&id=3&submit= , response báo 200 khi thành công

Ngay lập tức mình test luôn với id=1 và nó cũng báo thành công, đến đây thì khả năng cao nữa là đã change được password của admin thành 1 rồi.

Đăng xuất và đăng nhập thử với tài khoản là admin@example.com (Lấy được lúc xem ảnh) và mật khẩu là 1 (Mới thử change). Và bùm, đăng nhập thành công vào được tài khoản admin, tiếp tục vào xem profile để lấy flag thôi.

FLAG 1: CHH{n0_On3_c4N_Ch4ng3_y0uR_p4s5}
Lỗ hổng này nằm trong loại lỗ hổng Authentication Vulnerability.
K06FE FLAG 02

Ở flag 2 có gợi ý là nằm trong cơ sở dữ liệu nên mình tìm chỗ nào có thể test SQLi được mình test luôn.
Ở tài khoản Admin ngoài 2 chức năng xem Profile và Change password thì có thêm Admin Dashboard. Khi vào Admin Dashboard sẽ có luôn chức năng tìm kiếm hình ảnh, ngoài ra còn có xem User và Restore.

Thử từng chức năng thì thấy User chỉ có xem thông tin User, còn k thể xoá hay thực hiện gì với user, còn 2 vị trí khả năng lỗi là trang đầu tiên với chức năng tìm kiếm và form nhập mật khẩu ở Restore.
Mình thử trước với chức năng tìm kiếm thì lại bùm :)) với payload là ' , thông báo lỗi hiện ra ngay lập tức với cả query luôn.

Tiếp tục thử với payload '-- vẫn bị lỗi, thử lại bằng '-- -' thì không có gì xảy ra.
Bắt đầu khai thác SQLi với các bước và payload sau (Ở đề bài cho biết sử dụng MySQL):
Xác định số cột thử bằng các payload sau:
1' ORDER BY 10-- -'-> false1' ORDER BY 5-- -'-> false1' ORDER BY 3-- -'-> true1' ORDER BY 4-- -'-> false
\=> Vậy bảng có 3 cột
Xác định vị trí cột có thể hiển thị lên màn hình:
1' UNION SELECT 1, 2, 3-- -'Bắt được response trả về là 1 hình ảnh trắng có
src='3'và có 1 GET request/3được gửi đi

Đoạn này cũng chưa rõ lắm nên mình có test lại với payload:
1' UNION SELECT 1, 3, 2-- -'thì thu được kết quả với ảnh cósrc ='2'và cũng có 1 GET request /2 được gửi
\=> Vị trí bảng có thể hiện thị là 3
Tìm kiếm tên bảng của DB:
1' UNION SELECT 1, 2, table_name FROM information_schema.tables WHERE table_schema=database()-- -'Website hiển thị lên 3 ảnh trắng, kiểm tra response thì lấy được các src của ảnh hoặc có thể để ý có 3 GET request được gửi bao gồm
/images,/flag,/users
\=> Lấy được tên của 3 bảng và bảng chứa flag chắc nằm luôn trong bảng flag rồi
Tìm kiếm tên cột của bảng flag:
1' UNION SELECT 1, 2, column_name FROM information_schema.columns WHERE table_name="flag"-- -'
\=> Giống hư các bước trên mình thu được duy nhất 1 cột là flag2
Khai thác và lấy flag thôi:
1' UNION SELECT 1,2, flag2 FROM flag-- -'
\=> FLAG 2: CHH{S4n1tiZ3_1NpUt_pL3A5e}
Lỗ hổng này là SQL injection - In Band
K06FE FLAG 03

Ở bài này có gợi ý là nằm trong file password.php nên mình nghĩ đến luôn các lỗi về OS command và file, nhưng ở bài cuối (Start Me Now) có gợi ý là sử dụng Webshell rồi nên mình ưu tiên test các lỗi về file trước và tạm bỏ qua lỗi liên quan đến OS command.
Khi xem 1 bức ảnh thì mình lấy được thông tin của bức ảnh

Thấy luôn URL Image, mình đưa nó vào đối tượng nghi vấn và bắt đầu thử nó.
Gặp mấy cái lỗi về file thì mình tường test luôn path traversal với payload: images/image-2.jpg/../../../../../../../../../../../../../etc/passwd biết đâu có bất ngờ.
Bất ngờ thật là nó thông báo No cheating :3, vậy tức là có filter 1 cái gì đó ở payload này.

Mình thử loại bỏ từng ký tự như . , / , etcvà passwd để xem nó bị filter cái gì, cuối cùng thì passwd bị filter. Mình lên PayloadsAllTheThings và lấy được danh sách các file có thể thay thế passwd.

Vì không biết cái nào có thể sử dụng là mà không cần phải cấp quyền truy cập mức sudo nên mình thử từng cái với terminal của mình và lấy được /etc/group là có thể thay được. Thay payload thành images/image2.jpg/../../../../../../../../../../../../../etc/group và nó đã không báo lỗi nữa. Kiểm tra Response và các method được gửi đi thì cũng không có gì lạ xảy ra.
Loay hoay 1 hồi không có giải pháp thì anh Đạt có đưa ra hint của Flag này là 'Chỗ nào có sử dụng URL thì bị SSRF'. Đọc được đoạn này thì mình tương thẳng payload file:///etc/group vào URL luôn và bùmmmmm.
file:///etc/group được đổi thành 1 đường link dẫn tới 1 hình ảnh, và vì hình ảnh này có nội dung không phải là 1 hình ảnh nên không thể mở được trên browser, check qua GET request được gửi đi ta lấy được response là nội dung của /etc/group

Vì đường dẫn thư mục gốc là /www nên mình truyền thử vào file:///www/password.php , đọc được file luôn.

FLAG 3: CHH{SSRF_i5_k1nD4_iNt3rE5t1n6}
Lỗ hổng này là SSRF - Server Side Request Forgery
