2 Kĩ thuật tấn công SQL Injection
2.7.2 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 .
Ví dụ 21: Để đăng kí account trong ứng dụng, nhập username như sau: Username : admin'—
Password: passofadmin
Ứng dụng sẽ thay thế dấu nháy, kết quả trong câu insert sẽ như sau: INSERT into User VALUES(123, 'admin''--', 'password',0xffff) (nhưng trong cơ sở dữ liệu sẽ lưu là “ admin’-- “)
Giả sử rằng ứng dụng cho phép người dùng thay đổi mật khẩu. Các đoạn mã ASP được thiết kế đảm bảo rằng người sử dụng phải nhập đúng mật khẩu cũ trước khi nhập mật khẩu mới. Đoạn mã như sau:
username = escape( Request.form("username") ); oldpassword = escape( Request.form("oldpassword") ); newpassword = escape( Request.form("newpassword") ); var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and password = '" + oldpassword + "'";
rso.open( sql, cn ); if (rso.EOF)
{…
Câu truy vấn thiết lập mật khẩu mới như sau:
sql = "update users set password = '" + newpassword + "' where username= '" + rso("username") + "'"
rso(“username”) chính là giá trị username có được câu truy vấn login và nó là admin’-- Câu truy vấn lúc này như saupdate users set password = 'password' where username = 'admin'--'
Nhờ đó hacker có thể thay đổi mật khẩu của admin bằng giá trị của mình. Đây là 1 trường hợp còn tồn tại trong hầu hết những ứng dụng lớn ngày nay có sử dụng cơ chế loại bỏ dữ liệu. Giải pháp tốt nhất là loại bỏ những giá trị lỗi hơn là chỉnh sửa lại. Nhưng có một vấn đề là có một số ô nhập dữ liệu (như ô nhập tên) cho phép những kí tự này. Ví dụ: O’Brien. Cách tốt nhất để giải quyết vấn đề này là không cho phép nhập dấu nháy đơn. Nếu điều này không thể thựchiện được , thì loại bỏ và thay thế như trên.
Trong trường hợp này, cách tốt nhất là đảm bảo tất cả dữ liệu được đưa vào câu truy vấn SQL (kể cả những giá trị trong cơ sở dữ liệu) phải được kiểm soát một cách chặt chẽ.
Một số ứng dụng phòng chống việc thêm câu truy vấn từ người dùng bằng cách giới hạn chiều dài của ô nhập. Tuy nhiên, với giới hạn này thì một số kiểu tấn công không thể thực hiện được nhưng vẫn có chỗ hở để hacker lợi dụng.
Ví dụ 22: Giả sử cả username và password đều bị giớihạn tối đa là 16 kí tự.Nhập: Username: aaaaaaaaaaaaaaa’
Password : ‘; shutdown--
Ứng dụng sẽ thay thế một dấu nháy đơn bằng hai dấu nháy đơn nhưng do chiều dài chuỗi bị giới hạn chỉ là 16 kí tự nên dấu nháy đơn vừa được thêm sẽbị xoá mất. Câu lệnh SQL như sau:
Select * from users where username=’aaaaaaaaaaaaaaa’’ and password=’’’; shutdown—‘
kết quả là username trong câu lệnh có giá trị là: aaaaaaaaaaaaaaa’ and password=’