Rate this post

Các lỗ hổng SQL Injection xảy ra bất cứ khi nào đầu vào được sử dụng trong việc xây dựng truy vấn SQL mà không bị ràng buộc hoặc khử trùng đầy đủ. Việc sử dụng SQL động (việc xây dựng các truy vấn SQL bằng cách nối các chuỗi) sẽ mở ra cánh cửa cho những lỗ hổng này. SQL injection cho phép kẻ tấn công truy cập vào máy chủ SQL. Nó cho phép thực thi mã SQL dưới các đặc quyền của người dùng được sử dụng để kết nối với cơ sở dữ liệu.

Các bài viết liên quan:

Máy chủ MySQL có một số đặc điểm nên một số khai thác cần được tùy chỉnh đặc biệt cho ứng dụng này. Đó là chủ đề của phần này.

Làm thế nào để kiểm tra

Khi lỗ hổng SQL injection được tìm thấy trong một ứng dụng được cơ sở dữ liệu MySQL hỗ trợ, có một số cuộc tấn công có thể được thực hiện tùy thuộc vào phiên bản MySQL và đặc quyền của người dùng trên DBMS.

MySQL đi kèm với ít nhất bốn phiên bản được sử dụng trong sản xuất trên toàn thế giới, 3.23.x, 4.0.x, 4.1.x và 5.0.x. Mọi phiên bản đều có một tập hợp các tính năng tỷ lệ với số phiên bản.

  1. Từ phiên bản 4.0: UNION
  2. Từ phiên bản 4.1: Truy vấn con
  3. Từ phiên bản 5.0: Các thủ tục được lưu trữ, các hàm được lưu trữ và chế độ xem có tên INFORMATION_SCHEMA
  4. Từ phiên bản 5.0.2: Trigger

Cần lưu ý rằng đối với các phiên bản MySQL trước 4.0.x, chỉ có thể sử dụng các cuộc tấn công Boolean hoặc Blind Injection dựa trên thời gian, vì chức năng truy vấn con hoặc các câu lệnh UNION không được triển khai.

Từ bây giờ, chúng tôi sẽ giả định rằng có một lỗ hổng SQL injection cổ điển, có thể được kích hoạt bởi một yêu cầu tương tự như một yêu cầu được mô tả trong Phần Kiểm tra SQL Injection.

http://www.example.com/page.php?id=2

Vấn đề trích dẫn đơn(Single Quotes)

Trước khi tận dụng các tính năng của MySQL, cần phải xem xét cách các chuỗi có thể được biểu diễn trong một câu lệnh, vì các ứng dụng web thường thoát khỏi các dấu nháy đơn.

Cách thoát trích dẫn MySQL như sau:

'A string with \'quotes\''

Đó là, MySQL diễn giải các dấu nháy đơn thoát ra ngoài \ ‘là các ký tự chứ không phải là các siêu ký tự.

Vì vậy, nếu ứng dụng, để hoạt động bình thường, cần sử dụng chuỗi không đổi, hai trường hợp cần được phân biệt:

  1. Ứng dụng web thoát khỏi dấu ngoặc kép ‘=> \’
  2. Ứng dụng web không thoát khỏi dấu ngoặc kép ‘=>’

Trong MySQL, có một cách tiêu chuẩn để bỏ qua sự cần thiết của các dấu nháy đơn, có một chuỗi hằng số được khai báo mà không cần các dấu nháy đơn.

Giả sử chúng ta muốn biết giá trị của một trường có tên là mật khẩu trong một bản ghi, với điều kiện như sau:

  1. password like 'A%'
  2. Các giá trị ASCII trong một hệ lục phân được ghép nối: password LIKE 0x4125
  3. Hàm char (): password LIKE CHAR(65,37)

Nhiều truy vấn hỗn hợp

Các trình kết nối thư viện MySQL không hỗ trợ nhiều truy vấn được phân tách bằng; vì vậy không có cách nào để đưa nhiều lệnh SQL không đồng nhất vào bên trong một lỗ hổng SQL injection như trong Microsoft SQL Server.

Ví dụ, lần tiêm sau sẽ dẫn đến lỗi:

1 ; update tablename set code='javascript code' where 1 --

Information Gathering

Fingerprinting MySQL

Tất nhiên, điều đầu tiên cần biết là liệu có MySQL DBMS làm cơ sở dữ liệu phía sau hay không. Máy chủ MySQL có một tính năng được sử dụng để cho phép các DBMS khác bỏ qua một mệnh đề trong phương ngữ MySQL. Khi khối bình luận ‘/ ** /’ chứa dấu chấm than ‘/ *! sql here * / ‘nó được MySQL thông dịch và được các DBMS khác coi như một khối nhận xét bình thường như được giải thích trong hướng dẫn sử dụng MySQL.

Ví dụ:

1 /*! and 1=0 */

Nếu có MySQL, mệnh đề bên trong khối nhận xét sẽ được diễn giải.

Version

Có ba cách để có được thông tin này:

  • Bằng cách sử dụng phiên bản @@ biến toàn cục
  • Bằng cách sử dụng hàm VERSION ()
  • Bằng cách sử dụng dấu vân tay nhận xét với số phiên bản / *! 40110 và 1 = 0 * /

nghĩa là

if(version >= 4.1.10)
   add 'and 1=0' to the query.

Chúng tương đương vì kết quả là như nhau.

Trong injection band:

1 AND 1=0 UNION SELECT @@version /*

Inferential injection:

1 AND @@version like '4.0%'

Câu trả lời sẽ chứa một cái gì đó cho các dòng:

5.0.22-log

Login User

Có hai loại người dùng mà MySQL Server dựa vào.

  • USER (): người dùng đã kết nối với MySQL Server.
  • CURRENT_USER (): người dùng nội bộ đang thực hiện truy vấn.

Có một số khác biệt giữa 1 và 2. Điểm chính là người dùng ẩn danh có thể kết nối (nếu được phép) với bất kỳ tên nào, nhưng người dùng nội bộ MySQL là tên trống (‘’). Một sự khác biệt khác là một thủ tục được lưu trữ hoặc một hàm được lưu trữ được thực thi với tư cách là người dùng tạo, nếu không được khai báo ở nơi khác. Điều này có thể được biết bằng cách sử dụng CURRENT_USER.

Trong band injection:

1 AND 1=0 UNION SELECT USER()

Inferential injection:

1 AND USER() like 'root%'

Câu trả lời sẽ chứa một cái gì đó cho các dòng:

user@hostname

Database Name in Use

Có hàm gốc DATABASE ()

Trong band injection:

1 AND 1=0 UNION SELECT DATABASE()

Inferential injection:

1 AND DATABASE() like 'db%'

Kết quả mong đợi, một chuỗi như thế này:

dbname

INFORMATION_SCHEMA

Từ MySQL 5.0, một dạng xem có tên INFORMATION_SCHEMA đã được tạo. Nó cho phép chúng tôi nhận được tất cả thông tin về cơ sở dữ liệu, bảng và cột, cũng như các thủ tục và sự thú vị

Tất cả thông tin này có thể được trích xuất bằng cách sử dụng các kỹ thuật đã biết như được mô tả trong phần SQL Injection.

Attack Vectors

Viết trong file

Nếu người dùng được kết nối có đặc quyền FILE và các dấu ngoặc kép không được thoát, mệnh đề thành tệp có thể được sử dụng để xuất kết quả truy vấn trong một tệp.

Select * from table into outfile '/tmp/file'

Lưu ý: không có cách nào để bỏ qua các dấu ngoặc kép xung quanh tên tệp. Vì vậy, nếu có một số sanitization trên các dấu ngoặc kép như Escape \ ‘thì sẽ không có cách nào sử dụng mệnh đề into outfile.

Loại tấn công này có thể được sử dụng như một kỹ thuật ngoài băng tần để lấy thông tin về kết quả của một truy vấn hoặc để ghi một tệp có thể được thực thi bên trong thư mục máy chủ web.

Ví dụ:

1 limit 1 into outfile '/var/www/root/test.jsp' FIELDS ENCLOSED BY '//'  LINES TERMINATED BY '\n<%jsp code here%>';

Kết quả được lưu trữ trong một tệp có đặc quyền rw-rw-rw do người dùng và nhóm MySQL sở hữu.

Trong đó /var/www/root/test.jsp sẽ chứa:

//field values// <%jsp code here%>

Đọc từ một file

load_file là một hàm gốc có thể đọc một tệp khi được quyền của hệ thống tệp cho phép. Nếu một người dùng được kết nối có đặc quyền FILE, thì nó có thể được sử dụng để lấy nội dung của tệp. Có thể bỏ qua quá trình khử trùng thoát dấu ngoặc kép đơn bằng cách sử dụng các kỹ thuật được mô tả trước đó.

load_file('filename')

Toàn bộ tệp sẽ có sẵn để xuất bằng cách sử dụng các kỹ thuật tiêu chuẩn.

Tấn công SQL Injection tiêu chuẩn

Trong SQL injection tiêu chuẩn, bạn có thể hiển thị kết quả trực tiếp trong một trang dưới dạng đầu ra bình thường hoặc dưới dạng lỗi MySQL. Bằng cách sử dụng các cuộc tấn công SQL Injection đã được đề cập và các tính năng MySQL đã được mô tả, việc tiêm SQL trực tiếp có thể dễ dàng thực hiện ở mức độ sâu phụ thuộc chủ yếu vào phiên bản MySQL mà pentester đang phải đối mặt.

Một cuộc tấn công tốt là biết kết quả bằng cách buộc một chức năng / thủ tục hoặc chính máy chủ đưa ra lỗi. Có thể tìm thấy danh sách các lỗi do MySQL gây ra và đặc biệt là các hàm gốc trên MySQL Manual.

Out of Band SQL Injection

Việc đưa ra ngoài băng tần có thể được thực hiện bằng cách sử dụng mệnh đề into outfile.

Blind SQL Injection

Đối với việc tiêm SQL mù, có một tập hợp các chức năng hữu ích được cung cấp bởi máy chủ MySQL.

  • String Length:
    • LENGTH(str)
  • Trích xuất một chuỗi con từ một chuỗi đã cho:
    • SUBSTRING(string, offset, #chars_returned)
  • Time based Blind Injection:
    • BENCHMARK and SLEEP BENCHMARK(#ofcycles,action_to_be_performed)BENCHMARK và SLEEP BENCHMARK (# ofcycles, action_to_be_performed) Chức năng điểm chuẩn có thể được sử dụng để thực hiện các cuộc tấn công định thời khi việc tiêm mù bởi các giá trị boolean không mang lại bất kỳ kết quả nào.

Để có danh sách đầy đủ, hãy tham khảo hướng dẫn sử dụng MySQL

Công cụ

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now