Tấn công SQL injection

Một phần của tài liệu Tấn công và phòng ngừa mã độc rootkit trong oracle (Trang 22 - 25)

TẤN CÔNG ROOTKIT TRONG ORACLE

1.1.7. Tấn công SQL injection

SQL injection là kiểu tấn công cơ bản dùng để chiếm quyền truy nhập database hoặc lấy thông tin trực tiếp từ database. Attacker truyền một chuỗi input vào ứng dụng nhằm biến đổi cách thức thực hiện câu lệnh SQL. Sự phức tạp của cuộc tấn công liên quan tới việc khai thác các câu lệnh SQL mà attacker không biết. Vì thế các ứng dụng open source và các ứng dụng công bố source code thường dễ bị tấn công hơn. Mọi chương trình hoặc ứng dụng đều có khả năng bị tấn công SQL injection bao gồm các procedure với kết nối database trực tiếp, Oracle Form, web application… Rất nhiều lỗ hổng SQL injection đã được tìm thấy thông qua các gói Oracle Database chuẩn như DBMS_DATAPUMP, DBMS_RESGISTRY và DBMS_METADATA. Web application có mức rủi ro cao nhất đối với tấn công này vì attacker có thể khai thác lỗ hổng SQL injection từ xa mà không phải xác thực database hay application. Hầu hết các nhà phát triển ứng dụng đánh giá thấp sự nguy hiểm của tấn công SQL injection trong các ứng dụng sử dụng Oracle là database.

Các kết quả kiểm toán các ứng dụng web cho thấy nhiều nhà phát triển ứng dụng không đánh giá đầy đủ nguy cơ của tấn công SQL injection và các kỹ thuật cơ bản để tránh các tấn công như vậy.

Có 4 kiểu tấn công SQL injection: SQL Manipulation, code injection, function call injection, buffer overflow .

1.1.7.1. SQL Manipulation

Đây là kiểu tấn công SQL injection thường thấy. Attacker cố gắng biến đổi các câu lệnh SQL bằng cách thêm vào các mệnh đề Where, hoặc các câu lệnh SQL có các toán tử như Union, intersect hoặc minus. Kiểu thao tác SQL cổ điển là thông qua quá trình login. Một ứng dụng web đơn giản có thể kiểm tra xác thực bằng cách thực hiện câu truy vấn sau và kiểm tra nếu có hàng trả về:

Select * from users

Where username=’bob’ and Password=’mypassword’

Attacker sẽ biến đổi câu lệnh thành:

Select * from users

Where username =’bob’ and password=’my password’ or ‘a’=’a’

Rõ ràng mọi row sẽ thỏa mãn mệnh đề Where và attacker lấy được quyền truy nhập vào application.

Toán tử Union cũng thường được dùng trong tấn công SQL injection.

Mục tiêu là biến đổi các câu lệnh vào các hàng trả về từ table khác. Một web form có thể thực hiện chuỗi truy vấn sau để trả về danh sách các sản phẩm:

Select product_name from all_products Where product_name like ‘%chairs%’

Attacker sẽ biến đổi câu truy vấn trên thành:

Select product _name from all_products Where product_name like ‘%chairs%’

Union select username from dba_users Where username like ‘%’

Danh sách trả về cho web form sẽ bao gồm tất cả product được lựa chọn, nhưng còn có cả danh sách các database user trong ứng dụng.

1.1.7.2. Code injection

Tấn công code injection thêm các câu lệnh SQL vào câu lệnh SQL đã có.

Kiểu tấn công này thường gặp ở Microsoft SQL server application. Câu lệnh Execute trong SQL server là đích ngắm của kiểu injection này, và nó không có câu lệnh tương ứng trong Oracle. Tuy nhiên, PL/SQL và java application có thể thực thi các khối anonymous PL/SQL, đây là sơ hở cho code injection.

Ví dụ khối một ứng dụng web sẽ thực hiện khối PL/SQL sau:

Begin encrypt_password(‘bob’, ‘mypassword’);

end;

Một procedure encrypt_password với chức năng mã hóa và lưu mật khẩu của user sẽ được gọi tới. Attacker sẽ cố gắng biến đổi nó:

Begin encrypt_password(‘bob’, ‘mypassword’); delete from users Where upper(username)=upper(‘admin’);

end;

1.1.7.3. Function Call injection

Function call injection là việc chèn các function của oracle hay do người dùng định nghĩa vào các câu lệnh SQL. Các function call này có thể dùng để tạo lời gọi hệ điều hành hoặc thao tác với data trong database.

Oracle database cho phép các function hoặc các function trong các package được thực thi như là một phần của câu lệnh SQL. Mặc định Oracle hỗ trợ hơn 1000 function trong 175 package chuẩn, mặc dù số lượng function có thể dùng trong kiểu tấn công này ít hơn rất nhiều. Một số function này thực hiện các chức năng network có thể hay bị sử dụng. Các function được thực thi là một phần của câu lệnh Select sẽ không tạo được thay đổi nào với database trừ khi function được đánh dấu là ‘Pragme transaction’. Tức là nó có thể được thực thi dưới bất kỳ trường hợp nào xảy ra đối với application. Không có function Oracle nào được thực thi là autonomous transaction. Các function trong các câu lệnh insert, update, hay delete sẽ có thể thay đổi được data.

Các nhà phát triển ứng dụng thường sử dụng các function của database thay vì native code( như Java) để thực hiện những tác vụ thông thường.

Không có công cụ tương ứng với function Translate của database trong Java, nên nhà lập trình quyết định đánh dấu function là ‘pragma transaction’ để nó có thể ghi vào database trong lệnh Select. Câu lệnh SQL như sau :

Select translate (‘user input’,

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', '0123456789') From dual;

Kẻ tấn công sẽ biến đổi nó thành:

SELECT TRANSLATE('' || myappadmin.adduser('admin', 'newpass') || '', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', '0123456789')

FROM dual;

Thực hiện truy vấn này, attacker đã tạo được một user mới.

1.1.7.4. Buffer Overflows

Buffer overflow được xác định trong nhiều function chuẩn của một database. Một số function Oracle có khả năng mắc lỗi buffer overflow và dễ

bị khai thác. Các lỗi buffer overflow trong database functon tz_offset, to_timestamp_tz và bfilename.

Hầu hết application và web server không xử lý việc bị ngưng kết nối database do buffer overflow. Thường thì tiến trình web sẽ bị treo cho tới khi kết nối tới client bị ngắt vì thế, thường xảy ra tình trạng tấn công từ chối dịch vụ.

Một phần của tài liệu Tấn công và phòng ngừa mã độc rootkit trong oracle (Trang 22 - 25)

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

(58 trang)
w