[WebSec] Level 4
Information Gathering
Challenge này có chỗ input là id, nhưng không giống như Level 1 là sẽ ra lỗi khi nhập ký tự đặc biệt.
Với giá trị cookie leet_hax0r: Decode base64 ra thì là một dạng json sau khi serialize.
1 |
|
Ý nghĩa của các thành phần đoạn JSON trên là:
a: array sẽ chứa 1 giá trị duy nhất là
ip
.ip
có độ dài là 2, và cóvalue
dài 13 kí tự.
Cấu trúc của Serialize trong PHP có dạng data-type:data
.
1 |
|
Challenge cho 2 source code, nhưng chú ý trong source 1 là viết ở dạng OOP, có các Magic Methods được dùng như __construct()
, __destruct()
.
__construct()
: hàm này được gọi khi khởi tạo một đối tượng.__destruct()
: hàm này được gọi khi đối tượng bị xoá đi. Khi nó không tham chiếu đến đối tượng deserialize tồn tại.
Quá trình serialize và deserialize diễn ra như hình bên dưới:
Exploit
Để ý dòng code ở source 2. Thì giá trị cookie leet_hax0r được encode base64
.
Mình sẽ tạo dòng Code giống class SQL để serialize nó.
1 |
|
Sau khi bulid source xong, run code sẽ ra Object và đoạn base64 như sau:
Vì sao phải dùng UNION để select sql mà không select ở vế trước luôn?
Vì ta để ý source code 2, trong hàm
__destruct()
chỉ in ra màn hình$row['username']
. Nên bắt buộc trong câu query của mình phải select username.
Hoặc có thể dùng câu query gán tên cột cần select bằng username như sau cho gọn:
select group_concat(sql) as username from ...
Copy đoạn base64 thay thế giá trị cookie leet_hax0r, sau đó gửi reuqest:
Kiểm tra xem còn table nào ngoài users không? Kết quả là không còn table nào khác.
Mình đoán là Flag nằm ở password, nên sẽ select password ra.