(SQL Injection)

mysql Jul 15, 2021

1. SQL Injection là gì?

- SQL Injection là một kỹ thuật lợi dụng những lỗ hổng về câu truy vấn của các ứng dụng. Được thực hiện bằng cách chèn thêm một đoạn SQL để làm sai lệch đi câu truy vấn ban đầu, từ đó có thể khai thác dữ liệu từ database.

- SQL injection có thể cho phép những kẻ tấn công thực hiện các thao tác: delete, insert, update… trên cơ sở dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy. SQL injection thường được biết đến như là một vật trung gian tấn công 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​ quan hệ​ như SQL Server, MySQL, Oracle, PostgreSQL và hệ quản trị cơ sở dữ liệu phi quan hệ (NoSQL) như: MongoDB, Redis, CouchDB…
- SQL injection có thể cho phép những kẻ tấn công thực hiện các thao tác như một người quản trị web, trên cơ sở dữ liệu của ứng dụng. SQL injection là một trong những kỹ thuật hack web phổ biến nhất.

2. Cách hoạt động của SQL Injection
Giả sử bạn có một form đăng nhập có 2 input Email và Password như dưới đây:

- Các cuộc tấn công SQL Injection được thực hiện bằng cách gửi lệnh SQL độc hại đến các máy chủ cơ sở dữ liệu thông qua các yêu cầu của người dùng mà website cho phép. Bất kỳ kênh input nào cũng có thể được sử dụng để gửi các lệnh độc hại, bao gồm các thẻ <input>, chuỗi truy vấn (query strings), cookie và tệp tin.
- 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 đó. 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 trên.

- Các kết quả có thể thông báo bị tấn công:

+ 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 - Đã tải trang trống
+  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.

- 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 rằng 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ư thay 1 bằng ' or 1=1--

- Điều 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.

3. Sự nguy hiểm của SQL Injection
-  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.

- 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ọ,...

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. SQL injection có thể cho phép những kẻ tấn công thực hiện các thao tác: delete, insert, update… trên cơ sở dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy. Thực hiện các thao tác như một người quản trị web, trên cơ sở dữ liệu của ứng dụng.

Tin tặc có thể lấy tất cả dữ liệu người dùng có trong cơ sở dữ liệu như chi tiết người dùng, thông tin thẻ tín dụng, số an sinh xã hội và cũng có thể truy cập vào các khu vực được bảo vệ như cổng quản trị viên. Cũng có thể xóa dữ liệu người dùng khỏi bảng. Ngày nay, tất cả các ứng dụng mua sắm trực tuyến, giao dịch ngân hàng đều sử dụng máy chủ cơ sở dữ liệu back-end. Vì vậy, trong trường hợp tin tặc có thể khai thác SQL injection, toàn bộ máy chủ sẽ bị xâm phạm.

4. Cách giảm thiểu và phòng ngừa

-  Xác thực người dùng: Xác thực đầu vào từ người dùng bằng cách xác định trước độ dài, loại đầu vào, của trường nhập và xác thực người dùng.
- Tránh quyền quản trị. Hạn chế đặc quyền truy cập của người dùng và xác định lượng dữ liệu mà bất kỳ người ngoài nào có thể truy cập từ cơ sở dữ liệu.
Về cơ bản, người dùng không nên được cấp quyền truy cập mọi thứ trong cơ sở dữ liệu. Không sử dụng tài khoản quản trị viên hệ thống.
- Đừng bao giờ tin tưởng vào input của người dùng. Luôn kiểm tra kỹ các trường nhập dữ liệu và cần ràng buộc thật kỹ dữ liệu người dùng nhập vào. Quy tắc đầu tiên về input mà người dùng nhập là “don’t trust and verify” (không tin tưởng và cần xác minh”), có nghĩa là tất cả những gì người dùng nhập vào phải được coi là độc hại trừ khi có bằng chứng khác. Nó không chỉ dành cho các hộp nhập liệu đơn giản như các vùng văn bản mà còn cho mọi thứ khác – như input ẩn, các chuỗi tham số truy vấn, cookie và tệp tải lên.
- Dùng Regular Expression để loại bỏ đi các ký tự lạ hoặc các ký tự không phải là số.
- Mã hóa dữ liệu nhạy cảm
- Dùng các hàm có sẵn để giảm thiểu lỗi. Mỗi khi truy vấn thì mọi người nên sử dụng thêm hàm mysqli_real_escape_string để chuyển đổi một chuỗi thành một query an toàn.
- Không lưu trữ dữ liệu nhạy cảm nếu bạn không cần nó.
- Chúng ta nên dùng các Framework và hạn chế dùng code thuần tối đa nếu có thể. Framework luôn có cộng đồng hoặc các chuyên gia bảo mật giúp tìm lỗi và update liên tục, từ đó chúng ta có thể giảm bớt thời gian xử lý lỗi để tăng thời gian làm sản phẩm cũng là một điều hay.

Tham khảo bộ Test case về SQL Injection:
https://docs.google.com/spreadsheets/d/1e8tHGBkRlWJwOICyhYVC6k-Bo-pE31Xk/edit#gid=287943194

Tags

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.