Xem thêm

GraphQL - Khám phá và khắc phục các lỗ hổng bảo mật (Phần 2)

Huy Erick
1. Truy vấn tổng quát Trong GraphQL, việc gửi một truy vấn query{__typename} tới bất kỳ endpoint GraphQL nào sẽ trả về response chứa chuỗi {"data": {"__typename": "query"}}. Điều này có thể được sử dụng...

image.png

1. Truy vấn tổng quát

Trong GraphQL, việc gửi một truy vấn query{__typename} tới bất kỳ endpoint GraphQL nào sẽ trả về response chứa chuỗi {"data": {"__typename": "query"}}. Điều này có thể được sử dụng để kiểm tra xem một URL có phù hợp với một dịch vụ GraphQL hay không.

2. Tên điểm cuối phổ biến

Các dịch vụ GraphQL thường sử dụng các tên điểm cuối giống nhau. Khi kiểm tra các điểm cuối GraphQL, bạn nên thử gửi truy vấn tới các endpoints sau để kiểm tra:

/graphql
/api
/api/graphql
/graphql/api
/graphql/graphql

Nếu các endpoints phổ biến này không trả về phản hồi GraphQL, bạn cũng có thể thử thêm /v1 vào đường dẫn:

/v1/graphql
/v1/api
/v1/api/graphql
/v1/graphql/api
/v1/graphql/graphql

3. Phương thức yêu cầu

Việc kiểm tra GraphQL endpoint tiếp theo là sử dụng các phương thức yêu cầu khác nhau.

Với các endpoints GraphQL ở môi trường production, chỉ chấp nhận các yêu cầu POST có tiêu đề Content-Type là application/json, điều này giúp bảo vệ khỏi các lỗi CSRF. Tuy nhiên, một số endpoint có thể chấp nhận các phương thức thay thế, như yêu cầu GET hoặc yêu cầu POST sử dụng header là Content-Type: x-www-form-urlencoded.

Nếu bạn không tìm thấy các endpoint GraphQL bằng cách gửi yêu cầu POST tới các điểm cuối phổ biến, hãy thử gửi lại truy vấn tổng quát bằng cách sử dụng các phương thức HTTP khác (PUT, PATCH...).

4. Kiểm tra đối số truy vấn

Kiểm tra đối số truy vấn là một phương pháp tốt để tìm các lỗ hổng bảo mật. Nếu API sử dụng đối số để truy cập trực tiếp vào các đối tượng, có thể có lỗ hổng về kiểm soát phân quyền truy cập. Người dùng có thể truy cập thông tin mà họ không được cấp quyền bằng cách cung cấp các đối số của đối tượng cần khai thác. Đây là lỗ hổng "Insecure Direct Object References" (IDOR).

5. Sử dụng introspection để khám phá cấu trúc

Introspection là một chức năng tích hợp trong GraphQL cho phép bạn truy vấn máy chủ để lấy thông tin về cấu trúc. Điều này giúp bạn hiểu cách tương tác với một API GraphQL và có thể tiết lộ dữ liệu có thể nhạy cảm.

5.1 Sử dụng introspection

Sử dụng introspection để khám phá thông tin về cấu trúc, truy vấn trường __schema. Trường này có sẵn trên tất cả các truy vấn và có thể được chỉ định các trường và cấu trúc của phản hồi mà bạn muốn khi chạy một truy vấn introspection.

5.2 Kiểm tra introspection

Để đảm bảo an toàn nhất cho ứng dụng GraphQL, bạn nên tắt introspection trong môi trường production, nhưng không phải lúc nào mọi người cũng tuân thủ lời khuyên này. Bạn có thể kiểm tra bằng cách thực hiện truy vấn __schema để xem liệu introspection có được kích hoạt hay không.

5.3 Chạy truy vấn introspection đầy đủ

Sử dụng truy vấn introspection đầy đủ để nhận được thông tin chi tiết về cấu trúc của GraphQL. Truy vấn này trả về thông tin về các truy vấn, mutation, subscription, loại dữ liệu, và đoạn mã.

5.4 Visualizer và InQL

Để dễ dàng xem và khám phá các kết quả từ truy vấn introspection, bạn có thể sử dụng các công cụ như GraphQL Visualizer và InQL. Các công cụ này giúp bạn hiểu rõ hơn về cấu trúc dữ liệu và mối quan hệ giữa các phần tử trong schema GraphQL.

Trên thực tế, khi sử dụng GraphQL, chúng ta cần lưu ý một số biện pháp an toàn sau:

  • Disable introspection trên môi trường production để hạn chế việc lộ những thông tin nhạy cảm về hệ thống API.
  • Kiểm tra lại toàn bộ schema của API để đảm bảo không có thông tin nhạy cảm, không cần thiết bị lộ ra.
  • Đảm bảo rằng API không lộ bất kỳ thông tin nhạy cảm hay bí mật nào như password, email, code, pin,...
  • Kiểm tra các lỗ hổng bảo mật có thể phát sinh từ việc sử dụng GraphQL để đảm bảo an toàn tuyệt đối cho hệ thống.

Điều này giúp bảo vệ dữ liệu người dùng và đảm bảo an toàn cho toàn bộ hệ thống API.

1