SQL Injection là gì?

SQL Injection còn được gọi là SQLI, là một vectơ tấn công phổ biến sử dụng mã SQL độc hại tấn công cơ sở dữ liệu để truy cập thông tin đã được ẩn. Thông tin này có thể bao gồm số lượng mặt hàng, dữ liệu nhạy cảm, danh sách khách hàng hoặc chi tiết riêng tư.

Tác động SQL có thể rất nghiêm trọng, có thể dẫn đến việc ăn cắp danh sách khách hàng, xóa toàn bộ thông tin và trong một số trường hợp, kẻ tấn công giành quyền quản trị đối với cơ sở dữ liệu, tất cả đều gây bất lợi cho doanh nghiệp.

Khi tính đến mức độ nguy hiểm của SQLI, điều quan trọng là phải xem xét việc mất thông tin nhạy cảm như thông tin cá nhân như số điện thoại, địa chỉ và chi tiết thẻ tín dụng.

Truy vấn SQL là gì?

SQL là ngôn ngữ được tiêu chuẩn hóa được sử dụng để truy cập và thao tác cơ sở dữ liệu để xây dựng chế độ xem dữ liệu có thể tùy chỉnh cho mỗi người dùng. Các truy vấn SQL được sử dụng để thực thi các lệnh, như truy xuất dữ liệu, cập nhật và xóa bản ghi. Các phần tử SQL khác nhau thực hiện các tác vụ khác nhau, ví dụ: các truy vấn sử dụng câu lệnh SELECT để truy xuất dữ liệu, dựa trên các tham số do người dùng cung cấp.

Một truy vấn cơ sở dữ liệu SQL điển hình của eStore có thể trông như sau:

SELECT ItemName, ItemDescription
FROM Item
WHERE ItemNumber = ItemNumber

Từ đó, ứng dụng web xây dựng một truy vấn chuỗi được gửi đến cơ sở dữ liệu dưới dạng một câu lệnh SQL:

sql_query= "
SELECT ItemName, ItemDescription
FROM Item
WHERE ItemNumber = " & Request.QueryString("ItemID")

Một đầu vào do người dùng cung cấp http://www.estore.com/items/items.asp?itemid=999 sau đó có thể tạo truy vấn SQL sau:

SELECT ItemName, ItemDescription
FROM Item
WHERE ItemNumber = 999

Như bạn có thể thu thập từ cú pháp, truy vấn này cung cấp tên và mô tả cho số mục 999.

Ví dụ về SQL Injection

Hacker tấn công SQLI bằng thao tác một truy vấn SQL tiêu chuẩn để khai thác các lỗ hổng ở đầu vào không được xác thực trong cơ sở dữ liệu. Có nhiều cách mà vectơ tấn công này có thể được thực hiện, một số trong đó sẽ được hiển thị ở đây để cung cấp cho bạn hình dung chung về cách SQLI hoạt động.

Ví dụ: đầu vào được đề cập ở trên, lấy thông tin cho một sản phẩm cụ thể, có thể được thay đổi để đọc http://www.estore.com/items/items.asp?itemid=999 hoặc 1 = 1 .

Kết quả là, truy vấn SQL tương ứng sẽ như thế này:

SELECT ItemName, ItemDescription
FROM Items
WHERE ItemNumber = 999 OR 1=1

Và vì câu lệnh 1 = 1 luôn luôn đúng, truy vấn trả về tất cả các tên và mô tả sản phẩm trong cơ sở dữ liệu, ngay cả những câu thay thế có thể không đủ điều kiện để truy cập.

Kẻ tấn công cũng có thể lợi dụng các ký tự được lọc không chính xác để thay đổi các lệnh SQL, bao gồm sử dụng dấu chấm phẩy để phân tách hai trường.

Ví dụ: đầu vào này http://www.estore.com/items/iteams.asp?itemid=999; DROP TABLE Người dùng sẽ tạo truy vấn SQL sau:

SELECT ItemName, ItemDescription
FROM Items
WHERE ItemNumber = 999; DROP TABLE USERS

Do đó, toàn bộ cơ sở dữ liệu người dùng có thể bị xóa.

Một cách khác để truy vấn SQL có thể được xử lý bằng câu lệnh UNION SELECT. Điều này kết hợp hai truy vấn SELECT không liên quan để lấy dữ liệu từ các bảng cơ sở dữ liệu khác nhau.

Ví dụ: đầu vào http://www.estore.com/items/items.asp?itemid=999 UNION SELECT tên người dùng, mật khẩu TỪ USERS tạo ra truy vấn SQL sau:

SELECT ItemName, ItemDescription
FROM Items
WHERE ItemID = '999' UNION SELECT Username, Password FROM Users;

Sử dụng câu lệnh UNION SELECT, truy vấn này kết hợp yêu cầu tên và mô tả của mục 999 với một câu hỏi khác để lấy tên và mật khẩu cho mọi người dùng trong cơ sở dữ liệu.

Cách phòng tránh và giảm thiểu SQLI

Có một số cách hiệu quả để ngăn chặn các cuộc tấn công SQLI, cũng như bảo vệ chống lại chúng nếu bị tấn công.

  • Chuẩn bị báo cáo với các truy vấn tham số. Sử dụng các câu lệnh được chuẩn bị với các truy vấn được tham số hóa là một điều kiện mạnh để giảm thiểu các cuộc tấn công. Thay vì viết các truy vấn động, không thể phân biệt giữa mã ứng dụng và dữ liệu, các câu lệnh được chuẩn bị buộc các nhà phát triển sử dụng truy vấn SQL tĩnh và sau đó chuyển vào đầu ra bên ngoài làm tham số cho truy vấn. Cách tiếp cận này đảm bảo trình thông dịch SQL luôn phân biệt giữa mã và dữ liệu.
  • Thủ tục lưu trữ.  Các thủ tục được lưu trữ là các câu lệnh SQL được xác định và lưu trữ trong chính cơ sở dữ liệu và sau đó được gọi từ ứng dụng. Các nhà phát triển thường chỉ được yêu cầu xây dựng các câu lệnh SQL với các tham số được tự động tham số hóa. Tuy nhiên, nhà phát triển có thể tạo các truy vấn SQL động bên trong các thủ tục được lưu trữ. Thực hiện các thủ tục được lưu trữ một cách an toàn bằng cách tránh tạo SQL động bên trong.
  • Xác nhận đầu vào. Đây là một cách phổ biến để hạn chế các cuộc tấn công SQL Injection, có hai biến thể của xác thực đầu vào: xác thực danh sách đen và xác thực danh sách trắng. Xác nhận danh sách đen kiểm tra đầu vào bên ngoài đối với một tập hợp các đầu vào độc hại đã biết. Một ứng dụng biên dịch một danh sách tất cả các đầu vào độc hại, sau đó xác minh đầu vào bên ngoài so với danh sách đã biên dịch. Tuy nhiên, hacker dễ dàng tạo ra rất nhiều biến thể đầu vào độc hại không nằm trong danh sách đen đã biết. Xác nhận danh sách trắng kiểm tra một đầu vào bên ngoài đối với một tập hợp các đầu vào đã biết, đã được phê duyệt. Với xác thực đầu vào danh sách trắng, ứng dụng biết chính xác những gì mong muốn và từ chối các giá trị đầu vào khác không vượt qua được thử nghiệm đối với đầu vào đã được phê duyệt.
  • Nguyên tắc đặc quyền tối thiểu. Đây là một kiểm soát bảo mật tiêu chuẩn giúp giảm thiểu thiệt hại tiềm tàng của một cuộc tấn công thành công. Tài khoản ứng dụng không nên gán quyền truy cập DBA hoặc quản trị viên vào máy chủ cơ sở dữ liệu. Ngoài ra, tùy thuộc vào yêu cầu truy cập, chúng nên được giới hạn ở quyền truy cập ít đặc quyền nhất. Ví dụ: các tài khoản chỉ yêu cầu quyền truy cập đọc chỉ được cấp quyền truy cập đọc vào bảng mà họ cần truy cập. Điều này đảm bảo rằng nếu một ứng dụng bị xâm phạm, kẻ tấn công sẽ không có quyền đối với cơ sở dữ liệu thông qua ứng dụng bị xâm nhập.
//cmay.vn/wp-content/uploads/2018/03/footer_logo.png