VINHKY
IO.VN

3. SQL injection attack, querying the database type and version on Oracle (

#sql-injection
1 giờ trước
2 phút đọc

Hiểu về lỗ hổng

Lỗ hổng nằm ở bộ lọc product category (danh mục sản phẩm). Khi ứng dụng web nhận input từ người dùng mà không kiểm tra kỹ, kẻ tấn công có thể chèn các câu lệnh SQL độc hại vào để thao túng câu truy vấn gốc. Kỹ thuật chúng ta sử dụng ở đây là UNION-based SQL Injection, cho phép chúng ta "nối" thêm kết quả từ một truy vấn do mình tự tạo vào kết quả gốc của ứng dụng.

Điểm đặc biệt của Oracle

Khác với MySQL hay PostgreSQL, Oracle cực kỳ "khó tính":

  1. Luôn cần FROM: Trong Oracle, mỗi câu lệnh SELECT bắt buộc phải có mệnh đề FROM.

  2. Bảng dual huyền thoại: Nếu bạn chỉ muốn kiểm tra dữ liệu thử nghiệm (ví dụ SELECT 'abc') mà không muốn truy vấn từ bảng nào cụ thể, hãy dùng bảng có sẵn là dual.

Hướng dẫn giải chi tiết (Step-by-step)

Để giải quyết bài lab này, mình thực hiện qua 3 bước chính:

Bước 1: Can thiệp bằng Burp Suite

Đầu tiên, sử dụng Burp Suite để "bắt" request khi bạn chọn một danh mục sản phẩm. Chúng ta cần can thiệp vào tham số category để chèn payload.

Bước 2: Xác định số lượng cột và kiểu dữ liệu

Trước khi lấy được phiên bản DB, ta cần biết câu lệnh gốc đang trả về bao nhiêu cột và cột nào cho phép hiển thị chữ (text). Dùng payload sau để kiểm tra: '+UNION+SELECT+'abc','def'+FROM+dual--

  • Nếu trang web load bình thường, có nghĩa là truy vấn gốc đang sử dụng 2 cột và cả 2 đều chấp nhận kiểu dữ liệu văn bản.

Bước 3: "Moi" thông tin phiên bản

Khi đã chắc chắn về số cột, ta dùng câu lệnh chuyên dụng của Oracle để đọc thông tin từ bảng v$version: '+UNION+SELECT+BANNER,+NULL+FROM+v$version--

  • Tại sao dùng NULL? Vì ta chỉ cần cột đầu tiên (BANNER) chứa thông tin phiên bản, cột thứ hai ta có thể để trống (NULL) để đảm bảo số lượng cột khớp với câu lệnh gốc.