Note 1: JWT và các loại tấn công nhắm vào JWT

Tram Ho

JWT và cách thức xác thực

  • JWT (JSON Web Token) là một phương thức xác thực được sử dụng trong các ứng dụng web và di động. Khi một người dùng đăng nhập vào một ứng dụng, máy chủ sẽ tạo ra một JWT chứa thông tin về người dùng và ký số để xác thực tính hợp lệ của JWT. Sau đó, JWT này sẽ được gửi đến cho người dùng, và người dùng sẽ gửi nó lại với các yêu cầu được thực hiện trong ứng dụng.
  • Mỗi lần người dùng gửi yêu cầu, JWT sẽ được gửi đến máy chủ và được giải mã để trích xuất thông tin về người dùng. Máy chủ sẽ kiểm tra chữ ký của JWT để đảm bảo tính hợp lệ của nó. Nếu chữ ký hợp lệ, máy chủ sẽ trả về các dữ liệu hoặc thực hiện các hành động được yêu cầu.

JWT format

  • JWT gồm 3 phần header, payload và signature được mã hóa bằng base64 mỗi thành phần sẽ được ngăn cách bằng dấu chấm.

  • Cụ thể phần header là một đối tượng JSON chứa hai thông tin: loại token (type) và thuật toán mã hóa (algorithm) được sử dụng để mã hóa phần nội dung của token.

  • Phần payload là một đối tượng JSON chứa các thông tin xác thực và thông tin khác. Các thông tin này được mã hóa bằng cách sử dụng thuật toán đã được chỉ định trong phần header.

  • Phần signatuer là phần cuối cùng của JWT, được tạo bằng cách kết hợp header, payload và một secret key để tạo ra một chuỗi chữ ký duy nhất. Chữ ký này được sử dụng để xác thực tính hợp lệ của token.HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret),

JWT vs JWS vs JWE

  • JWT được sử dụng để xác thực người dùng và truyền tải thông tin giữa các bên. JWS (JSON Web Signature) được sử dụng để xác thực tính toàn vẹn của dữ liệu và JWE (JSON Web Encryption) được sử dụng để bảo vệ dữ liệu truyền tải. Các chuẩn định dạng này có thể được kết hợp để đảm bảo tính toàn vẹn và bảo mật cho dữ liệu trong quá trình truyền tải.
  • image.png

Xác thực JWT

  1. Trên server, hãy tạo ra một khóa bí mật (secret key). Khóa bí mật này sẽ được sử dụng để tạo và xác thực các mã JWT.
  2. Khi người dùng đăng nhập hoặc thực hiện quá trình xác thực, server sẽ tạo ra một JWT và gửi về cho client. JWT này chứa thông tin xác thực của người dùng, như thông tin về người dùng và các quyền truy cập.
  3. Khi client gửi yêu cầu đến server, nó sẽ gửi JWT kèm theo trong phần tiêu đề (header) của yêu cầu. Thông thường, phần tiêu đề này có tên là “Authorization” và giá trị của nó là “Bearer [token]”, trong đó [token] là chuỗi JWT.
  4. Trên server, khi nhận được yêu cầu từ client, bạn cần xác thực JWT để đảm bảo rằng nó là hợp lệ và chưa bị sửa đổi. Bạn có thể thực hiện các bước sau để xác thực JWT:
  5. Trích xuất mã JWT từ phần tiêu đề “Authorization” của yêu cầu.
  6. Sử dụng khóa bí mật đã được chia sẻ giữa client và server để giải mã mã JWT.
  7. Kiểm tra chữ ký đi kèm trong JWT để xác minh tính toàn vẹn của nó. Chữ ký được tạo bằng cách sử dụng thuật toán mã hóa với khóa bí mật đã được chia sẻ.
  8. Kiểm tra thời hạn (expiration) của JWT để đảm bảo rằng nó vẫn còn trong thời gian hợp lệ.
  9. Nếu JWT xác thực thành công, server có thể truy xuất thông tin từ JWT và tiếp tục xử lý yêu cầu của client.
  10. Nếu JWT không hợp lệ hoặc đã hết hạn, server có thể trả về mã phản hồi (response) phù hợp, chẳng hạn như mã lỗi 401 Unauthorized.

Các loại tấn công vào JWT.

Không verify JWT

  • Trong trường hợp này, DEV không thực hiện verify hoặc nhầm lẫn giữa việc sử dụng hàm decode để lấy giá trị từ payload thay vì sử dụng hàm verify.=> gãy
  • Cách tấn công trong trường hợp này chỉ việc chỉnh sửa lại trường payload thành giá trị mong muốn và dứt.
    image.png

Chấp nhận token với signature là none

  • Trường hợp này có thể thay đổi thuật toán là none và có thể chỉnh sửa thông tin payload thoải mái
  • image.png

Sử dụng key jwt yếu

  • Trong trường hợp này sử dụng hashcat để tiến hành brute secret key của jwt.
  • hashcat -a 0 -m 16500 <YOUR-JWT> /path/to/jwt.secrets.list => secrec list có thể sử dụng rockyou hoặc seclist hoặc đại loại một thứ gì đó tồn tại ở internet.

Injections JWT tự ký thông qua tham số jwk

  • JWK (Khóa web JSON) là một định dạng được tiêu chuẩn hóa để biểu diễn các khóa dưới dạng đối tượng JSON.
  • Ví dụ

  • Lý tưởng nhất là các máy chủ chỉ nên sử dụng một danh sách trắng giới hạn các khóa công khai để xác minh chữ ký JWT. Tuy nhiên, máy chủ được định cấu hình sai đôi khi sử dụng bất kỳ khóa nào được nhúng trong jwktham số.
  • Bạn có thể khai thác hành vi này bằng cách ký JWT đã sửa đổi bằng khóa riêng RSA của riêng bạn, sau đó nhúng khóa chung phù hợp vào tiêu đề jwk.
Chia sẻ bài viết ngay

Nguồn bài viết : Viblo