SQL injection vulnerabilities - Lỗ hổng SQL injection (Phần 3)
II. Phân tích và khai thác các lỗ hổng SQL Injection (tiếp)
4. Khai thác lỗ hổng SQL injection - Thu thập thông tin câu truy vấn (tiếp)
4.2. Xác định cột dữ liệu tương thích với kiểu dữ liệu cần truy xuất
Sau khi xác định được số cột dữ liệu trả về, chúng ta cần tiếp tục tìm kiểm cột dữ liệu có thể được khai thác để hiển thị (trả về) kết quả thông tin truy xuất cụ thể. Thông thường kiểu dữ liệu thông tin cần khai thác là string nên chúng ta có thể thực hiện thử lần lượt từng cột như sau:
SELECT name, description FROM products WHERE category = 'gift' UNION SELECT 'column1', NULL--'
SELECT name, description FROM products WHERE category = 'gift' UNION SELECT NULL, 'column2'--'
Sau đó tìm kiếm trong giao diện phản hồi các từ khóa column1, column2, sự xuất của từ khóa cũng tương ứng với cột dữ liệu có thể khai thác kiểu chuỗi. Để dễ dạng tìm kiếm các từ khóa đặc biệt này, chúng ta nên để tham số category
nhận giá trị rỗng để loại bỏ các thông tin dư thừa, ví dụ payload:
' UNION SELECT 'column1', NULL--
Phân tích lab SQL injection UNION attack, finding a column containing text
Miêu tả: Trang web chứa lỗ hổng SQL injection trong chức năng bộ lọc hiển thị sản phẩm. Kết quả được hiển thị trong giao diện trả về. Để giải quyết bài lab, chúng ta cần khai thác lỗ hổng nhằm tìm kiếm cột có dữ liệu trả về tương thích với dữ liệu dạng chuỗi (string).
Chúng ta có thể sử dụng chức năng bộ lọc hiển thị sản phẩm theo loại, được xác định qua tham số category
trong thanh URL truyền tới hệ thống qua phương thức GET. Tham số này có thể thay đổi tùy ý. Giá trị này cũng được hiển thị trong giao diện response.
Chúng ta cần giao diện response hiển thi chuỗi pYazDc. Kiểm tra lỗ hổng SQL injection tại tham số category
:
Xác định số cột dữ liệu truy vấn với lệnh UNION:
Payload: /filter?category=some-string' UNION SELECT NULL, NULL, NULL--
không trả về error.
Xác định số cột dữ liệu truy vấn với lệnh ORDER BY:
Payload: /filter?category=some-string' ORDER BY 3--
không trả về error.
Payload: /filter?category=some-string' ORDER BY 4--
trả về error.
Như vậy câu lệnh truy vấn trả về cột dữ liệu. Tiếp theo, chúng ta cần xác định cột dữ liệu nào sẽ tương thích với kiểu dữ liệu chuỗi (string).
Kiểm tra kiểu dữ liệu trả về trong cột . Payload: /filter?category=some-string' UNION SELECT 'column1', NULL, NULL--
trả về error:
Kiểm tra kiểu dữ liệu trả về trong cột . Payload: /filter?category=some-string' UNION SELECT NULL, 'column2', NULL--
trả về chuỗi column2 trong giao diện:
Như vậy dữ liệu trong cột tương thích với kiểu dữ liệu string. Hiển thị chuỗi pYazDc trong giao diện. Payload: /filter?category=some-string' UNION SELECT NULL, 'pYazDc', NULL--
Bài lab được giải quyết!
5. Khai thác lỗ hổng SQL injection - Truy xuất dữ liệu trong các bảng (database tables)
Sau khi xác nhận chính xác số lượng cột dữ liệu trả về trong câu truy vấn và cột dữ liệu có thể thực hiện khai thác (trả về thông tin, thường là kiểu string), chúng ta có thể bắt đầu thực hiện thu thập dữ liệu.
5.1. Kiểm tra kiểu và phiên bản hiện hành của hệ cơ sở dữ liệu
Trước khi đi vào khai thác dữ liệu, chúng ta nên thu thập các thông tin liên quan tới mục tiêu, càng nắm bắt được nhiều thông tin, khả năng tấn công thành công sẽ càng cao. Một trong những thông tin cần xác nhận đầu tiên chính là kiểu và phiên bản hệ cơ sở dữ liệu. Tất nhiên rồi, mỗi hệ cơ sở dữ liệu có các cú pháp truy vấn khác nhau, đây là một thông tin rất quan trọng giúp cho bước xây dựng payload sau đó.
Đối với mỗi hệ quản trị cơ sở dữ liệu được hệ thống sử dụng, các câu truy vấn phiên bản hiện tại cũng có sự khác nhau, chúng ta cùng tham khảo một vài cú pháp đối với các loại database:
Database type | Query |
---|---|
Microsoft, MySQL | SELECT @@version |
Oracle | SELECT * FROM v$version |
PostgreSQL | SELECT version() |
Các cú pháp chi tiết hơn có thể xem thêm tại https://portswigger.net/web-security/sql-injection/cheat-sheet.
Xét câu truy vấn sau:
SELECT name, description FROM products WHERE category = 'Gifts'
Tham số category
có thể thay đổi bởi người dùng, giả sử chúng ta đã biết câu truy vấn trả về cột dữ liệu, và cả cột này đều tương thích với kiểu dữ liệu string. Chẳng hạn, hệ quản trị cơ sở dữ liệu trang web đang sử dụng là Microsoft SQL thì chúng ta có thể thay đổi giá trị category=' UNION SELECT NULL, @@version--
để truy xuất thông tin phiên bản cơ sở dữ liệu hiện hành. Cụ thể hơn, chúng ta cùng phân tích kỹ hơn cách truy xuất này trong một vài lab sau:
Phân tích lab SQL injection attack, querying the database type and version on Oracle
Miêu tả: Trang web chứa lỗ hổng SQL injection trong chức năng bộ lọc hiển thị sản phẩm. Kết quả được hiển thị trong giao diện trả về. Để giải quyết bài lab, chúng ta cần khai thác lỗ hổng nhằm hiển thị phiên bản hiện tại hệ quản trị cơ sở dữ liệu Oracle trong giao diện trang web.
Kiểm tra lỗ hổng SQL injection tại tham số category
, payload: /filter?category=' OR 1=1--
:
Kiểm tra số cột dữ liệu trả về trong câu lệnh truy vấn, payload: /filter?category=' ORDER BY 2--
không xuất hiện error và payload: /filter?category=' ORDER BY 3--
xuất hiện error:
Như vậy câu truy vấn trả về cột dữ liệu. Tiếp theo tìm kiếm cột dữ liệu tương thích với kiểu chuỗi, payload: /filter?category=' UNION SELECT 'column1', 'column2' FROM dual--
Cả cột dữ liệu đều có thể tận dụng để hiển thị thông tin khai thác. Thực hiện truy xuất phiên bản cơ sở dữ liệu hiện tại, payload: /filter?category=' UNION SELECT banner, 'column2' FROM v$version--
, bài lab hoàn thành:
Phân tích lab SQL injection attack, querying the database type and version on MySQL and Microsoft
Miêu tả: Trang web chứa lỗ hổng SQL injection trong chức năng bộ lọc hiển thị sản phẩm. Kết quả được hiển thị trong giao diện trả về. Để giải quyết bài lab, chúng ta cần khai thác lỗ hổng nhằm truy xuất phiên bản hiện tại hệ quản trị cơ sở dữ liệu trong giao diện trang web, biết rằng hệ thống sử dụng MySQL hoặc Microsoft.
Kiểm tra lỗ hổng SQL injection tại tham số category
, payload /filter?category=' OR 1=1--
và /filter?category=' OR 1=1--+
Như vậy hệ thống sử dụng hệ quản trị cơ sở dữ liệu MySQL với ký tự comment là --
(lưu ý kết thúc bằng khoảng trắng).
Kiểm tra số cột dữ liệu trả về trong câu truy vấn, payload: /filter?category=' UNION SELECT NULL, NULL--+
Như vậy câu lệnh truy vấn trả về cột dữ liệu. Tiếp theo tìm kiếm cột dữ liệu tương thích với kiểu chuỗi, payload: /filter?category=' UNION SELECT 'column1', 'column2'--+
Cả hai cột dữ liệu đều có thể tận dụng để hiển thị thông tin khai thác. Cuối cùng, truy xuất thông tin phiên bản hiện tại của hệ quản trị cơ sở dữ liệu MySQL, payload: /filter?category=' UNION SELECT @@version, NULL--+
, bài lab hoàn thành:
©️ Tác giả: Lê Ngọc Hoa từ Viblo
All rights reserved