Giới thiệu

Trong những năm 2005 – 2007, tin tặc người Mỹ – Albert Gonzalez và đồng bọn đã bị cáo buộc về việc đánh cắp thông tin của hon 170 triệu thẻ tín dụng. Với kỹ thuật SQL Injection, những tên tin tặc này đã dễ dàng có được thông tin của những chiếc thẻ tín dụng kia. Vậy thì hôm nay mọi người hãy cùng mình khám phá lỗi bảo mật này nhé!

SQL Injection là gì?

Theo wikipedia: SQL injection là một kỹ thuật cho phép những kẻ tấn công 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 và các thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành các câu lệnh SQL bất hợp pháp. 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, v.v. 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 như SQL Server, MySQL, Oracle, DB2, Sysbase…

Khai thác lỗi SQL Injection

Đầu tiên hãy bắt đầu với việc đăng nhập thử vào 1 trang web
Hình 1
Hình 1
Hmmm, có vẻ như chúng ta không truy cập được do sai mật khẩu rồi nhỉ. Vậy mình thử nghịch ngợm tí xem sao <(“) . Đầu tiên mình sẽ thêm ký tự nháy vào sau mật khẩu: password’ .
Hình 2
Hình 2
Tự nhiên mình thấy một hiện tượng lạ =)))
Thứ nhất: mình thấy giao diện của mình bổng nhiên nhấp nháy sau khi mình nhấn enter
Thứ hai: mình đọc thấy báo lỗi kỳ lạ ở khung kết quả.
Hình 3
Hình 3
Chương trình báo lỗi rằng Syntax Error: unterminated quoted string.
=> Sau khi kiểm tra các hiện tượng lạ đó mình thấy rằng việc xuất phát điểm của nó là do việc lập trình thiếu an toàn và có thể khai thác lỗ hỏng SQL Injection.
Hãy khai thác thử lỗ hỏng này xem như thế nào!
Mình vẫn sẽ giữ tài khoản như ban đầu nhưng lúc này mình nhập ở khung mật khẩu là: ‘ or 1=1—.
Hình 4
Hình 4
Với cách này mình đã truy cập thành công vào tài khoản trên.
Hình 5
Hình 5
Ngoài ra còn một số lệnh khác các bạn có thể tham khảo thêm tại đây: (bỏ dấu ngoặc để xem)
github(.)com/xmendez/wfuzz/blob/master/wordlist/Injections/SQL.txt
Lỗi này cực kỳ nguy hiểm! Những tên tin tặc có thể kết hợp thêm một số câu lệnh khác để chiếm đoạt được nhiều tài khoản cùng một lúc như cách mà tên Albert Gonlalez đã làm. Với hành vi của mình hắn đã phải “nhận 20 cuốn lịch” cho hành vi của mình – bản án nặng nhất tại thời điểm đó dành cho một hacker.

Như vậy làm sao để phòng chống được mối đe dọa này?

1/ Tham số hóa câu lệnh

Các ngôn ngữ lập trình khi làm việc sẽ giao tiếp với CSDL bằng cách sử dụng các trình điều khiển CSDL. Các trình điều khiển này cho phép ứng dụng xây dựng và chạy các câu lệnh SQL trên dựa trên CSDL, được trích xuất và thao tác dữ liệu khi cần thiết. Lúc này việc tham số hóa các câu lệnh đảm bảo rằng các giá trị đầu vào được truyền vào các câu lệnh theo 1 cách an toàn hơn.
Hãy tham khảo thử hai đoạn code sau đây:
Một đoạn code an toàn:
Hình 6
Hình 6
Một đoạn code nguy hiểm:
Hình 7
Hình 7
Sự khác biệt chính là dữ liệu được kết hợp thêm phương thức executeQuery(). Trong trường hợp đầu tiên ta có dễ dàng nhận thấy được chuỗi đã được tham số hóa và các chuỗi này được chuyển đến một “khu vực” riêng biệt, cho phép “điều khiển” một cách chính xác. Trong trường hợp thứ 2, câu lệnh SQL được thiết lập trước khi trình điều khiển được gọi, như vậy chúng có thể bị tấn công. Như vậy việc tham số hóa câu lệnh giúp câu lệnh được chuyển đổi theo dạng tham số giúp cho việc bảo mật trở nên an toàn hơn.

2/ Phương pháp ORM

Bằng cách sử dụng phương pháp ORM, người lập trình sẽ tránh việc phải viết những câu lệnh SQL như vậy giúp cho việc bảo mật được cải thiện hơn.
Hãy so sánh 2 đoạn code ở Hình 8 và Hình 9
Hình 8
Hình 8
Hình 9
Hình 9

3/ “Thoát khỏi ký tự đặc biệt”

Bằng cách hạn chế các ký tự đặc biệt (như nháy ‘ hay ngoặc kép “) khi nhập liệu vào sẽ có thể hạn chế được phần nào đó việc bị SQL injection. Nhưng cách này có một số hạn chế nhất định như việc phải hạn chế được tất cả ký tự đặc biệt trong câu lệnh được xây dựng và đôi lúc cuộc tấn công không chỉ dựa trên những ký tự đặc biệt mà còn một số trường hợp đặc biệt.

4/ Lọc đầu vào

Kiểm tra xem các thông tin được nhập vào như địa chỉ email có khớp với một biểu thức bình thường hay không.
Đảm bảo rằng các ký tự bao gồm số và chữ không chứa các ký tự đặc biệt.
Từ chối hoặc loại bỏ khoảng trắng và các ký tự xuống dòng nếu chúng không phù hợp.
Xác thực phía máy khách để cung cấp cho người dùng phản hồi ngay lập tức khi điền vào biểu mẫu, nhưng không có khả năng bảo vệ chống lại một tin tặc nghiêm trọng. Hầu hết các vụ hack được thực hiện bằng cách sử dụng các tập lệnh, thay vì chính trình duyệt.
Hình 10
Hình 10

5/ Phân quyền truy cập

Khi lập trình cần phải đảm bảo rằng việc phân quyền cho người sử dụng chỉ ở hạn mức nào đó tránh việc phân quyền quá nhiều, khi đó hacker có thể sử dụng việc phân quyền đó để tấn công CSDL

6/ “Băm” mật khẩu

Ví dụ về vụ hack dựa trên thực tế là mật khẩu được lưu trữ dưới dạng văn bản thuần túy trong CSDL. Trên thực tế, việc lưu trữ mật khẩu không được mã hóa là một lỗ hổng bảo mật lớn. Các lập trình viên nên viết ứng dụng được lưu trữ mật khẩu người dùng dưới dạng mã băm mạnh, một chiều, tốt nhất là dạng “salted”. Điều này giảm thiểu nguy cơ bị kẻ xấu đánh cắp thông tin đăng nhập hoặc mạo danh người dùng khác.

7/ Xác thực bên thứ 3

Lưu ý cuối cùng, bạn nên xem xét việc thuê ngoài (bên thứ 3) toàn bộ quy trình xác thực của ứng dụng. Facebook, Twitter và Google đều cung cấp các API Oauth hoàn thiện, có thể được sử dụng để cho phép người dùng đăng nhập vào trang web của bạn bằng tài khoản hiện có của họ trên các hệ thống đó. Điều này giúp bạn với tư cách là nhà phát triển ứng dụng tránh khỏi việc triển khai xác thực của riêng bạn và đảm bảo với người dùng của bạn rằng mật khẩu của họ chỉ được lưu trữ ở một vị trí duy nhất.

Nguồn tham khảo:

Wikipedia
Hacksplaining

Tác giả

Do kiến thức còn hạn chế và việc mình viết bài viết với tinh thần đóng góp và xây dựng kiến thức, mong nhận được sự đóng góp từ mọi người.
Võ Anh Kiệt – ATTN2020 - anhkiet1227