Các kiểu tấn công ứng dụng web phổ biến

Một phần của tài liệu Xây dựng công cụ hỗ trợ đánh giá an toàn website luận văn thạc sĩ công nghệ thông tin (Trang 33 - 38)

3.4.1 SQL Injection

SQL Injection [6] là một trong những hình thức tấn công phổ biến và nguy hiểm nhất trong số các kiểu tấn công loại “injection”. SQL Injection được biết tới như là một trong những lỗ hổng có mức tàn phá ghê gớm nhất tới hoạt động kinh doanh của các doanh nghiệp, tổ chức, làm thất thoát các thông tin nhạy cảm được lưu trong cơ sở dữ liệu như tên, mật khẩu, số tài khoản ngân hàng...

a. Định nghĩa của OWASP về SQL Injection

“Một cuộc tấn công SQL Injection là hành động chèn hoặc “tiêm” một phần hoặc cả một câu truy vấn SQL thông qua dữ liệu đầu vào hoặc dữ liệu truyền từ

phía client (trình duyệt web) tới ứng dụng web. Một cuộc tấn công SQL Injection thành công có thể phục vụ mục đích đọc các thông tin nhạy cảm từ Database, hiệu chỉnh dữ liệu trong cơ sở dữ liệu (gồm có hành động thêm/xóa/sửa), thực hiện các thao tác lệnh quản lý hệ thống cơ sở dữ liệu (chẳng hạn như tắt Hệ Quản trị Cơ sở Dữ liệu), khôi phục lại nội dung của tập tin tồn tại trên hệ thống tập tin lưu trữ hoặc ghi nội dung tập tin vào Hệ Quản trị Cơ sở Dữ liệu, và trong một số trường hợp, SQL Injection có thể phục vụ thực thi lệnh trong hệ điều hành. Như vậy, SQL Injection là loại tấn công mà ở đó các câu lệnh SQL được chèn vào dữ liệu đầu vào nhằm mục đích làm ảnh hưởng tới các câu lệnh SQL đã được định nghĩa trước.

SQL Injection được công bố lần đầu tiên năm 1998 và cho tới nay, SQL Injection từng bước trở thành một cách thức tấn công cực kỳ hiệu quả và trong lịch sử phát triển của ứng dụng web, SQL Injection cũng đã để lại nhiều hậu quả vô cùng nghiêm trọng.

b. Hình thái của SQL Injection

SQL Injection cho phép kẻ tấn công giả mạo thông tin nhận dạng người dùng, xáo trộn dữ liệu hiện có, gây các vấn đề về khai thác như thay đổi giao dịch, thay đổi số dư, cho phép tiết lộ tất cả dữ liệu trên hệ thống, phá hủy dữ liệu, làm cho mất tính sẵn sàng của dữ liệu, và nghiêm trọng hơn hết là có thể biến kẻ tấn công thành người quản trị cơ sở dữ liệu.

SQL Injection rất phổ biến với các ứng dụng PHP và ASP, trong khi đó các ứng dụng J2EE và ASP.NET thì ít khả năng bị khai thác hơn.

Mức độ nghiêm trọng của các cuộc tấn công SQL Injection được giới hạn bởi kỹ năng của kẻ tấn công và sự tưởng tượng, tuy nhiên OWASP khuyến cáo hãy luôn xem SQL Injection là một mối nguy hại cao.

c. SQL Injection xảy ra khi

- Dữ liệu gọi từ một chương trình không rõ nguồn gốc.

d. Hậu quả chính của SQL Injection

- Tính bảo mật mất tính bí mật là vấn đề thường xuyên của cuộc tấn công này. - Tính xác thực kẻ tấn công có thể giả mạo một người dùng khác đã xác thực trước đó.

- Tính ủy quyền thông tin ủy quyền có thể bị thay đổi nếu như nó được lưu trong cơ sở dữ liệu.

- Tính toàn vẹn cũng như việc đọc được các thông tin nhạy cảm, SQL Injection có thể làm thay đổi nội dung, thậm chí xóa thông tin.

Trong rất nhiều hệ Quản trị Cơ sở Dữ liệu cho phép các câu lệnh được thực thi đồng thời (ngăn cách bằng dấu chấm phẩy) và điều này giúp kẻ tấn công thực thi các lệnh tùy ý chống lại cơ sở dữ liệu.

Cần chú ý là hai dấu gạch ngang (--) được xem là chú thích trong hầu hết các hệ Quản trị cơ sở Dữ liệu và không được thực thi, nhưng ở đây dấu nháy đơn để hoàn thiện tạo câu truy vấn. Tương tự, kẻ tấn công có thể thêm vào một hay vài câu truy vấn hợp lệ sau đó và tất cả đều sẽ được thực thi.

Một cách truyền thống để ngăn chặn các cuộc tấn công SQL Injection đó chính là kiểm tra các giá trị đầu vào, chỉ chấp nhận một số kí tự và bỏ qua các kí tự thuộc danh sách đen. Việc tạo ra whitelist và blacklist có thể là một cách tốt tuy nhiên trong một số trường hợp, blacklist và whitelist đều có những trở ngại. Chẳng hạn với blacklist, kẻ tấn công có thể tìm cách để bypass một vài kí tự đặc biệt (meta-characters) hay viết thủ tục để che giấu meta-characters. Và hơn hết, việc kiểm tra input đầu vào không hoàn toàn giúp tránh khỏi cuộc tấn công SQL Injection.

Stored procedure được dùng để ngăn chặn SQL Injection bằng cách giới hạn các kiểu câu lệnh được bypass, nhưng dù sao đi nữa, cũng tồn tại rất nhiều kiểu câu lệnh có thể bypass được. Điều đó có nghĩa là, stored procedure không hoàn toàn giúp ngăn chặn được SQL Injection.

e. Ví dụ về S QL Injection Ví dụ 1

Giả sử có câu truy vấn

Nếu như có một người dùng nào đó có thông tin như sau Firstname evil’ex

Lastname Davis

Từ khi đó câu truy vấn sẽ trở thành

Khi đó cơ sở dữ liệu sẽ được chạy

Như ta thấy, thông tin (có thể vô tình hoặc cố ý) đã không đúng như chúng ta mong đợi và từ đây có thể dẫn tới một cuộc tấn công SQL Injection.

Ví dụ 2

Một đoạn code C# tạo câu truy vấn tìm kiếm kết quả trả về từ bảng items với tên cụ thể. Câu truy vấn này giới hạn những kết quả trả về của những tài khoản đã được xác thực.

Khi đó, câu truy vấn được thực thi như sau

Tuy nhiên, vấn đề ở đây là do câu truy vấn được xây dựng từ dữ liệu động nên khi kẻ tấn công nhập dữ liệu ví dụ “itemName” là “name' OR 'a'='a” thì câu truy vấn khi đó sẽ trở thành SELECT * FROM items bởi vì khi đó điều kiện ‘OR’ là đúng. Và như vậy, rất dễ dàng để có được thông tin trong cơ sở dữ liệu.

Ví dụ 3

Xét trường hợp câu truy vấn như ở ví dụ 2 ở trên và nếu kẻ tấn công thêm một chuỗi "name'; DELETE FROM items; --" thì câu truy vấn sẽ trở thành

Trong rất nhiều hệ quản trị cơ sở dữ liệu cho phép các câu lệnh được thực thi đồng thời (ngăn cách bằng dấu chấm phẩy) và điều này giúp kẻ tấn công thực thi các lệnh tùy ý chống lại cơ sở dữ liệu.

Cần chú ý là hai dấu gạch ngang (--) được xem là chú thích trong hầu hết các hệ quản trị cơ sở dữ liệu và không được thực thi, nhưng ở đây dấu nháy đơn để

hoàn thiện tạo câu truy vấn. Tương tự, kẻ tấn công có thể thêm vào một hay vài câu truy vấn hợp lệ sau đó và tất cả đều sẽ được thực thi.

Một cách truyền thống để ngăn chặn các cuộc tấn công SQL Injection đó chính là kiểm tra các giá trị đầu vào, chỉ chấp nhận một số kí tự và bỏ qua các kí tự thuộc danh sách đen. Việc tạo ra whitelist và blacklist có thể là một cách tốt tuy nhiên trong một số trường hợp, blacklist và whitelist đều có những trở ngại. Chẳng hạn với blacklist, kẻ tấn công có thể tìm cách để bypass một vài kí tự đặc biệt (meta-characters) hay viết thủ tục để che giấu meta-characters. Và hơn hết, việc kiểm tra input đầu vào không hoàn toàn giúp tránh khỏi cuộc tấn công SQL Injection.

Một trong những cách khác là dùng “stored procedure”, mặc dù có thể giúp ngăn chặn một vài kiểu tấn công SQL Injection, tuy nhiên lại thất bại trong nhiều kiểu khác. Ví dụ, PL/SQL procedure dưới đây dễ bị tấn công trong một kiểu SQL Injection như ở ví dụ 2

Stored procedure được dùng để ngăn chặn SQL Injection bằng cách giới hạn các kiểu câu lệnh được bypass, nhưng dù sao đi nữa, cũng tồn tại rất nhiều kiểu câu lệnh có thể bypass được. Điều đó có nghĩa là, stored procedure không hoàn toàn giúp ngăn chặn được SQL Injection.

Một phần của tài liệu Xây dựng công cụ hỗ trợ đánh giá an toàn website luận văn thạc sĩ công nghệ thông tin (Trang 33 - 38)

Tải bản đầy đủ (DOCX)

(81 trang)
w