SecLab
Injection & Output EncodingwalkthroughĐộ khó 3/524 phút

Command injection: đừng đi qua shell

Mục tiêu: Sau bài này bạn gọi được một chương trình ngoài mà không có shell nào ở giữa, và biết vì sao escape shell là ngõ cụt.

V1CWE-78A05:2025command-injection
Bước 1 / 5 · read5 phút

Shell là một interpreter bạn không cần

Command injection có một tính chất khiến nó nghiêm trọng hơn mọi loại injection khác: nó không giới hạn ở một hệ thống con. SQL injection cho kẻ tấn công quyền của tài khoản cơ sở dữ liệu. Command injection cho họ quyền của tiến trình ứng dụng — nghĩa là đọc mọi file nó đọc được, gọi mọi API nó gọi được, và mở một kết nối ra ngoài.

Nhưng bài này không phải về mức nghiêm trọng, mà về một điều đơn giản hơn: trong hầu hết mọi trường hợp, bạn không cần shell.

Khi bạn viết Process.Start("bash", $"-c \"convert {file} out.png\""), bạn đang làm hai việc: gọi convert, và khởi động một bộ thông dịch đầy đủ để nó phân tích chuỗi lệnh trước. Việc thứ hai là việc bạn không cần và là việc tạo ra lỗ hổng. Shell là thứ hiểu ;, |, &&, $(...), ` `, >, *` — và mỗi ký tự đó là một đường thoát ra.

Nếu bạn gọi trực tiếp convert với một mảng đối số, không có shell nào tồn tại, nên không có ký tự nào mang ý nghĩa đặc biệt. ; rm -rf / trở thành một tên file rất lạ, và convert báo không tìm thấy file đó.

Đây là cùng một nguyên tắc với tham số hoá SQL, và nó đáng được nói ra rõ ràng vì nó lặp lại ở mọi interpreter:

InterpreterCách saiCách đúng
SQLNối chuỗi vào câu lệnhTham số
ShellNối chuỗi vào dòng lệnhMảng đối số, không shell
HTMLNối chuỗi vào markupEncode theo ngữ cảnh
XMLParser mặc địnhTắt external entity

Vì sao escape shell là ngõ cụt, dù có thư viện làm việc đó: bạn phải escape đúng cho shell nào? bash, sh, cmd.exe và PowerShell có bốn bộ quy tắc khác nhau, và cmd.exe thì nổi tiếng là không thể escape đúng trong mọi trường hợp. Bỏ shell đi thì câu hỏi đó không tồn tại.

Xem lộ trình

Bình luận

Tham gia thảo luận
Đăng ký để bình luận

Bình luận cần tài khoản đã hoàn thành ít nhất một bài học. Điều kiện đó là thứ giữ cho luồng thảo luận này còn đáng đọc: mỗi ý kiến gắn với một người có thể bị hỏi lại, và reputation tích luỹ theo thời gian.

Đăng kýĐăng nhập

Bạn vẫn đọc được toàn bộ bình luận dưới đây mà không cần tài khoản. Đăng nhập xong bạn sẽ quay lại đúng chỗ này, không phải đầu trang.

Đang tải bình luận…