0
0
Lập trình
Admin Team
Admin Teamtechmely

Giải thích OWASP Top Ten 2021 với ví dụ Java đơn giản

Đăng vào 12 giờ trước

• 5 phút đọc

Giới thiệu về OWASP Top Ten 2021

Trong bài viết này, chúng ta sẽ khám phá các danh mục của OWASP Top Ten 2021 thông qua các cảnh báo từ trình phân tích PVS-Studio Java. Nếu bạn muốn tìm hiểu về các mẫu lỗ hổng tiềm ẩn trong mã Java hoặc học về OWASP Top Ten, bài viết này dành cho bạn!

OWASP là gì?

OWASP (Open Web Application Security Project) là một tổ chức toàn cầu phi lợi nhuận với sứ mệnh nâng cao bảo mật ứng dụng phần mềm. Dự án OWASP Top Ten là một trong những sáng kiến nổi bật nhất của họ, cung cấp danh sách các lỗ hổng bảo mật phổ biến nhất mà các nhà phát triển cần chú ý.

Tại sao SAST lại quan trọng?

SAST (Static Application Security Testing) là phương pháp kiểm tra mã nguồn ứng dụng nhằm phát hiện các lỗ hổng bảo mật tiềm ẩn. Điều này giúp ngăn chặn các vấn đề bảo mật phần mềm trước khi chúng trở thành lỗ hổng trong ứng dụng. SAST là một phần quan trọng trong quy trình phát triển phần mềm, giúp giảm thiểu rủi ro và chi phí khắc phục sự cố sau này.

Các loại lỗ hổng trong OWASP Top Ten 2021

Chúng ta sẽ xem xét các danh mục của OWASP Top Ten 2021 theo thứ tự, mô tả từng danh mục và đưa ra ví dụ về mã nguồn dễ bị tổn thương mà trình phân tích PVS-Studio cảnh báo.

A01:2021 — Kiểm soát truy cập bị phá vỡ

Kiểm soát truy cập bị phá vỡ là loại lỗ hổng cho phép kẻ tấn công truy cập vào thông tin nhạy cảm hoặc thực hiện các hành động không được phép. Dưới đây là một ví dụ:

java Copy
public class RedirectServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    String query = request.getQueryString();
    if (query.contains("url")) {
      String url = request.getParameter("url");
      response.sendRedirect(url);  // <=
    }
  }
}

Cảnh báo từ PVS-Studio: V5324 Lỗ hổng chuyển hướng mở có thể xảy ra. Dữ liệu có thể bị ô nhiễm trong biến 'url'.

Để ngăn chặn điều này, server cần kiểm tra xem URL có trong danh sách cho phép hay không:

java Copy
private static final List<String> ALLOWED_DOMAINS = List.of(
  "https://allowed-host1.com",
  "https://allowed-host2.com"
);

public class RedirectServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    String query = request.getQueryString();
    if (query.contains("url")) {
      String url = request.getParameter("url");
      if (ALLOWED_DOMAINS.contains(url)) {
        response.sendRedirect(url);
      } else {
        //....
      }
    }
  }
}

A02:2021 — Lỗi mã hóa

Lỗi mã hóa liên quan đến việc mã hóa không đúng cách dữ liệu nhạy cảm, chẳng hạn như sử dụng các thuật toán mã hóa lỗi thời.

Ví dụ:

java Copy
public static void callExternalApi() throws Exception {
  SSLContext sslContext = SSLContext.getInstance("TLSv1");     // <=
  sslContext.init(null, null, new java.security.SecureRandom());
  HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
}

Cảnh báo từ PVS-Studio: V5313 Không sử dụng các phiên bản cũ của giao thức SSL/TLS.

A03:2021 — Tiêm mã

Tiêm mã xảy ra khi dữ liệu không đáng tin cậy được truyền vào các phần quan trọng của ứng dụng. Ví dụ, SQL Injection:

java Copy
String sql = "SELECT * FROM demoTable WHERE name = '" + name + "'"; // <=

Để bảo vệ ứng dụng, hãy sử dụng các truy vấn có tham số:

java Copy
String sql = "SELECT * FROM demoTable WHERE name = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{name}, DemoObject.class);

A04:2021 — Thiết kế không an toàn

Thiết kế không an toàn bao gồm việc xây dựng kiến trúc ứng dụng yếu kém. Ví dụ:

java Copy
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
  String requestedSessionId = req.getRequestedSessionId();
  if (requestedSessionId != null && requestedSessionId.startsWith("ADMIN-")) {
    // ....
  }
}

A05:2021 — Cấu hình bảo mật không chính xác

Cấu hình bảo mật không chính xác bao gồm việc bật các cổng hoặc dịch vụ không cần thiết:

java Copy
System.setProperty(key, value); // <=

A06:2021 — Thành phần dễ bị tổn thương và lỗi thời

Vấn đề này liên quan đến việc sử dụng các phiên bản thư viện hoặc framework chứa lỗ hổng bảo mật đã biết.

A07:2021 — Lỗi xác thực và nhận dạng

Lỗi xác thực và nhận dạng liên quan đến quản lý phiên hoặc xác thực người dùng không chính xác:

java Copy
registry.addMapping("/**").allowedOrigins("*"); // <=

A08:2021 — Lỗi tính toàn vẹn phần mềm và dữ liệu

Lỗi tính toàn vẹn phần mềm và dữ liệu dẫn đến các lỗi như cập nhật mà không có chữ ký số:

java Copy
ObjectInputStream ois = new ObjectInputStream(in); // <=

A09:2021 — Lỗi ghi nhật ký và giám sát bảo mật

Lỗi ghi nhật ký và giám sát bảo mật có thể gây cản trở việc phát hiện sự cố:

java Copy
log.info("Access {} {}?{} from {}", method, uri, qs, ip); // <=

A10:2021 — Tấn công SSRF (Server-Side Request Forgery)

Tấn công SSRF là khi server kết nối đến tài nguyên bên ngoài mà không kiểm tra:

java Copy
HttpURLConnection conn = (HttpURLConnection) external.openConnection(); // <=

Thực hành tốt nhất và mẹo hiệu suất

  • Luôn sử dụng các thư viện và framework mới nhất.
  • Kiểm tra mã nguồn định kỳ với SAST.
  • Đảm bảo tất cả các đầu vào người dùng đều được kiểm tra và xác thực.

Những cạm bẫy phổ biến

  • Thiếu kiểm tra đầu vào.
  • Sử dụng các thư viện lỗi thời.
  • Cấu hình không chính xác.

Kết luận

Chúng ta đã đi qua các danh mục OWASP Top Ten 2021 với các ví dụ rõ ràng và cách phát hiện lỗ hổng. Hãy thử nghiệm trình phân tích của PVS-Studio và chia sẻ ý kiến của bạn với chúng tôi!

Câu hỏi thường gặp (FAQ)

1. OWASP Top Ten có bao nhiêu lỗ hổng? 10 lỗ hổng chính.
2. Tại sao SAST lại quan trọng? Giúp phát hiện lỗ hổng trước khi phát hành.
3. Làm thế nào để cải thiện bảo mật ứng dụng? Thực hiện kiểm tra định kỳ và sử dụng các công cụ hiện đại.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào