Các dạng tấn công SQL Injection

Một phần của tài liệu Tìm hiểu một số phương pháp tấn công website và đề xuất một số giải pháp hạn chế (Trang 47 - 52)

Có bốn dạng thông thường bao gồm: vượt qua tường lửa lúc đăng nhập, sử dụng câu lệnh SELECT, sử dụng câu lệnh INSERT, sử dụng stored – proceures.

Để biết các website sử dụng cơ sở dữ liệu SQL ta sử dụng các phần mềm, các công cụ tìm kiếm lỗi hoặc công cụ tìm kiếm Google .

Để biết website nào dính lỗi SQL Injection ta thêm dấu “ ’ ” vào sau thanh địa chỉ.

- Dạng tấn công vượt qua kiểm tra đăng nhập:

Với dạng tấn công này, tin tặc có thể dễ dàng vượt qua các trang đăng nhập nhờ vào các lỗi khi dùng các câu lệnh SQL thao tác trên cơ sở dữ liệu của ứng dụng web.

Xét một ví dụ điển hình, thông thường để cho phép người dùng truy cập vào các trang web được bảo mật, hệ thống thường xây dựng trang đăng nhập để yêu cầu người dùng nhập thông tin về tên đăng nhập và mật khẩu. Sau khi người dùng nhập thông tin vào, hệ thống sẽ kiểm tra tên đăng nhập và mật khẩu có hợp lệ hay không để quyết định cho phép hay từ chối thực hiện tiếp. Trong trường hợp này câu lệnh truy vấn SQL là:

48

tendangnhap =’” &txttendangnhap& “’ and matkhau=’” &txtmatkhau&”’

Thoạt nhìn câu truy vấn này không có bất cứ lỗi về an toàn nào. Người dùng không thể đăng nhập mà không có tên đăng nhập và mật khẩu hợp lệ. Tuy nhiên, đoạn mã này thực sự không an toàn và là tiền đề cho một lỗi SQL Injection.

Nếu người dùng nhập vào ô tên đăng nhập và mật khẩu là :’ OR”=’

Lúc này câu truy vấn sẽ được gọi thực hiện là:

select * from user where tendangnhap=”OR”=” and matkhau = “OR”=”

Kết quả là câu truy vấn này là hợp lệ và sẽ trả về tất cả các bản ghi của bảng user và đoạn mã tiếp theo xử lý người dùng đăng nhập bất hợp pháp này như là người dùng đăng nhập hợp lệ

- Dạng tấn công sử dụng câu lệnh SELECT:

Dạng tấn công này phức tạp hơn. Để thực hiện được kiểu tấn công này, kẻ tấn công phải có khả năng hiểu và lợi dụng các sơ hở trong các thông báo lỗi từ hệ thống để dò tìm các điểm yếu khởi đầu cho việc tấn công.

Xét một ví dụ thường gặp trong các website về bán sản phẩm. Thông thường, sẽ có một trang nhận ID của sản phẩm cần hiển thị rồi sau đó truy vấn nội dung của chi tiết sản phẩm có ID này. Câu truy vấn SQL là:

sql=”select * from sanpham inner join loaisp on sanpham.maloai = loaisp.maloai where sanpham.masp = ‘” +masp+”’”

Trong các tình huống thông thường, đoạn mã này sẽ hiển thị nội dung của tin có masp trùng với masp đã chỉ định và hầu như không thấy có lỗi. Tuy nhiên,

49

đoạn mã này để lộ sơ hở cho một lỗi SQL Injection khác. Kẻ tấn công có thể thay thế một masp hợp lệ bằng cách gán masp cho một giá trị khác và từ đó, khởi đầu cho một cuộc tấn công bất hợp pháp, ví dụ như: HRBD’ ORDER BY 16 –

Lúc này câu truy vấn sẽ trở thành:

select * from sanpham where masp = ‘HRBD’ ORDER BY 16-‘

Dấu “--“ trong SQL có nghĩa là chú thích. Mục đích dùng để loại bỏ các lệnh SQL nằm phía sau dấu “—“

Bằng cách này kẻ tấn công có thể chèn bất cứ câu lệnh sql nào vào để website thực hiện bằng cách thêm dấu “ ‘ “ và các câu lệnh SQL muốn thực thi sau địa chỉ của website.

Để xem thông tin về phiên bản của hệ quản trị cơ sở dữ liệu mà website đang dùng ta chèn thêm vào địa chỉ web chuỗi giá trị như sau:

union all select ‘1’,@@version,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’10’—

Lúc này câu lệnh truy vấn ban đầu không thành công chương trình sẽ thực hiện thêm câu lệnh SELECT phía sau từ khóa UNION (từ khóa này dùng để hợp kết quả của 2 câu lệnh SELECT thành 1).

Tất cả các ví dụ trên, dường như không có gì là nguy hiểm, nhưng hãy thử tưởng tượng kẻ tấn công có thể xóa toàn bộ cơ sở dữ liệu bằng cách chèn vào các đoạn lệnh nguy hiểm như drop table.

Ví dụ như: ‘DROP TABLE USER –‘

Để biết được ứng dụng có bị lỗi này hay không, rất đơn giản, hãy nhập vào chuỗi UNION như trên, nếu hệ thống thông báo về lỗi cú pháp dạng: Invalid

50

object name “OtherTable”. Ta có thể biết chắc là hệ thống đã thực hiện câu SELECT sau từ khoá UNION, vì như vậy mới có thể trả về lỗi mà ta đã cố tình tạo ra trong câu lệnh SELECT.

Để biết được tên của các bảng cơ sở dữ liệu mà thực hiện các thao tác phá hoại khi ứng dụng web bị lỗi SQL Injection, rất đơn giản, vì trong SQL máy chủ có hai đối tượng sysobject và syscolumns cho phép liệt kê tất cả các tên bảng và cột trong hệ thống. Ta chỉ cần chỉnh lại câu lệnh SELECT như sau:

UNION SELECT name FROM sysobjects WHERE xtype =’U’

là có thể liệt kê được tên tất cả các bảng dữ liệu.

- Dạng tấn công sử dụng câu lệnh INSERT:

Thông thường các ứng dụng web cho phép người dùng đăng kí một tài khoản để tham gia. Chức năng không thể thiếu là sau khi đăng nhập thành công, người dùng có thể xem và hiệu chỉnh thông tin của mình. SQL Injection có thể được dùng khi hệ thống không kiểm tra tính hợp lệ của thông tin nhập vào.

Xét ví dụ sau: câu truy vấn sql lúc đăng kí thành viên

insert into users (hoten, tendangnhap, matkhau, email, gioitinh) values

(‘ “+hoten+”’,’”)

Thì chắc chắn sẽ bị lỗi SQL Injection vì nếu nhập vào trường thứ nhất là ‘+(SELECT TOP 1 tendn FROM users)+’

Lúc này câu truy vấn sẽ trở thành: Insert into user values (‘’+(SELECT TOP 1 tendn FROM user) +’’,’abc’,’def’)

51

Khi đó, lúc thực hiện xem thông tin, xem như bạn đã yêu cầu thực hiện thêm một lệnh nữa đó là: SELECT TOP 1 tendn FROM users.

- Dạng tấn công sử dụng stored-procedure:

Trong SQL, máy chủ có các cơ sở dữ liệu tổng thể và trong các cơ sở dữ liệu này có các hệ thống thủ tục lưu trữ được lập trình sẵn để thực hiện các công việc cụ thể nào đó. Nếu như kẻ tấn công chiếm được quyền điều khiển hệ quản trị này và thực hiện truy vấn đến các lưu trữ này hoặc nguy hiểm hơn là xóa đi cơ sở dữ liệu tổng thể thì toàn bộ cơ sở dữ liệu sẽ bị ảnh hưởng và không hoạt động được.

Việc tấn công vào thủ tục lưu trữ sẽ gây tác hại rất lớn nếu ứng dụng được thực thi với quyền quản trị hệ thống ‘sa’.

Ví dụ nếu ta thay đoạn mã tiêm vào dạng:

’;EXEC xp_cmdshell’cmd.exe dir C:’

Lúc này hệ thống sẽ thực hiện lệnh liệt kê thư mục trên ổ đĩa C:\ cài đặt máy chủ.Việc phá hoại kiểu nào tuỳ thuộc vào câu lệnh đằng sau cmd.exe. Nếu cài SQL ở chế độ mặc định thì SQL chạy trên nền SYSTEM, tương đương mức truy cập ở Windows. Có thể dùng master..xp_cmdshell để thi hành lệnh từ xa.

- Tấn công SQL Injection nâng cao:

Chuỗi kí tự không có dấu nháy đơn: nhà lập trình có thể bảo vệ ứng dụng của họ bằng cách loại bỏ tất cả dấu nháy, thông thường loại bỏ dấu nháy bằng cách thay một dấu nháy thành 2 dấu nháy.

52

Tấn công 2 tầng: mặc dù ứng dụng đã thay thế dấu nháy đơn nhưng vẫn còn khả năng bị chèn đoạn mã SQL. Cách giải quyết tốt nhất là không cho phép nhập dấu nháy đơn.

Một phần của tài liệu Tìm hiểu một số phương pháp tấn công website và đề xuất một số giải pháp hạn chế (Trang 47 - 52)