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:
| Interpreter | Cách sai | Cách đúng |
|---|---|---|
| SQL | Nối chuỗi vào câu lệnh | Tham số |
| Shell | Nối chuỗi vào dòng lệnh | Mảng đối số, không shell |
| HTML | Nối chuỗi vào markup | Encode theo ngữ cảnh |
| XML | Parser mặc định | Tắ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.
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.
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…