Rate this post

Blind SQL Injection(Structured Query Language) là một phương pháp tấn công lỗ hổng SQL Injection tiến hành khai thác cơ sở dữ liệu thông qua các câu hỏi đúng hay sai và xác định đáp án dựa trên sự phản hồi ứng dụng trả về. Cuộc tấn công nhằm khai thác các website có cấu hình thông báo lỗi chung không rõ ràng, nhưng những website vẫn bị lỗ hổng SQL injection.

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

Khi kẻ tấn công khai thác SQL injection, đôi khi ứng dụng web hiển thị thông báo lỗi từ cơ sở dữ liệu phàn nàn rằng cú pháp của SQL Query không chính xác. Blind SQL injection gần giống với SQL Injection bình thường, điểm khác biệt duy nhất là cách dữ liệu được truy xuất từ ​​cơ sở dữ liệu. Khi cơ sở dữ liệu không xuất dữ liệu ra trang web, kẻ tấn công buộc phải đánh cắp dữ liệu bằng cách hỏi cơ sở dữ liệu một loạt câu hỏi đúng hoặc sai. Điều này làm cho việc khai thác SQL Injection khó khăn hơn.

Giới thiệu và định nghĩa về Blind SQL Injection.

Blind SQL Injection là một dạng tấn công bảo mật nhằm khai thác lỗ hổng SQL Injection trong các ứng dụng web. Trong SQL Injection thông thường, kẻ tấn công có thể trực tiếp thấy được các thông báo lỗi hoặc kết quả của các truy vấn SQL, từ đó thu thập thông tin hay tấn công cơ sở dữ liệu. Tuy nhiên, trong Blind SQL Injection, các thông báo lỗi hoặc kết quả truy vấn SQL không được hiển thị trực tiếp cho kẻ tấn công, tạo ra một dạng tấn công khó nhận biết và khó khắc phục.

Blind SQL Injection khai thác lỗ hổng SQL Injection bằng cách chèn các truy vấn SQL độc hại hoặc điều kiện kiểm tra vào các tham số đầu vào của ứng dụng web. Khi ứng dụng web không kiểm tra hoặc xử lý đầu vào đúng cách, các truy vấn SQL độc hại sẽ được thực thi trên cơ sở dữ liệu.

Tuy nhiên, thay vì hiển thị kết quả trực tiếp, ứng dụng web sẽ không trả về thông tin hay thông báo lỗi. Thay vào đó, kẻ tấn công phải sử dụng các kỹ thuật “kiểm tra điều kiện” để rút ra thông tin từ cơ sở dữ liệu, thông qua việc quan sát các biểu hiện khác nhau của ứng dụng web sau mỗi lần tấn công. Các kỹ thuật này bao gồm sử dụng các câu truy vấn logic, phân tích thời gian thực thi, hoặc truy vấn các giá trị boolean để xác định đúng/sai.

Mục tiêu chính của Blind SQL Injection là thu thập thông tin nhạy cảm từ cơ sở dữ liệu, như tên người dùng, mật khẩu, hoặc dữ liệu khác, hoặc thực hiện các cuộc tấn công khác như tạo ra người dùng quyền cao, thay đổi dữ liệu, hoặc tấn công hệ thống.

Để phòng chống Blind SQL Injection, các nhà phát triển cần thực hiện kiểm tra và xác thực đầu vào, sử dụng câu truy vấn tham số hóa hoặc các công nghệ ORM (Object-Relational Mapping), và áp dụng các biện pháp bảo mật khác để đảm bảo rằng truy vấn SQL được xử lý đúng cách và không thể bị khai thác.

Nguyên nhân và cách hoạt động

Nguyên nhân của Blind SQL Injection xuất phát từ việc ứng dụng web không kiểm tra và xử lý đúng cách các đầu vào từ người dùng trước khi sử dụng chúng trong các truy vấn SQL. Điều này cho phép kẻ tấn công chèn các truy vấn SQL độc hại hoặc điều kiện kiểm tra vào các tham số đầu vào, và khi không có kiểm tra đúng đắn, các truy vấn này sẽ được thực thi trên cơ sở dữ liệu.

Cách hoạt động của Blind SQL Injection thường dựa trên việc kiểm tra điều kiện, thời gian thực thi hoặc các giá trị boolean trong các truy vấn SQL. Dưới đây là một số phương pháp thường được sử dụng trong Blind SQL Injection:

  1. Kiểm tra điều kiện: Kẻ tấn công sẽ chèn một câu truy vấn SQL với một điều kiện kiểm tra như “IF” hoặc “CASE” vào đầu vào và quan sát phản hồi của ứng dụng web. Dựa vào phản hồi, kẻ tấn công có thể suy ra các giá trị đúng hoặc sai cho điều kiện đó.
  2. Phân tích thời gian thực thi: Kẻ tấn công sử dụng các truy vấn SQL có chứa lệnh ngủ (sử dụng hàm “SLEEP” trong SQL) để đo thời gian phản hồi của ứng dụng web. Khi thời gian phản hồi kéo dài, điều đó cho thấy rằng truy vấn SQL bên trong có đúng và ngược lại.
  3. Truy vấn boolean: Kẻ tấn công sử dụng các truy vấn SQL có chứa các biểu thức boolean như “AND” hoặc “OR” để xác định đúng hoặc sai cho các điều kiện. Dựa vào phản hồi của ứng dụng web, kẻ tấn công có thể suy ra giá trị đúng hoặc sai của điều kiện đó.

Khi kẻ tấn công đã xác định được các giá trị đúng hoặc sai thông qua Blind SQL Injection, họ có thể tiếp tục khai thác và thu thập thông tin nhạy cảm từ cơ sở dữ liệu hoặc thực hiện các cuộc tấn công khác.

Để phòng chống Blind SQL Injection, cần thực hiện các biện pháp bảo mật sau:

  • Kiểm tra và xác thực đầu vào: Đảm bảo rằng tất cả đầu vào từ người dùng được kiểm tra, lọc và xử lý đúng cách trước khi sử dụng chúng trong các truy vấn SQL.
  • Sử dụng câu truy vấn tham số hóa: Sử dụng câu truy vấn tham số hóa hoặc các công nghệ ORM để truyền thông tin từ người dùng vào truy vấn SQL một cách an toàn, hạn chế khả năng tấn công Blind SQL Injection.
  • Áp dụng các biện pháp bảo mật khác: Bao gồm việc cập nhật và bảo vệ ứng dụng web, giới hạn quyền truy cập cơ sở dữ liệu, theo dõi và ghi lại các hoạt động đáng ngờ, và kiểm tra bảo mật định kỳ để phát hiện và khắc phục các lỗ hổng bảo mật.

Xem thêm Truy vấn Plan Cache Commands trong MongoDB

Các biểu hiện của Blind SQL Injection

Có một số biểu hiện mà bạn có thể nhận ra để phát hiện sự tồn tại của Blind SQL Injection trong ứng dụng web. Dưới đây là một số biểu hiện phổ biến:

  1. Thời gian phản hồi chậm: Khi kẻ tấn công thực hiện các truy vấn SQL trong Blind SQL Injection, thời gian phản hồi từ ứng dụng web có thể tăng lên đáng kể. Nếu bạn nhận thấy rằng các trang web hoặc yêu cầu của bạn mất quá nhiều thời gian để tải, có thể là một dấu hiệu của việc tấn công Blind SQL Injection đang xảy ra.
  2. Phản hồi khác biệt: Trong Blind SQL Injection, kẻ tấn công thường sẽ sử dụng các truy vấn SQL để kiểm tra các điều kiện hoặc thu thập thông tin từ cơ sở dữ liệu. Khi kết quả của các truy vấn này được trả về, các phản hồi có thể khác biệt so với các yêu cầu thông thường. Điều này có thể thể hiện dưới dạng các tin nhắn lỗi không thường xuyên hoặc các thay đổi không mong muốn trong nội dung trang.
  3. Lỗi không xác định hoặc bất thường: Khi các truy vấn SQL gặp lỗi trong quá trình Blind SQL Injection, các thông báo lỗi có thể không rõ ràng hoặc không chính xác. Bạn có thể thấy các thông báo lỗi không xác định hoặc không liên quan đến hoạt động của bạn trên trang web.
  4. Chức năng hoặc thông tin không hoạt động: Khi kẻ tấn công khai thác Blind SQL Injection thành công và thu thập thông tin từ cơ sở dữ liệu, các chức năng hoặc thông tin trên trang web có thể không hoạt động đúng cách hoặc hiển thị không chính xác. Ví dụ, tên người dùng, mật khẩu hoặc dữ liệu khác có thể không hiển thị đúng hoặc bị thay đổi.
  5. Tính năng phía người dùng bất thường: Khi kẻ tấn công sử dụng Blind SQL Injection để thu thập thông tin về người dùng, bạn có thể thấy những hoạt động bất thường xuất hiện trên tài khoản người dùng, chẳng hạn như đăng nhập không thành công, thông tin cá nhân thay đổi, hoặc hoạt động không được thực hiện bởi người dùng thực tế.

Các biểu hiện trên chỉ là những dấu hiệu khả nghi của Blind SQL Injection. Để xác định chính xác, cần thực hiện kiểm tra bảo mật và phân tích kỹ thuật để phát hiện và xác nhận sự tồn tại của tấn công này.

Phòng chống Blind SQL Injection

Để phòng chống Blind SQL Injection và bảo vệ ứng dụng web của bạn khỏi lỗ hổng này, có một số biện pháp và best practice sau đây:

  1. Kiểm tra và xử lý đầu vào đúng cách: Đầu tiên, hãy đảm bảo rằng tất cả các đầu vào từ người dùng được kiểm tra, lọc và xử lý đúng cách trước khi sử dụng chúng trong các truy vấn SQL. Sử dụng các phương pháp như kiểm tra đầu vào, loại bỏ hoặc mã hóa các ký tự đặc biệt, và xác thực dữ liệu đầu vào để loại bỏ các câu lệnh SQL độc hại.
  2. Sử dụng câu truy vấn tham số hóa hoặc ORM: Sử dụng câu truy vấn tham số hóa để truyền thông tin từ người dùng vào các truy vấn SQL một cách an toàn. Thay vì tạo chuỗi truy vấn SQL bằng cách ghép nối các giá trị đầu vào, hãy sử dụng các tham số trong câu truy vấn để tránh các lỗ hổng Blind SQL Injection. Ngoài ra, công nghệ ORM (Object-Relational Mapping) cũng cung cấp cách tiếp cận an toàn hơn cho việc tương tác với cơ sở dữ liệu.
  3. Giới hạn quyền truy cập cơ sở dữ liệu: Đảm bảo rằng tài khoản cơ sở dữ liệu mà ứng dụng web sử dụng chỉ có các quyền cần thiết để thực hiện các thao tác cần thiết. Hạn chế quyền truy cập vào các bảng và cột không cần thiết, và không sử dụng tài khoản quản trị viên để kết nối cơ sở dữ liệu từ ứng dụng web.
  4. Cập nhật và bảo vệ ứng dụng web: Đảm bảo rằng ứng dụng web của bạn luôn được cập nhật với phiên bản mới nhất và bảo vệ bằng các bản vá lỗi, vá bảo mật và cập nhật hệ điều hành, framework và các thành phần phụ thuộc khác. Điều này giúp giảm nguy cơ khai thác các lỗ hổng đã biết và được sửa chữa.
  5. Theo dõi và ghi lại hoạt động: Thực hiện việc theo dõi và ghi lại các hoạt động trong ứng dụng web, bao gồm các yêu cầu và truy vấn SQL. Điều này giúp phát hiện các hành vi bất thường hoặc các yêu cầu độc hại, và cung cấp dữ liệu cho việc điều tra và khắc phục sau khi xảy ra sự cố.
  6. Kiểm tra bảo mật định kỳ: Thực hiện các kiểm tra bảo mật định kỳ trên ứng dụng web để phát hiện và khắc phục các lỗ hổng bảo mật, bao gồm kiểm tra phân tích mã nguồn, kiểm tra tự động, và kiểm tra thủ công. Các công cụ kiểm tra bảo mật như SAST (Static Application Security Testing) và DAST (Dynamic Application Security Testing) có thể được sử dụng để giúp phát hiện các lỗ hổng Blind SQL Injection và các vấn đề bảo mật khác.

Bằng việc áp dụng các biện pháp phòng chống trên, bạn có thể giảm nguy cơ Blind SQL Injection và nâng cao bảo mật cho ứng dụng web của mình. Tuy nhiên, hãy nhớ rằng bảo mật là một quá trình liên tục và đa lớp, vì vậy hãy cập nhật và kiểm tra bảo mật thường xuyên để đối phó với các mối đe dọa mới.

Xem thêm Tìm hiểu về CSV Injection

Các mối đe dọa của Blind SQL injection

Tương tự như đối với SQL Injection

Các ví dụ

Kẻ tấn công có thể xác minh xem một yêu cầu đã gửi trả về đúng hay sai theo một số cách:

Dựa trên nội dung

Sử dụng một trang đơn giản, hiển thị một bài báo với ID đã cho làm tham số, kẻ tấn công có thể thực hiện một vài thử nghiệm đơn giản để xác định xem trang có dễ bị tấn công SQL Injection hay không.

URL mẫu:

http://newspaper.com/items.php?id=2

gửi truy vấn sau đến cơ sở dữ liệu:

SELECT title, description, body FROM items WHERE ID = 2

Sau đó, kẻ tấn công có thể cố gắng đưa vào một truy vấn trả về ‘false’:

http://newspaper.com/items.php?id=2 and 1=2

Bây giờ truy vấn SQL sẽ giống như sau:

SELECT title, description, body FROM items WHERE ID = 2 and 1=2

Nếu ứng dụng web dễ bị SQL Injection, thì có thể nó sẽ không trả về bất cứ thứ gì. Để đảm bảo, kẻ tấn công sẽ đưa ra một truy vấn sẽ trả về “true”:

http://newspaper.com/items.php?id=2 and 1=1

Nếu nội dung của trang trả về ‘true’ khác với nội dung của trang trả về ‘false’, thì kẻ tấn công có thể phân biệt khi nào truy vấn được thực thi trả về true hay false.

Khi điều này đã được xác minh, các giới hạn duy nhất là các đặc quyền do quản trị viên cơ sở dữ liệu thiết lập, cú pháp SQL khác và trí tưởng tượng của kẻ tấn công.

Xem thêm Kiểm tra bảo mật website – Injection pentest

Dựa trên thời gian

Kiểu tiêm SQL mù này dựa vào việc cơ sở dữ liệu tạm dừng trong một khoảng thời gian xác định, sau đó trả về kết quả, cho biết thực thi truy vấn SQL thành công. Sử dụng phương pháp này, kẻ tấn công liệt kê từng chữ cái của phần dữ liệu mong muốn bằng cách sử dụng logic sau:

Nếu chữ cái đầu tiên của tên cơ sở dữ liệu đầu tiên là “A”, hãy đợi trong 10 giây.

Nếu chữ cái đầu tiên của tên cơ sở dữ liệu đầu tiên là “B”, hãy đợi trong 10 giây. Vân vân.

Microsoft SQL Server

http://www.site.com/vulnerable.php?id=1' waitfor delay '00:00:10'--

MySQL

SELECT IF(expression, true, false)

Sử dụng một số thao tác mất thời gian, ví dụ: BENCHMARK (), sẽ trì hoãn phản hồi của máy chủ nếu biểu thức là True.

BENCHMARK(5000000,ENCODE('MSG','by 5 seconds'))

sẽ thực hiện chức năng ENCODE 5000000 lần.

Tùy thuộc vào hiệu suất và tải của máy chủ cơ sở dữ liệu, sẽ chỉ mất một chút thời gian để hoàn thành thao tác này. Điều quan trọng là, theo quan điểm của kẻ tấn công, phải chỉ định số lần lặp lại hàm BENCHMARK () đủ cao để ảnh hưởng đến thời gian phản hồi cơ sở dữ liệu theo cách đáng chú ý.

Kết hợp ví dụ của cả hai truy vấn:

1 UNION SELECT IF(SUBSTRING(user_password,1,1) = CHAR(50),BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),null) FROM users WHERE user_id = 1;

Nếu phản hồi cơ sở dữ liệu mất nhiều thời gian, chúng tôi có thể mong đợi rằng ký tự mật khẩu người dùng đầu tiên với user_id = 1 là ký tự ‘2’.

(CHAR(50) == '2')

Sử dụng phương pháp này cho các ký tự còn lại, có thể liệt kê toàn bộ mật khẩu được lưu trữ trong cơ sở dữ liệu. Phương pháp này hoạt động ngay cả khi kẻ tấn công đưa vào các truy vấn SQL và nội dung của trang dễ bị tấn công không thay đổi.

Rõ ràng, trong ví dụ này, tên của các bảng và số cột đã được chỉ định. Tuy nhiên, có thể đoán chúng hoặc kiểm tra bằng phương pháp thử và sai.

Cơ sở dữ liệu khác với MySQL cũng có các chức năng dựa trên thời gian cho phép chúng được sử dụng cho các cuộc tấn công dựa trên thời gian:

  • MS SQL: 'WAIT FOR DELAY '0:0:10''
  • PostgreSQL: pg_sleep()

Việc thực hiện các cuộc tấn công Blind SQL Injection theo cách thủ công là rất tốn thời gian, nhưng có rất nhiều công cụ tự động hóa quá trình này. Một trong số đó là SQLMap được phát triển một phần trong chương trình tài trợ OWASP. Mặt khác, các công cụ loại này rất nhạy cảm với những sai lệch dù là nhỏ so với quy luật. Điêu nay bao gôm:

  • quét các cụm trang web khác, nơi đồng hồ không được đồng bộ hóa một cách lý tưởng,
  • Các dịch vụ WWW trong đó phương pháp thu nhận đối số đã được thay đổi, ví dụ: từ /index.php?ID=10 đến / ID, 10

Lấy dấu vân tay cơ sở dữ liệu từ xa

Nếu kẻ tấn công có thể xác định khi nào truy vấn của họ trả về Đúng hay Sai, thì họ có thể lấy dấu vân tay của RDBMS. Điều này sẽ làm cho toàn bộ cuộc tấn công dễ dàng hơn nhiều. Nếu phương pháp dựa trên thời gian được sử dụng, điều này sẽ giúp xác định loại dữ liệu cơ sở đang được sử dụng. Một phương pháp phổ biến khác để thực hiện việc này là gọi các hàm sẽ trả về ngày hiện tại. MySQL, MSSQL và Oracle có các hàm khác nhau cho điều đó, tương ứng now (), getdate () và sysdate ().
Xem thêm Tấn công Blind XPath Injection

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