XSS (Cross-Site Scripting) và CSRF (Cross-Site Request Forgery) là hai cách tấn công bảo mật phổ biến mà các lập trình viên phần mềm web cần phải hiểu và phòng ngừa. Trong bài viết này, chúng ta sẽ tìm hiểu về XSS và CSRF, cách chúng hoạt động và những biện pháp để bảo vệ ứng dụng của bạn.
I. XSS (Cross-Site Scripting)
XSS là một cách mà kẻ tấn công chèn mã độc vào ứng dụng web và lừa người dùng thực thi mã độc đó trong trình duyệt của họ.
Điều này có thể dẫn đến việc đánh cắp thông tin nhạy cảm của người dùng hoặc thực hiện các hành động độc hại trên trang web.
Hãy cùng xem đoạn code của 1 REST Web Service API dưới đây được viết sử dụng python flask:
from flask import Flask, request
app = Flask(__name__)
@app.route('/api/data', methods=['POST'])
def save_data():
user_input = request.form.get('input')
return f"Your input: {user_input}"
if __name__ == '__main__':
app.run()
API này lấy thông tin người sử dụng submit và in thẳng ra màn hình mà không hề kiểm tra sự an toàn của nó. Hacker có thể gọi api trên với đoạn code sau và API sẽ in ra màn hình thông tin user_id mặc dù đây không phải là mục đích của api này.
<script>
// Malicious JavaScript code
fetch('https://your-app.com/api/data', {
method: "POST",
body: {"input": "flask.session['user_id']"">}
});
</script>
Với 1 đoạn code phức tạp hơn, hacker có thể tìm cách lấy được các thông tin khác.
Có ba loại XSS chính:
Reflected XSS: Đây là loại XSS phổ biến nhất. Mã độc được chèn vào các tham số của URL. Khi người dùng truy cập vào URL đó, mã độc sẽ được thực thi trong trình duyệt của họ.Stored XSS: Trong trường hợp này, mã độc được lưu trữ trên máy chủ và hiển thị cho tất cả người dùng truy cập trang web đó. Khi người dùng xem nội dung, mã độc sẽ được chạy.DOM-based XSS: Loại XSS này khai thác các lỗ hổng trong DOM (Document Object Model). Mã độc được chèn vào mã JavaScript của trang web và chạy trực tiếp trong trình duyệt của người dùng.
Tình huống ví dụ
- Một kẻ tấn công sử dụng lỗ hổng XSS để chèn mã độc vào một trang web diễn đàn. Khi người dùng truy cập trang web và xem nội dung của bài viết, mã độc sẽ được thực thi trong trình duyệt của họ. Mã độc này có thể lấy thông tin cá nhân của người dùng, như tên đăng nhập và mật khẩu, và gửi về cho kẻ tấn công.
- Một cuộc tấn công XSS phổ biến khác là khi kẻ tấn công chèn mã độc vào các trường đầu vào trong một trang web, chẳng hạn như một hộp thoại nhập liệu hoặc một biểu mẫu (form). Khi người dùng điền thông tin vào các trường này, mã độc sẽ được thực thi trong trình duyệt của họ. Điều này có thể dẫn đến việc đánh cắp thông tin nhạy cảm hoặc thực hiện các hành động không mong muốn trên trang web.
Để tránh bị tấn công XSS, hãy tuân thủ các biện pháp sau:
- Luôn luôn kiểm tra và xử lý dữ liệu đầu vào:
- Hãy đảm bảo rằng bạn kiểm tra và xử lý đúng dữ liệu đầu vào, bao gồm URL, tham số, và nội dung được hiển thị.
- Sử dụng các phương thức như
escapehoặcencodeđể ngăn chặn mã độc được chèn vào trang web.
- Sử dụng bộ lọc đầu ra: Trước khi hiển thị dữ liệu lên trang web, hãy sử dụng bộ lọc đầu ra để loại bỏ hoặc vô hiệu hóa các thẻ và mã JavaScript không an toàn.
- Tắt tính năng không cần thiết: Vô hiệu hóa tính năng nguy hiểm như chia sẻ cookie thông qua JavaScript hoặc sử dụng các Javascript API không an toàn như
eval(). - Sử dụng HTTP Only Cookie: Đảm bảo rằng cookie được đặt ở chế độ
HTTP Only, điều này ngăn chặn mã JavaScript truy cập vào cookie, giảm nguy cơ bị đánh cắp thông tin xác thực.
II. CSRF (Cross-Site Request Forgery)
CSRF là phương thức tấn công trong đó kẻ tấn công lừa người dùng thực hiện các hành động không mong muốn trên trang web mà họ đã xác thực. Điều này xảy ra bằng cách tạo ra và gửi các yêu cầu giả mạo từ một trang web khác mà người dùng đã truy cập.
Các bước tấn công CSRF bao gồm:
- Người dùng truy cập trang web độc hại: Kẻ tấn công chèn mã độc vào trang web nơi người dùng thường truy cập.
- Người dùng xác thực: Người dùng xác thực trên trang web độc hại.
- Yêu cầu giả mạo: Kẻ tấn công tạo yêu cầu giả mạo với các tham số cần thiết và gửi yêu cầu đó tới trang web mà người dùng đã xác thực.
Tình huống ví dụ
- Một cuộc tấn công CSRF xảy ra khi kẻ tấn công tạo ra một trang web giả mạo hoặc chèn mã độc vào một trang web khác mà người dùng thường truy cập. Khi người dùng đã xác thực trên trang web chính và sau đó truy cập vào trang web giả mạo hoặc bị chuyển hướng đến trang web chứa mã độc, các yêu cầu giả mạo sẽ được gửi đến trang web chính từ trình duyệt của người dùng. Điều này có thể dẫn đến việc thực hiện các hành động không mong muốn như thay đổi thông tin cá nhân, thay đổi mật khẩu hoặc thực hiện các giao dịch tài chính không được phép.
- Ví dụ khác về cuộc tấn công CSRF là khi kẻ tấn công giả mạo là nhân viên ngân hàng và gửi cho người dùng một email chứa một liên kết đến một trang web giả mạo. Khi người dùng nhấp vào liên kết đó, trình duyệt của họ sẽ gửi các yêu cầu không mong muốn tới trang web chính mà họ đã xác thực để đăng nhập và thậm chí thực hiện chuyển khoản. Điều này có thể cho phép kẻ tấn công thực hiện các hành động độc hại mà người dùng không đồng ý.
Để phòng ngừa cuộc tấn công CSRF, hãy tuân thủ các biện pháp sau:
- Sử dụng CSRF Token:
- Thêm một CSRF token vào các form và request được gửi về server.
- Token này được tạo ngẫu nhiên.
- Khi nhận yêu cầu, máy chủ kiểm tra tính hợp lệ của token trước khi xử lý yêu cầu.
- Xác thực nguồn gốc (Origin):
- Kiểm tra nguồn gốc (origin) của yêu cầu để đảm bảo rằng yêu cầu được gửi từ trang web được xác thực và không phải từ một nguồn không đáng tin cậy.
- Với Web Service API: cần sử dụng các plugin/extension/thư viện hỗ trợ CORS để quản lý.
- Sử dụng SameSite Cookies: Đặt cookies với
SameSiteattribute được thiết lập thànhStricthoặcLax. Điều này ngăn chặn trình duyệt gửi cookies trong yêu cầu CSRF. - Hạn chế quyền truy cập:
- Hạn chế quyền truy cập của người dùng đến các yêu cầu không mong muốn bằng cách áp dụng nguyên tắc giảm tối thiểu quyền.
- Đảm bảo rằng người dùng chỉ có quyền thực hiện các hành động cần thiết và không thể thực hiện các yêu cầu nguy hiểm mà họ không có quyền.
III. Các biện pháp phòng chống XSS và CSRF khác
- Tạo ý thức bảo mật: Đào tạo và nâng cao ý thức bảo mật cho toàn bộ nhóm phát triển. Đảm bảo rằng tất cả các thành viên đều hiểu về các nguy cơ XSS và CSRF và biết cách phòng ngừa chúng.
- Kiểm tra và đánh giá mã nguồn:
- Thực hiện kiểm tra mã nguồn thường xuyên để phát hiện và sửa các lỗ hổng bảo mật.
- Sử dụng các công cụ kiểm tra tự động để đảm bảo rằng code của bạn tuân thủ các nguyên tắc bảo mật. Bạn có thể thao khảo danh sách các công cụ mà OWASP đề xuất tại đây.
- Áp dụng các thư viện và framework an toàn: Sử dụng các thư viện và framework có sẵn mà đã được kiểm tra bảo mật và được cập nhật thường xuyên. Điều này giúp giảm nguy cơ lỗi bảo mật do việc triển khai mã từ đầu.
- Theo dõi và cập nhật: Theo dõi các thông báo bảo mật và cập nhật các phiên bản mới nhất của framework hay ngôn ngữ lập trình bạn đang sử dụng một cách định kỳ va hợp lý.
- Thiết lập firewall sử dụng các dịch vụ đơn giản như CloudFlare.
- Kiểm tra thủ công:
- Thực hiện kiểm tra bảo mật thủ công để tìm ra các lỗ hổng không được phát hiện bởi các công cụ tự động.
- Kiểm tra các tình huống bất thường và thử các kịch bản tấn công.
Nếu dự án có ngân sách, bạn cũng có thể xem xét sử dụng các dịch vụ bảo mật rất vừa túi tiền như Sucuri.net.
Lời kết
XSS và CSRF là hai phương thức tấn công nguy hiểm mà các lập trình viên phần mềm cần phải hiểu và phòng ngừa. Bằng cách tuân thủ các biện pháp phòng chống như kiểm tra và xử lý dữ liệu đầu vào, sử dụng các cơ chế xác thực, áp dụng CSRF token, và áp dụng các biện pháp bảo mật khác, bạn có thể bảo vệ ứng dụng của mình khỏi các cuộc tấn công XSS và CSRF. Điều quan trọng là hiểu rõ về các phương pháp tấn công này và áp dụng các biện pháp phòng chống tương ứng.
Ngoài ra, hãy luôn cập nhật kiến thức về bảo mật và theo dõi các xu hướng, công nghệ mới liên quan để giữ cho mã nguồn của bạn luôn an toàn và bảo mật. Bạn cũng nên thực hiện kiểm tra và đánh giá bảo mật định kỳ để phát hiện sớm các lỗ hổng tiềm ẩn và sửa chúng trước khi bị khai thác.
Bạn cũng có thể tham khảo các công cụ như SonarQube, sucuri.net hay ClamAV.
Bảo mật theo framework (đang cập nhật)
Đảm bảo bảo mật cho Web Service API của bạn trên Laravel (PHP), NodeJS, Python Django và C# .NET.
