OS Command injection
Server Side Vul
Last updated
Server Side Vul
Last updated
Trong section này, chúng ta sẽ cùng nhau nghiên cứu về OS command injection, chúng ta sẽ xem làm sao để phát hiện và khai thác lỗ hổng , cùng giải thích một số lệnh và kỹ thuật hữu ích cho các OS khác nhau, và tóm tắt cách ngăn chặn việc đưa lệnh vào OS.
OS command injection( có thể gọi nó là shell injection) is một lỗ hổng web mà cho phép kẻ tấn công tiến hành các lệnh của OS bất kỳ trên server mà ứng dụng đang chạy và các thường làm hỏng các loại ứng dụng và data trong nó. Thông thường, kẻ tấn công có thể tận dụng lỗ hổng tiêm lệnh của hệ điều hành để xâm phạm các phần khác của cơ sở hạ tầng lưu trữ, khai thác các mối quan hệ tin cậy để xoay trục cuộc tấn công sang các hệ thống khác trong tổ chức.
Có thể sử dụng Burp suite để quét lỗ hổng này
Xem xét một ứng dụng shopping rằng cho phép người dùng có thể xem có hay không mặt hàng trong kho hay không trong một store cụ thể . Đây là thông tin được truy cập qua một URL như này:
https://insecure-website.com/stockStatus?productID=381&storeID=29
Để cung cấp thông tin kho hàng, ứng dụng phải query nhiều hệ thống kế thừa khác nhau. Do lý do trước đó, chức năng được triển khai bằng cách gọi lệnh shell với sản phẩm và lưu trữ ID dưới dạng aruments:
stockreport.pl 381 29
Lệnh này xuất ra trạng thái còn hàng cho mặt hàng đã chỉ định, được trả lại cho người dùng. Vì ứng dụng không triển khai biện pháp bảo vệ chống lại OS command injection, kẻ tấn công có thể gửi thông tin đầu vào sau để thực hiện một lệnh tùy ý:
& echo aiwefwlguh &
Nếu input này được gửi vào tham số productID
sau đó lệnh sẽ được tiến hành bởi ứng dụng
stockreport.pl & echo aiwefwlguh & 29
Lệnh echo
đơn giản là gây ra chuỗi cung cấp bị lặp lại ở output và đó là cách hữu ích để test cho môt vài loại của OS command injection. Ký &
tự là một dấu phân tách lệnh shell, và vì vậy những gì được thực thi thực sự là ba lệnh riêng biệt nối tiếp nhau. Kết quả là kết quả trả về cho người dùng là:
Ba dòng đầu ra chứng minh rằng:
Lệnh ban đầu stockreport.pl
được thực thi mà không có đối số mong đợi của nó và do đó trả về một thông báo lỗi.
Lệnh được đưa echo
vào đã được thực thi và chuỗi được cung cấp được lặp lại trong đầu ra.
Đối số ban đầu 29
được thực thi dưới dạng một lệnh, điều này gây ra lỗi.
Việc đặt dấu phân tách lệnh bổ sung &
sau lệnh được đưa vào thường hữu ích vì nó tách lệnh được tiêm ra khỏi bất kỳ thứ gì sau điểm tiêm. Điều này làm giảm khả năng những gì tiếp theo sẽ ngăn không cho lệnh được đưa vào thực thi.
Khi bạn xác định một lỗ hổng Cmd Injection, nó thực sự hữu ích để khai thác một vài câu lệnh khả dụng chứa thông tin về hệ thống của máy chủ. Đây là một vài câu lệnh được sử dụng trên hai nền tảng Linux và Windows:
Nhiều trường hợp OS Cmd Injection là lỗ hổng blinh(mù) - nó có nghĩa là ứng dụng sẽ không return lại output từ câu lệnh trong phản hồi HTTP. Lỗ hổng Blind vẫn có thể khai thác nhưng cần dụng các kỹ thuật khác nhau.
Chúng ta xem xét một trang web cho phép người dùng gửi phản hồi về trang web. Người dùng nhập địa chỉ email và thông báo phản hồi của họ. Sau đó, ứng dụng phía máy chủ sẽ tạo một email gửi tới quản trị viên trang có chứa phản hồi. Để làm điều này, nó gọi mail
chương trình với các chi tiết đã gửi. Ví dụ:
Output từ câu lệnh mail không được trả trong phản hồi của ứng dụng, vậy nếu sử dụng payload hay câu lệnh echo
cũng không có output trả về. Trong trường hợp này, bạn có thể sử dụng một loạt các kỹ thuật khác để phát hiện và khai thác lỗ hổng.
Chúng ta có thể sử dụng một injected command như là trigger một thời gian delay, nó cho phép bạn confirm rằng câu lệnh đã được thực hiện dựa trên thời gian mà ứng dụng phản hồi. Lệnh Ping là một lệnh để làm điều này vì nó cho phép bạn chỉ định số lượng gói ICMP sẽ gửi và do đó, thời gian để lệnh chạy:
Lệnh này sẽ khiến ứng dụng ping bộ điều hợp mạng loopback của nó trong 10 giây.
Chúng ta 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(root
) mà sau đó bạn 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 (serves static resources
) 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:
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 để tìm nạp https://vulnerable-website.com/whoami.txt
để truy xuất tệp và xem đầu ra từ lệnh được đưa vào.
Chúng ta 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ần với hệ thống mà bạn kiểm soát, sử dụng các kỹ thuật OAST. Ví dụ:
Payload
này sử dụng lệnh nslookup
để thực hiện tra cứu DNS cho miền được chỉ định. Kẻ tấn công có thể theo dõi quá trình tra cứu được chỉ định xảy ra 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 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:
Điều này sẽ gây ra tra cứu DNS đối với miền của kẻ tấn công có chứa kết quả của lệnh whoami
:
Note: Dấu `command`
để execute trong server máy chủ. Dễ hiểu hơn là bạn test echo `ls`
trong ubuntu sẽ rõ...
Một loạt các siêu ký tự shell có thể được sử dụng để thực hiện các cuộc tấn công tiêm lệnh hệ điều hành.
Một số ký tự hoạt động như các dấu tách lệnh, cho phép các lệnh được xâu chuỗi lại với nhau. Các trình tách lệnh sau hoạt động trên cả hệ thống dựa trên Windows và Unix:
&
&&
|
||
Các lệnh sau chỉ hoạt động trên các hệ thống dựa trên Unix:
;
Newline (0x0a
or )
Trên các hệ thống dựa trên Unix, bạn cũng có thể sử dụng backticks hoặc ký tự $
để thực hiện thực thi nội tuyến lệnh được đưa vào trong lệnh gốc:
`
injected command `
$(
injected command )
Lưu ý rằng các siêu ký tự shell khác nhau có các hành vi khác nhau một cách tinh vi có thể ảnh hưởng đến việc liệu chúng có hoạt động trong một số tình huống nhất định hay không và liệu chúng có cho phép truy xuất đầu ra lệnh trong dải hay chỉ hữu ích cho việc khai thác mù quáng hay không.
Đôi khi, đầu vào mà bạn kiểm soát xuất hiện trong dấu ngoặc kép trong lệnh ban đầu. Trong tình huống này, bạn cần chấm dứt ngữ cảnh được trích dẫn (sử dụng "
hoặc '
) trước khi sử dụng các siêu ký tự shell phù hợp để đưa vào một lệnh mới.
Nói chung đôi khi bạn phải tự debug để ra payload hoàn chỉnh có thể exploit được trang web có lỗi
Cho đến nay, cách hiệu quả nhất để ngăn chặn các lỗ hổng chèn lệnh của hệ điều hành là không bao giờ gọi các lệnh của hệ điều hành từ mã lớp ứng dụng. Trong hầu hết mọi 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ền tảng an toàn hơn.
Nếu không thể gọi ra các lệnh của hệ điều hành với đầu vào do người dùng cung cấp, thì phải thực hiện xác thực đầu vào mạnh mẽ. Một số ví dụ về xác nhận hiệu quả bao gồm:
Xác thực đối với white list các giá trị được phép.
Xác thực rằng đầu vào là một số.
Xác thực rằng đầu vào chỉ chứa các ký tự chữ và số, không có cú pháp hoặc khoảng trắng nào khác.
Không bao giờ cố gắng làm sạch đầu vào bằng cách thoát khỏi các siêu ký tự shell. Trong thực tế, điều này quá dễ xảy ra lỗi và dễ bị kẻ tấn công lành nghề vượt qua.
Cảm ơn các bạn đã đọc bài của mình, bài này dựa trên mình vừa làm lab vừa viết.