Hotline : 1800 1093 - 07 088 44444
Thích
Chia sẻ

Command Injection là gì? Những cách để ngăn chặn Command Injection

28/06/2021

Command injection là lỗ hổng cho phép các hacker thực thi các lệnh bất kỳ của hệ điều hành trên server. Bài viết này sẽ hướng dẫn rõ hơn command injection là gì và cách để ngăn chặn nó.

command injection là gì

Command Injection là gì?

Command injection là một cyber attack liên quan đến việc thực hiện các lệnh tùy ý trên hệ điều hành của host (OS). Thông thường, hacker sẽ command injection bằng cách khai thác lỗ hổng ứng dụng. Chẳng hạn như xác thực input của người dùng không chặt chẽ.

Ví dụ: hacker có thể lợi dụng việc kiểm tra input của dùng người dùng không an toàn, chẳng hạn như cookie và form để đưa lệnh vào system shell trên web server. Sau đó, hacker có thể tận dụng các đặc quyền của ứng dụng dễ bị tấn công để khai thác server.

command injection

Command injection có nhiều dạng khác nhau. Bao gồm thực hiện trực tiếp lệnh shell, đưa các file độc hại vào môi trường runtime của server và khai thác lỗ hổng trong các file config. Chẳng hạn như XXE (XML external entites).

So sánh Code Injection vs. Command Injection

Code injection là một thuật ngữ chung cho bất kỳ loại tấn công nào liên quan đến việc chèn code đã được giải mã/thực thi bởi một app. Loại tấn công này lợi dụng việc xử lý sai các dữ liệu input không đáng tin cậy. Nó có thể xảy ra do thiếu xác thực input/output thích hợp.

code injection

Hạn chế chính của các cuộc tấn công code injection là chúng bị giới hạn trong app hoặc hệ thống mà chúng nhắm vào. Nếu hacker có thể đưa PHP code vào một app và thực thi nó, thì code độc này sẽ bị giới hạn bởi chức năng PHP và các quyền được cấp cho PHP trên server.

Command injection liên quan đến việc thực thi các lệnh trong system shell hoặc các thành phần khác. Hacker mở rộng chức năng mặc định của một ứng dụng dễ bị tấn công. Khiến nó chuyển các lệnh đến system shell mà không cần đưa code độc vào. Trong trường hợp nhiều lệnh, command injection cho phép hacker kiểm soát tốt hơn hệ thống của mục tiêu.

Ví dụ về lỗ hổng Command Injection

Dưới đây là ba ví dụ về cách một lỗ hổng app có thể dẫn đến các cuộc tấn công command injection. Những ví dụ này dựa trên code do OWASP cung cấp

Ví dụ 1: File name dưới dạng Command Argument

Đây là một ví dụ về chương trình cho phép người dùng từ xa xem nội dung của một file mà không thể sửa đổi hoặc xóa nó. Chương trình này chạy với quyền root:

int main(char* argc, char** argv) {
  char cmd[CMD_MAX] = "/usr/bin/cat ";
  strcat(cmd, argv[1]);
  system(cmd);
}

Mặc dù chương trình có vẻ vô hại khi chỉ cho phép truy cập file ở chế độ read-only, nhưng nó lại hoàn toàn có thể dẫn đến tấn công command injection. Hacker có thể truyền đến một xâu như sau:

“abc.txt ;rm -rf /”

Call đến system() sẽ được thực hiện và sau đó hệ điều hành sẽ thực hiện xóa đệ quy của phân vùng root disk.

Ví dụ 2: Thao tác với biến của môi trường APPHOME

Đoạn code sau xác định thư mục cài đặt của một app nhất định bằng cách sử dụng biến của môi trường $APPHOME và chạy một lệnh trong thư mục đó.

...
char* home=getenv("APPHOME");
char* cmd=(char*)malloc(strlen(home)+strlen(INITCMD));
if (cmd) {
  strcpy(cmd,home);
  strcat(cmd,INITCMD);
  execl(cmd, NULL);
}
...

Vấn đề là code không xác thực nội dung của script đã được khởi tạo. Nếu hacker quản lý để sửa đổi biến $APPHOME thành một path khác. Với phiên bản độc hại của script, thì code này sẽ chạy một script độc hại. Điều này tạo thành một cuộc tấn công command injection.

Ví dụ 3: Thao tác với biến $PATH

Code sau có thể được sử dụng trong chương trình để thay đổi password trên server và chạy với quyền root:

system("cd /var/yp && make &> /dev/null");

Phần có vấn đề của code này là việc sử dụng make. Mặc dù hacker không thể tự thay đổi code, vì nó không chấp nhận input của người dùng, chúng có thể sửa đổi biến $PATH. Điều này có thể khiến lệnh được thực thi theo một path khác do hacker kiểm soát. Trong path folder đó, hacker có thể tạo một phiên bản độc hại của make binary.

Bởi vì chương trình gốc có quyền root, phiên bản độc hại của make bây giờ sẽ được chạy với đặc quyền root.

Điểm mấu chốt của cả ba ví dụ này là bất kỳ lệnh nào invoke hàm ở các cấp độ như system() và execute() đều cung cấp quyền root cho các chương trình khác, hoặc những lệnh chạy bên trong nó.

Những phương pháp Command Injection

những phương pháp command injection

Dưới đây là một số lỗ hổng thường dẫn đến cuộc tấn công command injection

Arbitrary command injection

Một số app có thể cho phép người dùng chạy các lệnh tùy ý và chạy các lệnh này như là một host.

Arbitrary file uploads

Nếu một app cho phép người dùng tải lên các file có phần file extension, các file này có thể bao gồm các lệnh độc hại. Trên hầu hết các web server, việc đặt các file như vậy vào webroot sẽ dẫn đến command injection.

Insecure serialization

Server-side code thường được sử dụng để giải mã dữ liệu input của người dùng. Nếu quá trình giải mã hóa được thực hiện mà không có xác minh thích hợp những dữ liệu input, nó có thể dẫn đến command injection.

Server-side template injection (SSTI)

Nhiều web app sử dụng server side template để tạo ra các phản hồi HTML. Điều này làm cho hacker có thể chèn các server-side template độc hại. SSTI xảy ra khi input của người dùng được nhúng vào mẫu theo cách không an toàn và code được thực thi từ xa trên server.

XML external entity injection (XXE)

XXE xảy ra trong các app sử dụng trình phân tích cú pháp XML được cấu hình kém. Lỗ hổng này có thể gây ra lộ dữ liệu nhạy cảm, server-side request (SSRF) hay còn gọi là giả mạo yêu cầu từ phía server hoặc các cuộc tấn công từ chối dịch vụ.

Ngăn chặn Command Injection

Dưới đây là một số phương pháp bạn có thể thực hiện để ngăn chặn command injection:

  • Tránh call system và user input – Để ngăn các hacker chèn các ký từ vào OS command.
  • Thiết lập xác thực cho input – Điều này để ngăn chặn các cuộc tấn công như XSS và SQL Injection.
  • Tạo white list các input có thể có – Để đảm bảo hệ thống chỉ chấp nhận các input đã được phê duyệt từ trước.
  • Chỉ sử dụng bảo mật API – Khi thực thi các lệnh trên hệ thống như executeFile().
  • Sử dụng executeFile() một cách an toàn – Ngăn người dùng giành quyền kiểm soát tên của chương trình.

Kết luận

Tới đây thì bạn đã biết command injection là gì và những cách ngăn chặn command injection khỏi hệ thống. Chúc bạn thành công!!!

Nếu bạn có thắc mắc hay có vấn đề cần hỗ trợ, bạn có thể liên hệ trực tiếp với Vietnix thông qua các kênh sau:
  • Hotline: 1800 1093 - 07 088 44444
  • Email: support@vietnix.vn
  • Hoặc chat trực tiếp với Vietnix thông qua biểu tượng Livechat ở góc phải màn hình. Đội ngũ chuyên viên của chúng tôi luôn sẵn sàng tư vấn và hỗ trợ bạn 24/7.
Vietnix hiện đang có chương trình khuyến mãi lớn nhất trong năm, giảm giá 50%  dịch vụ Hosting. Đăng ký dùng thử ngay và Vietnix sẽ hoàn tiền 100% nếu quý khách không hài lòng với chất lượng sản phẩm, dịch vụ!
Mình là Bo - admin của Quản Trị Linux. Mình đã có 10 năm làm việc trong mảng System, Network, Security và đã trải nghiệm qua các chứng chỉ như CCNP, CISSP, CISA, đặc biệt là chống tấn công DDoS. Gần đây mình trải nghiệm thêm Digital Marketing và đã hòan thành chứng chỉ CDMP của PersonVUE. Mình rất thích được chia sẻ và hỗ trợ cho mọi người, nhất là các bạn sinh viên. Hãy kết nối với mình nhé!
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments