Các kiểu tấn công SQL injection

Một phần của tài liệu Nghiên cứu tìm hiểu một số dạng tấn công sql injection vào hệ quản trị csdl microsoft sql server (Trang 38)

2.2. MỘT SỐ KỸ THUẬT TẤN CÔNG SQL INJECTION

2.2.4. Các kiểu tấn công SQL injection

Trong phần này mô tả các dạng SQLIA khác nhau được biết cho đến nay. Mỗi dạng tấn công SQLIA sẽ được miêu tả thành các phần:

• Tên tương ứng với kiểu tấn cơng

• Mục tiêu thực hiện tấn cơng

• Mơ tả cách thức tấn cơng

• Mơ tả một ví dụ đơn giản thể hiện tấn cơng

Nói chung, các kiểu tấn cơng khác nhau là không được thực hiện độc lập. Phụ thuộc vào mục tiêu của kẻ tấn cơng mà nhiều kiểu tấn cơng có thể được thực hiện với nhau hoặc tuần tự. Chú ý có vơ số các biến thể của mỗi kiểu tấn công.

Dưới đây là đoạn chương trình mẫu có chứa lỗ hổng cho tấn cơng SQL injection. Ví dụ này được sử dụng để thực hiện các kiểu tấn cơng trên đó

1. String login, password, pin, query 2. login = getParameter("login"); 3. password = getParameter("pass"); 3. pin = getParameter("pin");

4. Connection conn.createConnection("MyDataBase");

5. query = "SELECT accounts FROM users WHERE login=’" + 6. login + "’ AND pass=’" + password +

7. "’ AND pin=" + pin;

8. ResultSet result = conn.executeQuery(query); 9. if (result!=NULL)

10. displayAccounts(result); 11. else

12. displayAuthFailed();

Trong đoạn chương trình trên có chứa lỗ hổng và có thể bị ngăn chặn một cách đơn giản bằng cách sửa mã viết chương trình. Tuy nhiên ví dụ này chỉ dùng để minh họa cho các mục đích tấn cơng bởi vì nó dễ hiểu và đủ để cung cấp các dạng tấn công khác nhau.

Nghiên cứu tìm hiểu một số dạng tấn cơng SQL Injection vào hệ quản trị CSDL Microsoft SQL Server

Đoạn chương trình trên thực hiện chức năng đang nhập của một ứng dụng. Nó thực hiện các bước đăng nhập đơn giản mà có thể tìm thấy trong các ứng dụng Web. Đoạn mã trong ví dụ này sử dụng các tham số đầu vào để tạo câu truy vấn SQL và gửi tới cơ sở dữ liệu.

Ví dụ, nếu như người dùng gửi login, password, pin là “doe”, “secret”, và “123” thì ứng dụng tự động tạo và gửi câu truy vấn sau:

SELECT accounts FROM users WHERE

login=’doe’ AND pass=’secret’ AND pin=123

Nếu như thông tin login, password, pin tìm thấy trong cơ sở dữ liệu thì thơng tin tài khoản của doe được trả lại và được hiển thị bởi hàm

displayAccounts(). Ngược lại, nếu khơng tìm thấy thì hàm displayAuthFailed() hiển thị thơng báo lỗi.

2.2.4.1. Tấn cơng dựa vào tính dư thừa (Tautologies)

Mục tiêu: Bỏ qua bước xác thực, xác định tham số có thể tiêm, trích dữ

liệu

Mơ tả: Kiểu tấn công này là tiêm mã vào trong một hoặc nhiều các lệnh

điều kiện để làm cho các câu lệnh này luôn luôn đánh giá là đúng. Kết quả của tấn công phụ thuộc vào các kết quả của truy vấn được sử dụng bên trong ứng dụng. Kiểu tấn công này thường được sử dụng để bỏ qua các trang xác thực và trích dữ liệu. Kẻ tấn cơng khai thác một trường có thể tiêm mà được sử dụng trong điều kiện WHERE của câu truy vấn. Biến đổi điều kiện này thành điều kiện không cần thiết làm cho câu truy vấn thực hiện trả lại tất cả các dịng trong bảng cơ sở dữ liệu.

Ví dụ: Trong ví dụ này, kẻ tấn cơng gửi chuỗi “ ’ or 1=1 - -” tới trường

đầu vào đăng nhập (đầu vào này được đưa tới làm cho các trường khác trở nên không cần liên quan đến). Khi đó câu truy vấn là:

SELECT accounts FROM users WHERE

Nghiên cứu tìm hiểu một số dạng tấn cơng SQL Injection vào hệ quản trị CSDL Microsoft SQL Server

Đoạn mã được tiêm vào trong điều kiện (OR 1=1) làm biến đổi toàn bộ mệnh đề WHERE thành một điều kiện thừa. Cơ sở dữ liệu dùng điều kiện đó để đánh giá mỗi dòng và quyết định những dòng nào sẽ trả về cho ứng dụng. Bởi vì điều kiện là thừa, nên câu truy vấn ln đánh giá là đúng đối với mỗi dòng trong bảng và trả về tất cả các dịng cho ứng dụng. Trong ví dụ này tập dữ liệu được trả về là khác NULL, cho nên ứng dụng kết luận việc xác thực người dùng là thành công. Bởi vậy ứng dụng thực hiện phương thức displayAccounts() và hiển thị toàn bộ các tài khoản được trả về .

2.2.4.2. Tấn công dựa vào các truy vấn trái phép/sai logic

Mục đích: Xác định các tham số có thể tiêm, nhận dạng fingerprint của cơ

sở dữ liệu, trích dữ liệu

Mơ tả: Tấn công này cho phép kẻ tấn công thu thập thông tin quan trọng

về kiểu và cấu trúc của cơ sở dữ liệu back-end của ứng dụng Web. Tấn công này được xem như là bước thu thập thông tin, tài liệu để hỗ trợ cho các tấn công khác. Kiểu tấn công này đưa ra các lỗ hổng dựa vào các trang thông báo lỗi mặc định được trả về từ các server ứng dụng vì các lỗi này thường được mô tả chi tiết. Trong thực tế, thông báo lỗi được tạo ra thường liên quan đến các tham số mà kẻ tấn công tiêm vào. Ban đầu thông tin lỗi thêm vào dự định hỗ trợ cho lập trình viên gỡ rối ứng dụng, sau này kẻ tấn cơng sử dụng nó để thu thập thơng tin về giản đồ của cơ sở dữ liệu.

Khi thực hiện tấn công này, kẻ tấn công cố gắng tiêm các lệnh làm gây ra lỗi cú pháp, lỗi chuyển đổi kiểu hoặc lỗi logic vào cơ sở dữ liệu.

Các lỗi cú pháp có thể được sử dụng để xác định các tham số có thể bị tiêm. Các lỗi định kiểu có thể được sử dụng để suy luận ra kiểu dữ liệu của các cột hoặc để trích dữ liệu. Các lỗi logic thường liên quan đến tên của các bảng và cột.

Ví dụ: Theo ví dụ, tấn cơng này gây ra một lỗi khi chuyển đổi kiểu dữ

liệu. Để thực hiện điều này, kẻ tấn công tiêm đoạn lệnh sau vào trường pin :

“convert(int,(select top 1 name from sysobjects where xtype=’u’))”

Nghiên cứu tìm hiểu một số dạng tấn cơng SQL Injection vào hệ quản trị CSDL Microsoft SQL Server

SELECT accounts FROM users WHERE login=’’ AND

pass=’’ AND pin= convert (int,(select top 1 name from sysobjects where xtype=’u’))

Trong chuỗi tấn cơng này, câu truy vấn cố gắng trích bảng người dùng đầu tiên (xtype=’u’) từ bảng metadata của cơ sở dữ liệu (giả định sử dụng Microsoft SQL Server, thì các bảng metadata được gọi là sysobjects). Sau đó truy vấn này chuyển đổi tên bảng thành một số nguyên. Do việc chuyển đổi kiểu là không hợp pháp, cơ sở dữ liệu đưa ra thông báo lỗi. Đối với Microsoft SQL Server, lỗi này sẽ là “Microsoft OLE DB Provider for SQL Server

(0x80040E07) Error converting nvarchar value ’CreditCards’ to a column of data type int.”

Như vậy kẻ tấn cơng sẽ thu thập được hai thơng tin có ích. Đầu tiên, kẻ tấn cơng có thể biết đây là cơ sở dữ liệu SQL Server. Thứ hai thông báo lỗi liên quan đến giá trị của chuỗi mà gây ra lỗi khi chuyển đổi kiểu. Trong trường hợp này, giá trị này là tên của bảng được định nghĩa trong cơ sở dữ liệu là “CreditCards”. Sử dụng thông tin về giản đồ của cơ sở dữ liệu, kẻ tấn cơng có thể mở rộng các tấn cơng và mục tiêu là các mẩu thông tin cụ thể.

2.2.4.3. Tấn cơng dựa vào truy vấn kết hợpMục đích: Bỏ qua việc xác thực, trích dữ liệu Mục đích: Bỏ qua việc xác thực, trích dữ liệu

Mơ tả: Kẻ tấn cơng khai thác các tham số có thể bị tốn cơng để thay đổi

tập dữ liệu được trả về. Với kỹ thuật này, kẻ tấn cơng có thể đánh lừa ứng dụng trả về dữ liệu từ một bảng khác mà không phải từ một bảng mà người phát triển mong muốn. Kẻ tấn cống thực hiện điều này bằng cách tiêm một lệnh theo dạng:

UNION SELECT <phần còn lại của truy vấn đã được tiêm >

Kẻ tấn cơng hồn tồn kiểm sốt truy vấn thứ hai, nên có thể sử dụng truy vấn này để truy xuất thông tin từ một bảng cụ thể. Kết quả của tấn công là cơ sở dữ liệu trả lại tập dữ liệu mà là sự kết hợp của kết quả truy vấn thứ nhất và truy vấn thứ hai.

Nghiên cứu tìm hiểu một số dạng tấn cơng SQL Injection vào hệ quản trị CSDL Microsoft SQL Server

“’ UNION SELECT cardNo from CreditCards where acctNo=10032 --”

vào trường login, và câu truy vấn được tạo ra như sau:

SELECT accounts FROM users WHERE login=’’ UNION SELECT cardNo from CreditCards where

acctNo=10032 -- AND pass=’’ AND pin=

Giả sử rằng không tồn tại đăng nhập với login=“”, truy vấn thứ 1 trả lại giá trị NULL, trong khi đó câu truy vấn thứ hai trả lại dữ liệu của bảng “CreditCards”. Trong trường hợp này, cơ sở dữ liệu sẽ tả lại cột cardNo đối với tài khoản “10032”. Cơ sở dữ liệu hợp kết quả của hai truy vấn này và gửi trả lại cho ứng dụng.

2.2.4.4. Tấn công dựa vào các truy vấn Piggy-Backed

Mục đích: Trích dữ liệu, thêm hoặc sửa đổi dữ liệu, thực hiện từ chối dịch

vụ, thực hiện cách lệnh từ xa.

Mô tả: Kẻ tấn thử tiêm các truy vấn vào truy vẫn ban đầu. Trong trường

hợp này, kẻ tấn công không cố sửa đổi câu truy vấn ban đầu mà thay vào đó kẻ tấn cơng tạo thêm các câu truy vấn mới, tách biệt được mang cùng với truy vấn ban đầu. Kết quả, cơ sở dữ liệu nhận nhiều câu truy vấn SQL. Đầu tiên là câu truy vấn được mong đợi, được thực hiện bình thường; tiếp theo là thực hiện mỗi câu truy vấn đã được tiêm. Kiểu tấn cơng này có thể là cực kỳ nguy hiểm. Nếu thành cơng, kẻ tấn cơng có thể chèn bất kỳ lệnh SQL, bao gồm các thủ tục lưu trữ và chúng được thực hiện cùng với câu truy vấn ban đầu. Lỗ hổng đối với kiểu tấn cơng này là thường phụ thuộc vào có việc cấu hình cơ sở dữ liệu mà cho phép nhận biết nhiều câu lệnh trên một chuỗi đơn.

Ví dụ: Nếu như kẻ tấn công nhập thêm

“’; drop table users - -”

vào trong trường pass, và ứng dụng sẽ tạo ra truy vấn:

SELECT accounts FROM users WHERE login=’doe’ AND pass=’’; drop table users -- ’ AND pin=123

Nghiên cứu tìm hiểu một số dạng tấn công SQL Injection vào hệ quản trị CSDL Microsoft SQL Server

Sau khi hoàn thành câu truy vấn đầu tiên, cơ sở dữ liệu sẽ nhận biết ký tự kết thúc truy vấn (“;”) và thực hiện truy vấn thứ hai mà đã được tiêm vào.

Kết quả thực hiện của truy vấn thứ hai sẽ là xóa bảng users, làm phá hủy thơng tin có giá trị. Các kiểu truy vấn khác có thể thực hiện để chèn người dùng mới vào cơ sở dữ liệu hoặc thực hiện các thủ tục lưu trữ. Tuy nhiên nhiều cơ sở dữ liệu không yêu cầu ký tự đặc biệt để tách rời các câu truy vấn đơn lẻ, vì vậy cách ngăn chặn kiểu tấn công này bằng cách quét ký tự đặc biệt là không hiệu quả.

2.2.4.5. Tấn cơng dựa vào các thủ tục lưu trữ

Mục đích: Thực hiện leo thang đặc quyền, từ chối dịch vụ, thực hiện các

lệnh từ xa.

Mô tả: Kiểu tấn công này cố gắng thực hiện các thủ tục lưu trữ đang có

trong cơ sở dữ liệu. Ngày nay, hầu hết trong các cơ sở dữ liệu có lưu các thủ tực lưu trữ để mở rộng tính năng của một cơ sở dữ liệu và cho phép nó tương tác với hệ điều hành. Do đó khi kẻ tấn cơng xác định được cơ sở dữ liệu đang được sử dụng, SQLIA có thể giả mạo để thực thi các thủ tục lưu trữ, bao gồm các thủ tục mà tương tác với hệ điều hành. Một nhận thức sai phổ biến là sử dụng các thủ tục lưu trữ để viết các ứng dụng Web làm cho chúng khó thể bị tổn thương bởi SQLIA. Tuy nhiên các thủ tục này có thể bị tấn cơng giống như các ứng dụng thơng thường khác.

Ngồi ra, bởi vì các thủ tục lưu trữ thường được viết dưới dạng ngôn ngữ kịch bản, chúng có thể chứa các kiểu mất an toàn khác, như tràn bộ đệm, điều này cho phép kẻ tấn công chạy đoạn mã bất kỳ trên server hoặc leo thang đặc quyền.

Đoạn chương trình sau mơ tả một thủ tục thực hiện xác thực người dùng.

CREATE PROCEDURE DBO.isAut,henticated

@userName varchar2, @pass varchar2, @pin int AS

Nghiên cứu tìm hiểu một số dạng tấn cơng SQL Injection vào hệ quản trị CSDL Microsoft SQL Server

WHERE login=’" +@userName+ "’ and pass=’" +@password+

"’ and pin=" +@pin); GO

Ví dụ: Trong trường hợp này, các thủ tục lưu trữ được tham số hóa có thể

bị khai thác bởi SQLIA. Giả sử chuỗi truy vấn được tạo tại dịng 5,6,7 của ví dụ được thay bởi lời gọi thủ tục lưu trữ được định nghĩa ở trên. Thủ tục này trả lại giá trị đúng/sai để chỉ ra người dùng được xác nhận chính xác. Để thực hiện một SQLIA, kẻ tấn công tiêm đoạn:

“ ’ ; SHUTDOWN; --”

vào trong trường userName hoặc password. Khi đó thủ tục sẽ tạo câu truy vấn sau:

SELECT accounts FROM users WHERE

login=’doe’ AND pass=’ ’; SHUTDOWN; -- AND pin=

Tại đây, tấn công này làm việc giống như tấn cơng piggy-back. Truy vấn thứ nhất thực hiện bình thường, sau đó truy vấn nguy hiểm thứ hai được thực hiện và kết quả là tắt cơ sở dữ liệu. Ví dụ này chỉ ra rằng thủ tục lưu trữ có thể bị tấn cơng giống như các mã lệnh ứng dụng thông thường.

2.2.4.6. Tấn cơng dựa vào sự suy đốn

Mục đích: Xác định các tham số có thể tiêm, trích dữ liệu, xác định giản

đồ cơ sở dữ liệu

Mô tả: Trong tấn công này, truy vấn bị sửa đổi dưới dạng một hoạt động

được thực hiện dựa vào các câu trả lời dạng đúng/sai về giá trị dữ liệu trong cơ sở dữ liệu. Thông thường kẻ tấn công thử tấn công vào một site mà đã được cho là an toàn ngay cả khi việc tiêm thành cơng, khơng có phản hồi có ích nào thơng qua các thông báo lỗi cơ sở dữ liệu. Kẻ tấn cơng khơng thu được thơng tin hữu ích nào trong các thơng báo lỗi, nên kẻ tấn công sử dụng các phương khác để nhận câu trả lời từ cơ sở dữ liệu. Trong tình huống này, kẻ tấn cơng tiêm các câu lệnh vào site và sau đó quan sát chức năng/trả lời của website đó thay đổi. Bằng cách ghi chép lại một cách tở mỉ khi nào site

Nghiên cứu tìm hiểu một số dạng tấn cơng SQL Injection vào hệ quản trị CSDL Microsoft SQL Server

đó có ứng xử giống nhau và khi nào ứng xử của nó thay đổi, và kẻ tấn cơng có thể suy luận chắc chắn về các tham số dễ bị tấn công và cịn biết các thơng tin thêm về các giá trị trong cơ sở dữ liệu. Có hai kỹ thuật tấn cơng đã được biết dựa vào sự suy luận. Chúng đều cho phép kẻ tấn cơng trích dữ liệu từ một cơ sở dữ liệu và phát hiện các tham số có thể bị tấn cơng.

Tiêm mù (Blind Injection): Trong kỹ thuật này, thông tin phải được

suy luận từ ứng xử của trang bằng cách hỏi server các câu hỏi dạng đúng/sai. Nếu như các lệnh đã được tiêm đánh giá là đúng, thì site tiếp tục hoạt động bình thường. Nếu như các lệnh đánh giá là sai, mặc dù khơng có thơng báo lỗi mơ tả, thì trang này cũng có sự khác đáng kể so với các trang hoạt động bình thường.

Tấn cơng Timing: Tấn cơng kiểu này cho phép thu thông tin từ cơ sở

dữ liệu bằng cách quan sát độ trễ thời gian trong câu trả lời của cơ sở dữ liệu. tấn công này là rất giống với blind injection, nhưng phương pháp suy luận là khác.

Để thực hiện tấn công timing, kẻ tấn công xây dựng câu truy vấn đã được tiêm theo dạng các phát biểu if/then, mà tính chất nhánh tương ứng với mỗi điều chưa biết về nội dung của cơ sở dữ liệu. Lần theo mỗi nhánh, kẻ tấn công sử dụng cấu trúc SQL để đưa ra khoảng thời gian để thực hiện, (ví dụ từ khóa WAITFOR, làm cho cơ sở dữ liệu hoãn đáp ứng yêu cầu trong khoảng thời

Một phần của tài liệu Nghiên cứu tìm hiểu một số dạng tấn công sql injection vào hệ quản trị csdl microsoft sql server (Trang 38)

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

(87 trang)
w