A1-Lỗi tiêm nhiễm mã độc - Injection

Tìm hiểu về tiêm nhiễm mã độc(Injection)

1. A1 - Tiêm nhiễm mã độc (Injection)

Bất kì ai cũng có thể gửi các dữ liệu khác nhau đến hệ thống, như: người dùng thường, nội bộ dự án, và quản trị viên Kẽ tấn công có thể gửi những mã dạng văn bản tận dụng sơ hở trong cú pháp của trình biên dịch. Hầu như bất cứ đoạn mã nguồn nào cũng có thể mắc lỗi bao gồm cả những mã nguồn nội bộ dự án Lỗi nhúng mã có thể xảy ra khi một ứng dụng gửi những đoạn mã độc đến trình biên dịch. Lỗi này rất phổ biến đặc biệt ở những đoạn mã nguồn được sử dụng nhiều, như trong truy vấn SQL, LDAP, XPATH, các câu lệnh hệ điều hành, các tham số của chương trình v.v… Lỗi nhúng mã thường dễ phát hiện khi rà soát mã nguồn, nhưng khó phát hiện hơn khi chạy thử chương trình. Những công cụ quét kiểm tra có thể giúp kẻ tấn công tìm ra chúng. Lỗi này có thể khiến bạn mất hoặc hư hỏng hoặc không thể kiểm tra hay truy cập đến dữ liệu. Nặng hơn nó có thể dẫn đến toàn bộ hệ thống bị chiếm quyền Ta cần cân nhắc đến giá trị của những dữ liệu bị ảnh hưởng và các nền tảng đang chạy trình biên dịch. Tất cả dữ liệu có thể bị đánh cắp hoặc hủy hoại. Điều này ảnh hưởng rất nghiêm trọng tới các dự án của bạn!

Tôi có có thể bị mắc lỗi tiêm nhiễm mã độc không ?

Cách tốt nhất để kiểm tra xem ứng dụng có mắc lỗi hay không là xác minh nếu tất cả các dữ liện đầu vào của trình biên dịch có thể phân biệt rõ ràng giữa mã độc và câu truy vấn hay câu lệnh. Ví dụ như trong truy vấn SQL, ta cần phải sử dụng tất cả những biến số trong những câu lệnh được chuẩn bị hay những thủ tục được lưu trữ, tránh sử dụng những câu truy vấn động. Kiểm tra mã nguồn có thể là cách nhanh và chính xác để xác định nếu ứng dụng có an toàn hay không. Những công cụ phân tích mã nguồn có thể giúp nhân viên bảo mật hiểu được trình biên dịch và luồng dữ liệu đi trong ứng dụng. Những chuyên viên thâm nhập có thể xác thực những vấn đề tìm ra bằng cách tạo những chương trình thâm nhập thử vào hệ thống Chương trình quét tự động có thể đưa ra những thông tin sâu sắc nếu chương trình của bạn thực sự mắc lỗi nhúng mã. Máy quét không thể luôn kiểm tra được trình biên dịch và khó biết chắc chắn nếu có một phương thức tấn công thành công. Những phần xử lý lỗi có thể giúp tìm ra lỗ hổng dể dàng hơn

Làm cách nào để tôi có thể ngăn chặn tiêm nhiễm mã độc

Để ngăn chặn cần phải phân biệt được mã độc và câu lệnh hay truy vấn

  1. Tùy chọn thường được dùng là sử dụng một thư viên API an toàn, nó giúp bạn tránh việc sử dụng trình biên dịch một cách trực tiếp và cung cấp một giao diện phân tách tham số. Cần cẩn thận với APIs, như thủ tục lưu trữ dù đã phân tách tham số nhưng lỗi nhúng mã vẫn có thể xảy ra ở bên trong
  2. Nếu không có những thư viện phân tách tham số, bạn có thể cẩn thận loại bỏ những kí tự đặc biệt bằng những công cụ của trình biên dịch đó. OWASP’s ESAPI có cung cấp thông tin về những công cụ đó.
  3. Chúng tôi khuyến khích kiểm tra những dữ liệu đầu vào hợp lệ bằng các từ điển tiêu chuẩn {canonicalization} phù hợp. Đây vẫn chưa phải là cách phòng thủ an toàn nhất vì nhiều ứng dụng sử dụng những ký tự đặc biệt trong các thông tin đầu vào. OWASP’s ESAPI cũng cung cấp 1 danh sách rất nhiều những thư viện công cụ để kiểm tra dữ liệu đầu vào hợp lệ

Ví dụ về kịch bản tấn công

Trên các ứng dụng web, các trang web thường có các ô textbox(login, logout, comment … ) để người dùng nhập vào thông tin nào đó, sau đó là một chuỗi xử lí rất dài (thông thường là SQL) trên Server để trả về kết quả cho người dùng.Thông qua các thông tin này, ứng dụng đó có thể biết người dùng đó là ai, họ cần gì ở ứng dụng, và phải phục vụ họ như thế nào. Tuy nhiên, không phải trình biên dịch mã nào cũng hoàn hảo, đôi khi có những lỗi từ trình biên dịch đó. Lợi dụng lỗi từ trình biên dịch, kẻ tấn công có thể chèn vào textbox các đoạn mã độc, thay vì một câu comment đơn thuần chẳng hạn, để cho trình biên dịch trên server xử lí

Trên server, câu lệnh xử lí SQL với dữ liệu đầu vào từ một textbox như sau:

String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") +"'";

Exec(query);

Câu lệnh trên đơn thuần chỉ là đưa ra các thông tin về tài khoản của một người dùng với mã là id Tuy nhiên kẻ tấn công có thể thay thế tham số ‘id’ cần nhập vào bằng chuỗi sau:

‘ or ‘1’=’1.

Câu lệnh truy vấn trên server trở thành:

String query = "SELECT * FROM accounts WHEREcustID='" + request.getParameter("‘ or ‘1’=’1") +"'";
Exec(query);

Việc này thay đổi ý nghĩa của câu truy vấn là trả ra giá trị của tất cả các tài khoản trong cơ sở dữ liệu thay vì chỉ của 1 nhân viên mà thôi

Trong trường hợp xấu nhất,thông qua các thông tin từ việc đánh cắp thông tin cá nhân của bất cứ ai này kẻ tấn công có thể sử dụng điểm yếu này để thực thi những thủ tục lưu trữ trong cơ sở dữ liệu và giúp hắn chiếm quyền điều khiển cơ sở dữ liệu hoặc toàn bộ máy chủ