2.3.10.1 Kỹ thuật tấn công
SQL injection là một kỹ thuật cho phép Hacker lợi dụng lỗ hổng trong việc kiểm tra dữ liệu nhập 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 để "chèn vào" (inject) và thi hành các câu lệnh SQL bất hợp pháp (không được người phát triển ứng dụng lường trước hay lỗi ngoại lệ). Hậu quả của nó rất tai hại vì nó cho phép Hacker có thể thực hiện các thao tác xóa, hiệu chỉnh,… Do có toàn quyền trên cơ sở dữ liệu của ứng dụng, thậm chí là máy chủ mà ứng dụng đó đang chạy. Lỗi này thường xảy ra trên các ứng dụng web có dữ liệu được quản lí bằng các hệ quản trị cơ sở dữ liệu như SQL Server, MySQL, Oracle,...
Để xác biết websie nào dính lỗi SQL injection ta thêm dấu “ ’ ” vào sau thanh địa chỉ.
Ví dụ: http://kingclean.vn/vn/productVSHNDetail.php?id=267&group=29 '
Hình 2.15 Một site bị lỗi SQL Injection.
Mọi thông báo lỗi đều được Hacker ghi nhận và sẽ tìm cách vượt qua những lỗi đó để vào được bên trong của hệ thống.
Tấn công SQL Injection vượt form đăng nhập đơn giản
Thường khi chúng ta vào các trang web bán hàng trực tuyến trên mạng là các trang web có kết nối đến cơ sở dữ liệu của trang web. Khi người dùng đăng nhập thành công vào trang web thì có thể mua sắm online và thanh toán trực tuyến với điều kiện là trong tài khoản của bạn vẫn còn tiền hoặc có thể thông qua tài khoản ngân hàng của bạn. Nói tóm lại là rất là tiện lợi không cần phải đi ra khỏi nhà hay đến những siêu thị nữa mà vẫn có những món hàng ưu thích được chuyển đến tận nhà. Hacker ngửi thấy mùi tiền trên nhưng trang web bán hàng đấy hoặc các trang ngân hàng, bây giờ nhiệm vụ của Hacker là tấn công vào hệ thống trang web đấy để có được những tài khoản của khách hàng hay nhằm mục đích khác. Với tấn công SQL Injection vượt qua form đăng nhập được coi là cơ bản nhất để hiểu thêm coi hình minh họa bên dưới.
Hình 2.16 Tấn công SQL Injection.
Thường thì các trang web liên quan đến vấn đề bảo mật thì sẽ bắt người dùng đăng nhập nếu người dùng đăng nhập đúng tài khoản của mình thì sẽ được vào đúng cơ sở dữ liệu của mình nhưng Hacker thì không có tài khoản. Vậy Hacker sẽ làm gì để lot qua được hệ thống đăng nhập. Chúng ta xem đoạn code bên dưới là viết trong form đăng nhập trên.
SQLQuery=”SELECT csdlUsername FROM User WHERE csdlUsername= ‘’’ & strUsername & “’ AND Password= ‘’’ & csdlPassword & ‘‘’ ”
flag = GetQueryResult (SQLQuery) if flag = “” then check=FALSE else check=TRUE end ...
Đoạn mã trên kiểm tra chuỗi nhập Username và Password. Nếu nhập đúng tài khoản và mật khẩu thì sẽ check=true và ngược lại là check=false. Hacker thì không có tài khoản rồi nhưng lại phát hiện lỗ hổng trong forum đăng nhập và anh ta gõ username và password là ‘ OR ‘’=’ như hình 3.10. Thì đoạn code trong form kết hợp với chuối Hacker nhập vào sẽ thành như thế này.
SELECT csdlUsername FROM User WHERE csdlUername= ‘’ OR ‘’=‘’ AND Password ‘’ OR ‘’=‘’
Phân tích câu này thì:
csdlUsername ‘’: không nhập nhập gì thì FALSE ‘’=‘’: vế này thì TRUE
Password ‘’: không nhập thì sẽ không có trong csdlpassword rồi FALSE ‘’=‘’ vế này thì TRUE
Vậy ta xét lại như sau: (F or T) and (F or T) => T and T. Với cấu trúc trên thì Hacker hoàn toàn đột nhập vào hệ thống mà không cần bất kì tài khoản nào. Sau khi đăng nhập thành công thì hệ thống sẽ chuyển đến tài khoản đầu tiên trong cơ sở dữ liệu của hệ thống. Việc tiếp theo của Hacker có thể là khám phá tài khoản này hoặc là sẽ tiếp tục tấn công sang các tài khoản khác hoặc sẽ nhòm ngó đến tài khoản có quyền nhất trong hệ thống chính là Admin.
Đấy chỉ là những cái cơ bản nhất của SQL Injection, nó còn có thể tấn công với câu lệnh như SELECT, HAVING, INSERT,...
2.3.10.2 Một số biện pháp bảo mật khắc phục
Việc tấn công SQL Injection dựa vào những câu thông báo lỗi do đó việc phòng chống hữu hiệu nhất là không cho hiển thị những thông điệp lỗi hệ thống cho người dùng thay vào đó bằng một thông báo lỗi do người lập trình hay quản trị viên phát triển thiết kế mỗi khi lỗi xảy ra trên ứng dụng.
Kiểm tra kỹ giá trị nhập vào của người dùng, những kí tự đặt biệt,... Hãy loại bỏ các kí tự “, ’, ”, /, \, ;, “ và các từ khóa như NULL, CR, LF,... Sử dụng phương thức POST và mã hóa thanh URL của trình duyệt máy khách. Cô lập máy chủ CSDL và máy chủ WEB hay nói cách khách là máy chủ CSDL không được cài trên máy chủ WEB để đảm bảo tính bảo mật.
Nên sử dụng tài khoản với đặc quyền thấp để truy xuất vào CSDL. Có nghĩa là không phải nhất thiết khi nào cũng phải dùng đến quyền Admin hay Root mà nên phân quyền cho các User đúng với mục đích của công việc, đúng với ý đồ của người quản trị viên.