Sevastopol

Moderator
Thành viên BQT
16/07/2025
0
1 bài viết
Tôi đã thấy một form góp ý biến thành công cụ gửi spam như thế nào?
Tôi còn nhớ một lần nhận được báo cáo về lỗ hổng từ một chương trình săn lỗi bảo mật. Một chuyên gia gửi cho chúng tôi thông tin rằng anh ta có thể gửi email giả mạo từ… chính tên miền của một trang thương mại điện tử lớn. Chuyện nghe có vẻ khó tin nhưng đó là sự thật.

Anh ấy không hề xâm nhập vào hệ thống hay vượt qua bất kỳ cơ chế xác thực nào. Tất cả chỉ bắt đầu từ một biểu mẫu “Góp ý khách hàng” rất đơn giản trên website.

1752720546239.png

“Gửi góp ý” hay “gửi cả nghìn email giả mạo”?​

Trang web cho phép người dùng điền tên, email và nội dung góp ý, sau đó hệ thống sẽ gửi email đó đến bộ phận chăm sóc khách hàng. Như thường lệ, họ lấy dữ liệu từ người dùng và nhét thẳng vào hàm mail() của PHP.

Nghe quen nhỉ? Rất nhiều hệ thống hiện nay vẫn hoạt động kiểu đó. Chỉ có điều, kẻ tấn công không điền email thật. Họ điền thế này:

Và thế là... hệ thống nghĩ rằng họ chỉ gửi email từ [email protected]. Nhưng thật ra, tiêu đề email đã bị chèn thêm một dòng:

Đây chính là SMTP Injection - một kỹ thuật cho phép chèn lệnh hoặc tiêu đề SMTP vào email, thường qua ký tự xuống dòng như %0A hay %0D. Và chỉ bằng cách đó, kẻ tấn công có thể gửi email giả danh, gửi hàng loạt spam, thậm chí tạo cả chiến dịch phishing trông như đến từ công ty thật.

SMTP Injection là gì thế?​

SMTP Injection xảy ra khi dữ liệu đầu vào của người dùng (như email, tên, tiêu đề) được sử dụng trực tiếp để tạo tiêu đề thư điện tử mà không có bước kiểm tra hoặc lọc.

Điều này có thể khiến email của bạn bị "nhiễm độc" - người gửi, người nhận, tiêu đề đều có thể bị điều khiển.

Hệ quả?
  • Kẻ xấu có thể gửi email giả danh từ hệ thống của bạn
  • Tên miền của bạn có thể bị liệt vào danh sách đen
  • Tỷ lệ gửi email thật tới khách hàng sẽ tụt thê thảm
  • Và tất nhiên, uy tín doanh nghiệp sẽ không cánh mà bay

Những nơi dễ "vỡ trận"​

SMTP Injection không xuất hiện ở những nơi bạn nghĩ là "nguy hiểm". Nó thường nằm ở các biểu mẫu tưởng chừng vô hại như:
  • Liên hệ chúng tôi
  • Phản hồi khách hàng
  • Đăng ký nhận bản tin
  • Gửi lại mật khẩu
  • Xác nhận email đăng ký
Nguyên nhân gốc rễ thường là vì: Dữ liệu người dùng được chèn thẳng vào header email mà không qua bất kỳ cơ chế kiểm soát nào.

Câu chuyện với PHP - Một sai lầm kinh điển​

1752661293052.png

Chỉ với một đoạn mã đơn giản thế này, một kẻ xấu có thể chèn hàng loạt địa chỉ người nhận hoặc giả mạo tiêu đề, chỉ bằng vài ký tự xuống dòng.

Ví dụ:

Tất cả đều được máy chủ của bạn “gật đầu” và gửi đi. Đáng sợ nhể?

Công cụ phát hiện và kiểm tra SMTP Injection​

Nếu bạn muốn kiểm tra hệ thống của mình có bị lỗ hổng không, hãy thử:
  • Burp Suite: chỉnh sửa yêu cầu HTTP và chèn payload
  • OWASP ZAP: quét và fuzz input
  • WFuzz: fuzz trực tiếp vào header
  • Python + smtplib: viết script kiểm tra tùy chỉnh
  • Mailtrap.io: môi trường giả lập gửi mail an toàn

Cách ngăn chặn SMTP Injection: Không phức tạp nhưng cần kỷ luật​

1. Làm sạch dữ liệu​

Không bao giờ được tin tưởng dữ liệu người dùng. Cần loại bỏ các ký tự như \n, \r, %0A, %0D và luôn xác thực email bằng PHP:

1752661317433.png

2. Dùng thư viện gửi Mail chuyên nghiệp​

Thay vì tự tạo header, hãy để những thư viện như PHPMailer, SendGrid, Mailgun hoặc SMTP2GO làm việc đó để xử lý tình huống này một cách an toàn.

3. Không chèn dữ liệu người dùng vào Header​

Tuyệt đối tránh:
1752661337441.png

Thay vào đó dùng một địa chỉ cố định để gửi và đưa email người dùng vào phần nội dung nếu cần thiết.

Checklist tham khảo nhanh cho chuyên gia bảo mật​


Hạng mục​
Mục tiêu​
Header Injection​
Chèn ký tự xuống dòng vào input​
Giả mạo Header​
Kiểm tra khả năng tạo tiêu đề giả​
Payload Fuzzing​
Dùng chuỗi đặc biệt kiểm thử​
Gửi mail hàng loạt​
Xem hệ thống có gửi nhiều người nhận không​
Phân tích phản hồi​
Kiểm tra log và phản hồi máy chủ​

Một cái form nhỏ dẫn đến một hố sâu lớn​

Câu chuyện về trang thương mại điện tử kia không phải là duy nhất. Chúng tôi đã gặp rất nhiều trường hợp tương tự, chỉ khác nhau ở mức độ thiệt hại.

Điều đáng sợ là SMTP Injection không gây crash, không hiện lỗi, không cảnh báo. Nó cứ âm thầm… rồi một ngày bạn nhận ra, email công ty toàn bị đưa vào spam, khách hàng không nhận được thông báo và tên miền bị đưa vào blacklist.

Lúc đó, có khi bạn đã mất đi nhiều hơn là một địa chỉ email.

Hãy nhìn lại những đoạn mã đang gửi email trong hệ thống của bạn. Nếu có bất kỳ chỗ nào sử dụng dữ liệu người dùng cho From, To, Cc, Subject mà không kiểm tra, đừng chờ đến khi một người ngoài phát hiện ra hộ bạn.

Tham khảo Hack Training
 
Chỉnh sửa lần cuối bởi người điều hành:
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Thẻ
biểu mẫu phản hồi chèn tiêu đề smtp danh sách đen giả mạo email gửi spam lỗ hổng bảo mật lọc dữ liệu đầu vào phpmailer smtp injection
Bên trên