SQL Injection là gì? Tác hại và cách khắc phục
Mục tiêu của người tester khi kiểm thử một website hay một hệ thống là đảm bảo sản phẩm được kiểm thử đó được bảo vệ nhiều nhất có thể. Kiểm thử về chức năng bảo mật thường được thực hiện cho mục đích này. Để thực hiện loại thử nghiệm này chúng ta cần phải xem xét những cuộc tấn công nào có khả năng xảy ra nhất. Và SQL Injection là một trong những cuộc tấn công đó. Bizfly Cloud sẽ chia sẻ tác hại và cách khắc phục SQL Injection qua bài viết này nhé!
1. SQL Injection là gì?
Giống như tên của nó, mục đích tấn công của SQL injection là inject các mã độc hại. Mỗi và tất cả các trường của một website như một cổng vào cơ sở dữ liệu. Ví dụ, trong form đăng nhập, người dùng nhập dữ liệu, trong trường tìm kiếm người dùng nhập văn bản tìm kiếm, trong biểu mẫu lưu dữ liệu, người dùng nhập dữ liệu cần lưu. Tất cả các dữ liệu được chỉ định này đều đi vào cơ sở dữ liệu.
Thay vì nhập dữ liệu đúng, chúng ta nhập vào một vài mã độc hại, sau đó xem xét khả năng xảy ra những ảnh hưởng nghiêm trọng đối với cơ sở dữ liệu và toàn bộ hệ thống. SQL Injection được thực hiện với ngôn ngữ lập trình SQL. SQL (Structured Query Language) được sử dụng để quản lý dữ liệu được lưu trữ trong toàn bộ cơ sở dữ liệu.
Một ứng dụng được thử nghiệm có giao diện chấp nhận đầu vào của người dùng, được sử dụng để thực hiện các tác vụ sau:
(1) Hiển thị dữ liệu được lưu trữ có liên quan cho người dùng
Ví dụ ứng dụng kiểm tra thông tin đăng nhập của người dùng bằng thông tin đăng nhập do người dùng nhập và chỉ hiển thị các chức năng và dữ liệu có liên quan cho người dùng.
(2) Lưu dữ liệu do người dùng nhập vào cơ sở dữ liệu
Ví dụ khi người dùng điền vào một biểu mẫu và gửi nó đi, ứng dụng sẽ tiến hành lưu dữ liệu vào cơ sở dữ liệu, dữ liệu này sau đó được cung cấp cho người dùng trong cùng một phiên cũng như trong các phiên tiếp theo.
2. Truy vấn SQL là gì?
SQL là một ngôn ngữ đã được tiêu chuẩn hóa được sử dụng để truy cập và thao tác cơ sở dữ liệu để xây dựng các khung nhìn dữ liệu tùy biến cho mỗi người dùng. Các truy vấn SQL được sử dụng để thực hiện các lệnh, chẳng hạn như truy xuất dữ liệu, cập nhật và xóa bản ghi. Mỗi một phần tử SQL khác nhau triển khai các tác vụ này, ví dụ: truy vấn bằng cách sử dụng câu lệnh SELECT để truy xuất dữ liệu, dựa trên các tham số do người dùng cung cấp.
Truy vấn cơ sở dữ liệu SQL điển hình của eStore có thể trông giống như sau:
SELECT ItemName, ItemDescription FROM Item WHERE ItemNumber = ItemNumber
Đầu vào do người dùng cung cấp http://www.estore.com/items/items.asp?itemid=999 sau đó có thể tạo truy vấn SQL sau:
sql_query= " SELECT ItemName, ItemDescription FROM Item WHERE ItemNumber = " & Request.QueryString("ItemID")
Từ đó, ứng dụng web xây dựng một truy vấn chuỗi được gửi đến cơ sở dữ liệu dưới dạng một câu lệnh SQL đơn:
SELECT ItemName, ItemDescription FROM Item WHERE ItemNumber = 999
Như bạn có thể thu thập từ cú pháp, truy vấn này cung cấp tên và mô tả cho mục số 999.
3. Sự nguy hiểm của SQL Injection
- Hack tài khoản cá nhân của người khác.
- Ăn cắp hoặc sao chép dữ liệu của trang web hoặc hệ thống.
- Thay đổi dữ liệu nhạy cảm của hệ thống.
- Xóa dữ liệu nhạy cảm và quan trọng của hệ thống.
- Người dùng có thể đăng nhập vào ứng dụng với tư cách người dùng khác, ngay cả với tư cách quản trị viên.
- Người dùng có thể xem thông tin cá nhân thuộc về những người dùng khác, ví dụ chi tiết hồ sơ của người dùng khác, chi tiết giao dịch của họ,...
- Người dùng có thể sửa đổi cấu trúc của cơ sở dữ liệu, thậm chí xóa các bảng trong cơ sở dữ liệu ứng dụng.
- Người dùng có thể kiểm soát máy chủ cơ sở dữ liệu và thực thi lệnh theo ý muốn.
Bản chất của cuộc tấn công này:
Như đã đề cập trước đó, bản chất của cuộc tấn công này nhằm hack cơ sở dữ liệu với mục đích không tốt. Đầu tiên, bạn cần tìm các phần của hệ thống dễ bị tấn công và sau đó gửi mã SQL độc hại qua chúng tới cơ sở dữ liệu. Nếu loại tấn công này khả thi cho hệ thống, mã SQL độc hại thích hợp sẽ được gửi và các hành động có hại có thể được thực hiện trong cơ sở dữ liệu.
4. Cách phát hiện lỗi sql injection
Việc kiểm tra lỗ hổng này có thể được thực hiện rất dễ dàng. Đôi khi ta chỉ cần nhập ký hiệu ‘ hoặc “ vào các trường được kiểm tra. Nếu nó trả về bất kỳ thông báo bất ngờ hoặc bất thường, thì ta có thể chắc chắn rằng SQL Injection khả thi cho trường đó.
Ví dụ: Nếu nhận được thông báo lỗi như “Internal Server Error” làm kết quả tìm kiếm, thì ta có thể chắc chắn rằng cuộc tấn công này có thể xảy ra trong phần đó của hệ thống.
Các kết quả khác, có thể thông báo tấn công bao gồm:
- Blank page loaded.
- No error or success messages – chức năng và trang không phản ứng với đầu vào
- Success message for malicious code -thông báo thành công với mã độc hại
Giả sử: Kiểm tra cửa sổ đăng nhập có dễ bị tấn công đối với SQL Injection hay không. Trong trường địa chỉ email hoặc mật khẩu, ta gõ ký hiệu ' như hình dưới đây.
Nếu đầu vào như vậy trả về kết quả như thông báo lỗi “ ‘Internal Server Error” hoặc bất kỳ kết quả không phù hợp được liệt kê nào khác, thì chúng ta gần như có thể chắc chắn rằng cuộc tấn công này có thể xảy ra cho trường đó.
Do đó việc kiểm tra SQL Injection với ký hiệu ' là một cách đáng tin cậy để kiểm tra xem cuộc tấn công này có khả thi hay không.
Nếu ký hiệu ' không trả lại bất kỳ kết quả không phù hợp nào, thì ta có thể thử nhập các ký hiệu khác như " để kiểm tra kết quả.
Một số loại dữ liệu khác mà cũng nên thử submit để biết xem trang web có gặp lỗi hay không như:
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a
Việc kiểm tra tấn công SQL có thể cũng có thể được thực hiện từ link url của trang. Giả sử ta có một website có link sau: http://www.testing.com/books=1. Trong trường hợp này books là một tham số và 1 là giá trị. Nếu trong link trên, ta sẽ sửa ký hiệu ' thay vì 1, sau đó kiểm tra injection.
Trong trường hợp này nếu link http://www.testing.com/books= trả về thông báo lỗi như Internal Server Error hoặc blank page hoặc các thông báo lỗi không mong muốn.
Ta có thể chắn chắn trang web đã bị tấn công SQL injection. Sau đó, ta có thể gửi mã SQL phức tạp hơn thông qua liên kết của trang web. Ví dụ như hình sau đây:
5. Các phần dễ bị tấn công
Các phần dễ bị tấn công bao gồm:
- Trường đăng nhập (Login fields)
- Trường tìm kiếm (Search fields)
- Trường nhận xét (Comment fields)
- Bất kì trường lưu hoặc trường đầu vào của dữ liệu (Any other data entry and saving fields)
- Liên kết của website (Website's links)
Cần lưu ý là trong khi thử nghiệm chống lại tấn công này là không thể chỉ kiểm tra một hoặc một vài trường bởi vì một trường có thể được bảo vệ chống lại SQL Injection, nhưng một trường khác thì không. Do đó, điều quan trọng là đừng quên kiểm tra tất cả các trường của trang web.
6. Ví dụ về SQL Injection
Một kẻ tấn công sẽ có nhu cầu thực thi SQL injection để điều khiển truy vấn SQL chuẩn nhằm khai thác các lỗ hổng đầu vào không được xác thực trong cơ sở dữ liệu. Có nhiều cách mà phương pháp tấn công này có thể được thực hiện, một vài cách trong số đó sẽ được hiển thị dưới đây để cung cấp cho bạn một định hình chung về cách thức hoạt động của SQLI.
Ví dụ, đầu vào như đã đề cập ở trên lấy thông tin cho một sản phẩm cụ thể, có thể được thay đổi để đọc http://www.estore.com/items/items.asp?itemid=999 hoặc 1 = 1.
Kết quả là, truy vấn SQL tương ứng trông giống như sau:
SELECT ItemName, ItemDescription FROM Items WHERE ItemNumber = 999 OR 1=1
Kẻ tấn công cũng có thể tận dụng các ký tự được lọc sai để thay đổi các lệnh SQL, bao gồm cả việc sử dụng một dấu chấm phẩy để phân tách hai trường.Và vì câu lệnh 1 = 1 luôn đúng, truy vấn trả về tất cả tên sản phẩm và mô tả trong cơ sở dữ liệu, dù vậy bạn có thể không đủ điều kiện để truy cập.
Ví dụ: đầu vào này http://www.estore.com/items/iteams.asp?itemid=999; Người dùng DROP TABLE sẽ tạo truy vấn SQL sau:
SELECT ItemName, ItemDescription FROM Items WHERE ItemNumber = 999; DROP TABLE USERS
Một cách khác nữa là truy vấn SQL có thể được thao tác với câu lệnh SELECT UNION. Điều này kết hợp hai truy vấn SELECT không liên quan để lấy dữ liệu từ các bảng cơ sở dữ liệu khác nhau.Kết quả là, toàn bộ cơ sở dữ liệu người dùng có thể bị xóa.
Ví dụ: đầu vào http://www.estore.com/items/items.asp?itemid=999 người dùng UNION SELECT, mật khẩu FROM USERS tạo truy vấn SQL như sau:
SELECT ItemName, ItemDescription FROM Items WHERE ItemID = '999' UNION SELECT Username, Password FROM Users;
7. Cách giảm thiểu và phòng ngừa SQL Injection
Có một số cách hiệu quả để ngăn chặn cũng như bảo vệ chống lại các cuộc tấn công SQL Injection diễn ra.
Bước đầu tiên là xác thực đầu vào (a.k.a. sanitization), đó là thực hành viết mã có thể xác định đầu vào người dùng bất hợp pháp.
Mặc dù xác nhận đầu vào luôn luôn được coi là bước thực hành tốt nhất, nhưng hiếm khi là một giải pháp dễ dàng. Thực tế là, trong hầu hết các trường hợp, sẽ không khả thi để vạch ra tất cả các đầu vào hợp pháp và bất hợp pháp - ít nhất là không gây ra một số lượng lớn các lỗi sai xác thực gây cản trở đến trải nghiệm người dùng và chức năng của ứng dụng.
Chính bởi lý do này, một tường lửa ứng dụng web (WAF) thường được sử dụng để lọc ra SQL Injection, cũng như các mối đe dọa trực tuyến khác. Để làm được điều đó, một WAF thường dựa vào một danh sách lớn, và cập nhật liên tục - danh sách các chữ ký được chế tạo tỉ mỉ, cho phép nó giải quyết triệt để các truy vấn SQL độc hại. Thông thường, danh sách này chứa chữ ký là chìa khóa để giải quyết các phương thức tấn công cụ thể và thường xuyên được vá để đưa vào các quy tắc chặn cho các lỗ hổng mới được phát hiện.
Tường lửa ứng dụng web hiện đại còn được tích hợp với các giải pháp bảo mật khác. Từ đó, một WAF có thể nhận thêm thông tin để tăng thêm khả năng bảo mật.
Ví dụ, một tường lửa ứng dụng web gặp phải sự nguy hiểm, nhưng không hoàn toàn độc hại, đầu vào có thể được kiểm chứng chéo với dữ liệu IP trước khi quyết định chặn yêu cầu. Nó chỉ chặn đầu vào nếu bản thân IP có "lịch sử danh tiếng" không tốt.
Tài liệu tham khảo:
https://www.softwaretestinghelp.com/sql-injection-how-to-test-application-for-sql-injection-attacks/
http://www.securiteam.com/securityreviews/5DP0N1P76E.html
Theo Bizfly Cloud chia sẻ
>> Có thể bạn quan tâm: 5 loại tấn công nguy hiểm nhằm vào Website và Server của bạn
Bizfly Cloud là nhà cung cấp dịch vụ điện toán đám mây với chi phí thấp, được vận hành bởi VCCorp.
Bizfly Cloud là một trong 4 doanh nghiệp nòng cốt trong "Chiến dịch thúc đẩy chuyển đổi số bằng công nghệ điện toán đám mây Việt Nam" của Bộ TT&TT; đáp ứng đầy đủ toàn bộ tiêu chí, chỉ tiêu kỹ thuật của nền tảng điện toán đám mây phục vụ Chính phủ điện tử/chính quyền điện tử.
Độc giả quan tâm đến các giải pháp của Bizfly Cloud có thể truy cập tại đây.
DÙNG THỬ MIỄN PHÍ và NHẬN ƯU ĐÃI 3 THÁNG tại: Manage.bizflycloud