CÁCH TỐT NHẤT ĐỂ NGĂN CHẶN MỘT CUỘC TẤN CÔNG SQL(SQL INJECTION)

Discussion in 'Hacking & Security Tutorials' started by admin, Feb 21, 2018.

  1. admin

    admin Administrator Staff Member

    Trong bài hướng dẫn này tôi sẽ chỉ cho mọi người cách ngăn chặn một cuộc tấn công SQL Injection.

    SQL Injection là gì ?

    SQL Injection là một kỷ thuật tấn công chủ yếu dùng để tấn công Data-Driven Applications( tạm dịch thông qua phần mềm ứng dụng ).

    Những thủ tục hay những hàm sử dụng những câu truy vấn SQL động bằng việc cắt chuỗi SQL động nhập vào để thực hiện một cuộc tấn công thông qua biến Input(nhập vào) khi đó, chúng ta thực thi câu lệnh sẽ dẫn đến một kết quả không như mong muốn.

    Ví dụ:

    DECLARE @sqlTextnvarchar(MAX), @user_idnvarchar(MAX);

    SET @sqlText = ‘SELECT * FROM Users WHERE user_id = ’[email protected]_id;

    EXEC(@sqlText);

    Với ví dụ trên, nếu người dùng cung cấp @user_id = ‘105; DROP TABLE Tablename’ thì ta thấy câu lệnh trên thực hiện luôn lệnh xóa bảng dữ liệu trong CSDL.

    Cách tốt nhất để ngăn chặn một cuộc tấn công dữ liệu.

    Thực thi câu truy vấn động, dùng SP_EXECUTESQL với những biến nhập vào. Trong khi viết những câu lệnh truy vấn SQL động và thực thi chúng, tôi sẽ chỉ cho các bạn cách viết tránh bị tấn công.

    1. Tránh dùng biến nối tiếp(concatenating) biến tham số trong chuỗi truy vấn.
    Ví dụ:

    declare @cmd nvarchar(MAX)

    set @cmd = N ‘select * from dbo.MyTable where col1 = ‘ + @arg1;

    Câu truy vấn này nên được viết thành

    declare @cmd nvarchar(MAX)

    declare @parameters nvarchar(MAX)

    set @cmd = N ‘select * from dbo.MyTable where col1 = @arg1’;

    set @parameters = ‘@arg1 VARCHAR(MAX)’;

    1. Tránh thực thi những câu truy vấn SQL động, thay vào đó chạy thủ tục EXEC. Cách tiếp cận này không nên truyền các tham số tỉnh.
    Thay vào đó ta nên dùng thủ tục SP_EXECUTESQL theo dạng truyền các tham số là các câu lệnh truy vấn SQL động.

    Ví dụ:

    Với @arg1 là một tham số truyền cho thủ tục, có chứa mã lệnh, được đề cập bên dưới.

    declare @cmd nvarchar(MAX);

    set @cmd = N ‘select * from dbo.MyTable where col1 = ‘ + @arg1;

    EXEC(@cmd);

    Câu lệnh trên nên được viết thành.

    declare @cmd nvarchar(MAX);

    declare @parameters nvarchar(MAX);

    set @cmd = N ‘select * from dbo.MyTable where col1 = @arg1’;

    set @parameters = ‘@arg1 VARCHAR(MAX)’;

    EXEC SP_EXECUTESQL

    @cmd, –Câu lệnh SQL động như là tham số đầu tiên

    @parameters, –Định nghĩa những tham số như tham số thứ 2

    @arg1 = @arg1; — Gán giá trị tham số cho tham số

    Lưu ý:

    – 2 tham số của SP_EXECUTESQL(@cmd và @parameters nên luôn là loại nvarchar).

    – Nếu tham số SQL động yêu cầu nhiều biến chuỗi, những biến chuỗi có thể viết cách nhau bởi dấu (,)

    Ví dụ:

    Declare @cmd nvarchar(MAX), @params nvarchar(MAX),

    @arg1VARCHAR(MAX) = ‘ParamValue1’, @arg2VARCHAR(MAX) = ‘ ParamValue2’;

    SET @cmd = ‘SELECT * FROM dbo.MyTable WHERE [email protected] and [email protected]’;

    SET @params = ‘@arg1 VARCHAR(MAX),@arg2 VARCHAR(MAX)’;

    Thực thi truy vấn trên.

    EXEC SP_EXECUTESQL @cmd, @params, @arg1 = @arg1, @arg2 = @arg2;

    Sau đây là ví dụ hoàn chỉnh cho truy vấn trên, miêu tả cách dùng câu truy vấn SQL động trong SP.

    create procedure test_procedure1(@arg1 VARCHAR(MAX))

    as

    declare @cmd nvarchar(MAX)

    declare @parameters nvarchar(MAX)

    set @cmd = N ‘select * from dbo.MyTable where col1 = @arg1’

    set @parameters = ‘@arg1 VARCHAR(MAX)’

    EXEC sp_Executesql @cmd, @parameters, @arg1 = @arg1;

    go

    –Thực thi thủ tục

    declare @argVARCHAR(MAX);

    SET @arg = ‘Some Text’;

    EXEC test_procedure1 @arg;

    go

    Trên đây tôi đã chỉ ra cho bạn cách mà các Hacker tấn công vào Cơ sở dữ liệu, và cũng đưa ra giải pháp để các bạn có thể tránh được sự tấn công đó. Ví dụ càng minh họa rõ cho thấy được sự nguy hiểm khó lường đến mức nào.

    Trong bài kế tiếp tôi sẽ chỉ ra thêm một cách mà hacker có thể tấn công Cơ sở dữ liệu, tuy mức độ tàn phai nhan sắc( ý lộn: tàn phá dữ liệu không bằng nhưng cũng đủ điêu đứng doanh nghiệp).

    [email protected]
    My PGP key: https://goo.gl/triziq
     

Share This Page