Giới Thiệu SQL Injection:

Sql Injection là một kỷ thuật mà các hacker 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 đến DBMS để khai thác các thông tin nhạy cảm. Sql Injection có thể cho phép hacker thực hiện các thao tác như Insert, delete, updatetrên cơ sở dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy. Các lỗi này chỉ xảy ra trên các ứng dụng web có liên kết với các DBMS như:SQL Server, MySQL, Oracle, DB2, Sysbase… và bất kì ngôn ngữ lập trình web động nào như: php, asp, asp.net, jsp.
Một vấn đề cần lưu ý: là các lỗi bảo mật này phát sinh bởi các lập trình viên khi phát triển chương trình không lưu ý, hoặc bất cẩn trong việc kiển tra dữ liệu phía người sử dụng.

Vấn Đề bảo mật khi triển khai các ứng dụng web và SQL injection:

Khi triển khai một ứng dụng trên web người ta thường nghĩ đến các vấn đề bảo mật, an toàn thông tin đều chì tập trung ờ các khía cạnh như hệ điều hành, hệ quản trị cơ sở dữ liệu (DBMS), Webserver mà ít khi nào suy nghĩ đến vấn đề phát sinh chính từ các ứng dụng web này. Một trong các lỗ hỗng bảo mật tồn trong các ứng dụng web là SQL Injection.
Đây là một trong các lỗi bảo mật nguy hiểm nhất mà hacker thường sử dụng để khai thác thông tin nhạy cảm trong CSDL.

Cơ Chế Hoạt Động Của Ứng Dụng Web:

Hiện tại đa phần các ứng dụng web động trên internet đều được phát triển bởi một trong ba ngôn ngữ sau: php, asp.net, jsp , và liên kết với một trong các DBMS như: SQL Server, MySql, Oracle. Trong bài viết này chúng ta sẽ sữ dụng ngôn ngữ php5MySql v5 trong suốt các ví dụ.
Ứng dụng web là một ví dụ điển hình của kiến trúc client/server. Máy tính khi truy cập một trang từ trình duyệt đóng vai trò là một client, từ trình duyệt sẽ gửi một yêu cầu đến server.Server nhận được yêu cầu của client sẽ tiến hành xử lý các yêu cầu này và chuyển dữ liệu trở về trình duyệt và hiển thị nội dung cần được xử lý. Mô hình dưới đây giới thiệu cơ chế hoạt động này một cách chính xác.

Mô hình ứng dụng web ba tầng

Mô hình ứng dụng web ba tầng

Phương Thức Truyền Dữ Liệu:

Hai phương thức truyền dữ liệu cơ bản mà các ưng dụng web sử dụng là GET methodPOST method, điểm khác nhau giữa hai phương thức này như sau:

Method GET: Dữ liệu gửi từ trình duyệt lên qua phương thức GET là phần dữ liệu được nhập trực tiếp theo sau địa chỉ URL do trình duyệt gửi lên, được phân biệt với tên file script bằng dấu hỏi chấm (?). Ví dụ, khi ta gõ vào trình duyệt địa chỉ URL sau:

http://www.victim.com?product=1
Khi đó, trình duyệt sẽ gửi theo địa chỉ trên một cặp biến = giá trị, trong đó biến có tên là product và giá trị là 1.Khi trình duyệt gửi các thông tin này lên máy chủ, PHP sẽ tự động sinh ra một mảng có tên là $_GET[] để nắm giữ tất cả các cặp biến và giá trị đó, trong đó, chỉ số của mảng chính là một chuỗi mang tên của tên biến và giá trị của chỉ số đó chính là giá trị của biến do trình duyệt gửi lên.

Method POST: Post là phần dữ liệu được gửi qua các form HTML có method =”POST”.Để lấy các biến theo kiểu POST, PHP sẽ tự động sinh ra mảng có tên là $_POST[]. Mảng này có chỉ số chính là tên của các phần tử trong form (các thẻ input, select… có thuộc tính name) và giá trị là nội dung giá trị do người sử dụng nhập vào các phần tử có tên tương ứng. Chẳng hạn với mẫu biểu HTML sau:

Biểu mẫu đăng nhập

Biểu mẫu đăng nhập

Với mã code html như sau:

Mã code tạo form đăng nhập bằng HTML

Mã code tạo form đăng nhập bằng HTML

Dữ Liệu Trong Post sau khi dùng lệnh var_dump được cung cấp bởi php

Dữ liệu Post

Dữ liệu Post

Do đây là hình thức truyền dữ liệu từ client đến server đo đó việc không kiểm tra chính xác các dữ liệu được cung cấp bởi người sử dụng sẽ gây ra các lỗi bảo mật sql injection.

Tìm Kiếm Lỗi SQL Injection Trên Ứng Dụng

Lỗi bảo mật Sql Injection có thể tồn tại ở bất kể nơi nào tại giao diện người sử dụng với những yêu cầu dữ liệu được truyền đến server qua hai dạng giao thức truyền dữ liệu POST & GET. Qua hai giao thức truyền dữ liệu này người sử dụng có khả năng gửi các yêu cầu xử lý dữ liệu của mình qua các câu lệnh sql được tạo ra từ ngôn ngữ lập trình php đến hệ quản trị cơ sở dữ liệu mysql. Nắm được được vấn đề này các hacker có thể chèn thêm các đoạn mã sql vào trong phần dữ liệu được gửi từ trình duyệt để tạo các các đáp ứng bất thường do máy chủ truyền lại.
Một ví dụ đơn giản qua bài lab (Phát hiện sql injection) cho vấn đề phát hiện lỗi bảo mật sql injection được thực hiện như sau.

Giả sử chúng ta đang truy cập vào một trang web thương mại điện tử, chúng ta xem danh sách các món hàng trong cửa hàng tại trang web theo từng trang tại địa chỉ

http://www.victim.com?item=1
http://www.victim.com?item=2 --> trang 2
http://www.victim.com?item=3 --> trang 3
Danh sách trang sản phẩm

Danh sách trang sản phẩm

Trong url này tồn tại dữ liệu $_GET[‘item’] = 1 gửi đến server nhằm yêu cầu hiển thị tất cả các món hàng tại trang 1. Từ đây ta có thể thay đổi giá trị item bằng một giá trị nào đó khác số trang thì sẽ gây ra một lỗi được gửi lại từ server.

http://www.victim.com?item=test

Với giá trị $_GET[‘item’] = “test” sẽ phát sinh một lỗi từ server như thông báo sau:

Lỗi Mysql Server

Lỗi Mysql Server

Lỗi trên thông báo cho chúng ta biết rằng đối số được truyền vào hàm mysql_fetch_array() không hợp lệ.

Các Lỗi MySQL giúp nhận biết lỗ hỗng bảo mật SQL INJECTION:

Bằng việc thay đổi các giá trị khác nhau khi truyền đến server chúng ta sẽ nhận được các phát sinh lỗi điển hình sau đây khi php tạo các câu truy vấn sql cho thấy các lỗi sql injection tiềm tàng:

SELECT * FROM `sql`.`items` LIMIT test,10;

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result: Đối số cung cấp không hợp lệ.

SELECT * FROM `items` WHERE id=test’

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near”’ at line 1: Lỗi cú phát phát sinh khi đối số làm thay đổi câu truy vấn được tạo từ php.

SELECT * FROM `items` WHERE id=test

Error: Unknown column ‘attacker’ in ‘where clause’: Không tìm thấy cột “attacker”

Các Dạng Tấn Công SQL Injection:

Inline injection:

Đây là một dạng tấn công bằng cách chèn các mệnh đề login luôn luôn đúng vào giao thức truyền dữ liệu đề tạo thành một dạng truy vấn luôn cho ra kết quả đúng. Quay lại với ví dụ đăng nhập ta thấy rằng khi ta nhập chính xác user và pass sẽ tạo thành một câu truy vấn như sau:

SELECT * FROM `sql`.`users` WHERE `name`='user1' AND `pass`='user1'

Câu truy vấn này sẽ tìm các record trong table `users` có giá trị ‘name` = `user1` và ‘pass’=’user1`, do đó chỉ khi nào chúng ta biết và nhập chính xác thì mới có thể đăng nhập vào trang web.Tuy nhiên ứng dụng này tồn tại lỗi SQL Injection do đó nếu ta thay giá trị gửi từ form lên server như hình dưới đây thì chúng ta vẫn có thể đăng nhập một cách bình thường.

Tấn công by pass password

Tấn công by pass password

Bằng việc thêm vào mệnh đề ‘or ‘1’=’1 chúng ta sẽ có được câu truy vấn như sau:

SELECT * FROM `sql`.`users` WHERE `name`='user1' or '1'='1 ' AND `pass`='test'

Câu truy vấn này luôn luôn đúng với mọi password.

Mô hình Inline Injection

Mô hình Inline Injection

Terminating Injection:

Terminating Injection

Terminating Injection

Sử dụng dấu “–” và ”” để loại bỏ phần đoạn mã đằng sau thi hành injection

Mô Hình Terminating Injection

Mô Hình Terminating Injection

Blind Injection:

Các ứng dụng web truy cập cơ sở sự liệu với nhiều mục đích, một trong các mục đích chính là trình bày và hiển thị nội dung khi người sử dụng yêu cầu. Bằng các thủ thuật thay đổi giá trị dữ liệu khi gửi lên server chúng ta có thể tìm thấy được các lỗi phát sinh ở phẩn trên, đây là các lỗi tiềm tàng cho một cuộc tấn công bằng SQL Injection. Tuy nhiên trong một số trường hợp các lỗi bảo mật này sẽ không hiển thị trên trang web, điểu này không bảo đảm chắc chắn rằng trang web không bị tấn công bằng SQL Injection.

Với dữ liệu nhập bên trên sẽ tạo ra câu lệnh SQL như sau:

Blind Injection

Blind Injection

SELECT * FROM `sql`.`users` WHERE `name`='user1' AND `pass`='' or 1=1--''

Mặc dù chúng ta không biết được mật khẩu cảu user1 nhưng chúng ta vẫn đăng nhập một các thành công, bời vì với câu lệnh trên mệnh đề truy vấn luôn luôn đúng với mọi trường hợp. Rỏ ràng tại đây phát sinh một lỗi SQL Injection nhưng server không hề trả lại một thông báo nào.

Quay lại với ví dụ (Phát hiện sql injection) bên trên, khi ta thay đổi giá trị item bằng một số nguyên lớn, server vẫn hiển thị cho chúng ta nhưng không hề báo lỗi:

Blind Sql Injection

Blind Sql Injection

Các Dạng Tấn Công Bằng SQl Injection

Có bốn dạng tấn công bằng sql injection thường gâp sau đây:

  • vượt qua kiểm tra lúc đăng nhập (authorization bypass)
  • sử dụng câu lện SELECT
  • sử dụng câu lệnh INSERT
  • sử dụng các stored-procedures

Dạng Tấn Công Vượt Qua Đăng Nhập

Đây là một dạng tấn công mà hacker có thể đăng nhập vào một trang web bằng cách khai thác lỗi bào mật sql injection qua form đăng nhập của ứng dụng web. Từ cho phép các hacker có thể vượt qua bước xác minh user và pass để đăng nhập vào hệ thống và sử dụng các quyền truy cập của user. Demo authorization bypass hướng dẫn chúng ta thực hiện cuộc tấn công này.

Dạng Tấn Công Select

Để thực hiện được kiểu tấn công này, hacker phải có khả năng hiểu và lợi dụng các sơ hở trong các thông báo lỗi từ hệ thống để dò tìm các điểm yếu khởi đầu cho việc tấn công.Thông thường, sẽ có một trang nhận ID của tin cần hiển thị rồi sau đó truy vấn nội    dung của tin có ID này.Trong demo “tấn công bằng Select” sẽ trình bày một ví dụ điển hình như sau:

Trong một trang web thương mại điện tử khách hàng chọn một sàn phẩm và thông tin của sàn phẩm đó được hiển thị qua trang web item.php qua câu truy vấn sau:

SELECT * FROM `items` WHERE `id`=1;

Thông thường, đoạn mã này hiển thị nội dung của tin có ID trùng với ID đã chỉ định và hầu như không thấy có lỗi.

Tuy nhiên, nếu thay thế một ID hợp lệ bằng cách gán ID cho một giá trị khác ví dụ như: and 1=1

Câu truy vấn SQL lúc này sẽ trả về item có id = 10 và câu lệnh này hoàn toàn chạy một cách chính xác theo yêu cầu hiển thị:

SELECT * FROM `items` WHERE `id`=10 and 1=1;

Tuy nhiên nếu ta thay thế id = 1 or 1=1 thì trang web item.php sẽ hiển thị toàn bộ danh sách các item trong bảng items, rõ ràng đây là điều bất hợp lý vì trang item.php có tác dụng hiển thị thông tin của 1 món hàng mà khách hàng đã chọn:

Thông tin sản phẩm

Thông tin sản phẩm

Một ví dụ khác với trường hợp này bằng cách thểm một đoạn truy vấn khi liệt kê danh sách các sàn phẩm trong trang items.php chúng ta có thể biết được các thông tin sau: phiên bản mysql đang dùng, tên user đang sử dụng, tên database:

Hiển thị tên datasase:

http://localhost/s/?page=listitems&item=2%20union%20select%20database%28%29

 

Hiển thị phiên bản SQL

Hiển thị phiên bản SQL

Hiển thị tên user:

http://localhost/s/?page=listitems&item=2%20union%20select%20user%28%29

Hiển thị phiên bản MySql

http://localhost/s/?page=listitems&item=2%20union%20select%20version%28%29

Dạng Tấn Công INSERT

Bằng cách chèn các câu lệnh insert hacker có thể sử thêm vào database các thông tin không mong muốn nếu trang web thu thập thông tin không kiểm tra tính chính xác khi xác minh.

Thêm User không mong đợi

Thêm User không mong đợi

“tấn công bằng lệnh insert” thì câu lệnh truy vấn ban đầu có dạng:

INSERT INTO `sql`.`users` (`id`, `name`, `pass`) VALUES (NULL, 'test', 'test');

Nhưng nếu trong trong form add new user ta điền vào trường password dữ liệu sau:

bumbum'); INSERT INTO `sql`.`users` (`id`, `name`, `pass`) VALUES (NULL, 'aaa', 'aaa

Câu lệnh sql ban đầu sẽ có dạng:

INSERT INTO `sql`.`users` (`id`, `name`, `pass`) VALUES (NULL, 'bum bum', 'bumbum'); INSERT INTO `sql`.`users` (`id`, `name`, `pass`) VALUES (NULL, 'aaa', 'aaa');

Ta thấy rằng với câu lệnh trên mysql sẽ insert 2 user mới vào cơ sở dữ liệu:

Dạng Tấn Công STORE-PROCEDURES

Việc tấn công bằng stored-procedures sẽ gây tác hại rất lớn nếu ứng dụng được thực thi với quyền quản trị hệ thống ‘root’.

Ví dụ, nếu ta thay đoạn mã theo dạng: ‘  ;  EXEC  xp_cmdshell  ‘cmd.exe dir C: ‘.

Lúc này hệ thống sẽ thực hiện lệnh liệt kê thư mục trên ổ đĩa C:\ cài đặt server. Việc phá hoại kiểu nào tuỳ thuộc vào câu lệnh đằng sau cmd.exe.

Cách Phòng Tránh SQl Injection

Ta có thể phòng tránh các lỗi sql injection bằng hai cách:

  • Kiểm tra giá trị nhập vào: Ðể phòng tránh các nguy cơ có thể xảy ra, hãy bảo vệ các câu lệnh SQL bằng cách kiểm soát chặt chẽ tất cả các dữ liệu nhập nhận được từ đối tượng GET và POST, luôn luôn kiểm tra và xác minh các ký tự: ‘.#,–,/* */ và các từ khóa nhạy cảm như: select, insert, union, delete.
  • Thiết lập cấu hình an toàn cho hệ quản trị database: Cần có cơ chế kiểm soát chặt chẽ và giới hạn quyền xử lí dữ liệu đến tài khoản người dùng mà ứng dụng web đang sử dụng. Quyền càng bị hạn chế, thiệt hại càng ít.Ngoài ra để tránh các nguy cơ từ SQL Injection attack, nên chú ý loại bỏ bất kì thông tin kĩ thuật nào chứa trong thông điệp chuyển xuống cho nguời dùng khi ứng dụng có lỗi. Các thông báo lỗi thông thường tiết lộ các chi tiết kĩ thuật có thể cho phép hacker biết dược điểm yếu của hệ thống.
Phân quyền truy cập cho user

\Phân quyền truy cập cho user

Các ứng dụng giúp kiểm tra các lỗi SQL Injection:

HP WebInspect: là một công cụ bảo mật ứng dụng web kiểm tra tự động và cấu hình bắt các kỹ thuật hacking và tấn công trong thế giới thực, cho phép bạn phân tích triệt để các ứng dụng web phức tạp và dịch vụ trên internet cũng như nội bộ. Bằng cách cho phép bạn kiểm tra các ứng dụng web từ sự phát triển thông qua sản xuất, quản lý hiệu quả các kết quả xét nghiệm và phân phối các kiến thức an ninh trong toàn bộ tổ chức của bạn, WebInspect trao quyền cho bạn để bảo vệ các điểm nhập cảnh dễ bị tổn thương nhất.

HP WebInspect

HP WebInspect

IBM Rational AppScan: có thể tự động quét các ứng dụng trực tuyến 15 phút một lần để kiểm tra, phát hiện các lỗ hổng an ninh thường dẫn tới những cuộc tấn công trên mạng và làm hại máy tính. Phiên bản chuẩn của sản phẩm này có giá bản quyền 17.550 USD cho một năm sử dụng.
Theo báo cáo của IBM, năm ngoái hơn nửa số lượng lỗ hổng phát hiện được là từ các ứng dụng web. Flash ngày càng được sử dụng rộng rãi trên mạng, theo báo cáo trên, số lượng các lỗ lổng Flash phát hiện được đã tăng 300% trong 2 năm qua so với năm 2005 và 2006.

Adobe Flash Player có trên hơn 80% số máy tính nối mạng Internet và được sử dụng để xem 80% lượng video trên mạng.

IBM Rational AppScan

IBM Rational AppScan

Ngoài ra còn có các phần mềm khác như; HP Scrawlr, SQLiX

Ghi Chú:

            Các tool và software được sử dụng trong demo và bài viết:

About the author

Kevin Dang

Hey there! My name is Kevin Dang, I am website, software, mobile app develop, web admin system. Expert living in Hồ Chí Minh (Việt Nam). I am very interested in digital marketing with: SEO, Facebook, Google Ads ... This blog is where I will share the experiences, techniques and knowledge I have learned.