Hướng dẫn kiểm thử xâm nhập lỗ hổng GraphQL cho newbie (Phần 1)

tuantran

Moderator
Thành viên BQT
27/04/2017
29
76 bài viết
Hướng dẫn kiểm thử xâm nhập lỗ hổng GraphQL cho newbie (Phần 1)
Hi các bạn, sau chuỗi bài về RCE trên nodejs. Thì mình nghĩ cũng không nên bỏ qua các lỗ hổng bảo mật trên một loại thao tác truy vấn dữ liệu của GraphQL.

1.png

GraphQL hiện tại cũng đã rất phổ biến và được dùng bởi rất nhiều ông lớn:
2.png

Vậy GraphQL API là gì và vì sao ông lớn đều dùng nó. Và Dĩ nhiên nếu như bạn là 1 người đam mê về bảo mật hay 1 người nghiên cứu về bảo mật thì bạn cũng sẽ tò mò xem nó có thể có những lỗi bảo mật như là 1 REST API thông thường hay không?

Nếu như bạn cũng tò mò về nó thì có thể bài viết này giúp ích cho bạn đó. Let’s do it now!!!

Trong phần này mình sẽ giới thiệu những phần sau:
  • Cách nhận biết xem làm thế nào để biết là web app có dùng GraphQL hay không?
  • Tool để hỗ trợ khai thác lỗ hổng trên GraphQL.

Và Điều hiển nhiên là để có thể nghiên cứu về một lổ hỗng hay lỗi gì đó thì việc đầu tiên mình cần phải làm là phải tìm hiểu thật kỹ về nó. Sau đó thì mới có thể phát hiện ra những lỗ hổng trên nó được. Để hiểu được nó thì mình sẽ trả lời loạt các câu hỏi sau:

GraphQL là gì?

GraphQL là ngôn ngữ thao tác và truy vấn dũ liệu mã nguồn mở cho API, cung cấp cho client 1 cách thức để dễ dang request chính xác những gì họ cần, giúp cho việc phát triển APi dễ dàng hơn theo thời gian. GraphQl được Facebook phát triển nội bộ vào năm 2012 trước khi phát hành công khai vào năm 2015.

GraphQL là một API nhưng không hoàn toàn giống như các dạng API chúng ta đã biết. Thông thường khi các dev viết một API họ thường viết rất nhiều endpoint ví dụ như:
  • GET /post
  • GET /post/1
  • POST /post/
  • DELETE /post/1
  • PUT /post/1
Nhưng GraphQL thì không, nó chỉ sử dụng 1 endpoint duy nhất cho mọi thao tác truy vấn trên tài nguyên của server.

Vậy Tại sao nó chỉ là 1 endpoint?
  • Điều này làm cho phía các nhà phát triển sẽ dễ dàng thao tác lấy dữ liệu nhanh hơn vì nó trả về chính xác những gì mà nhà phát triển mong muốn.
  • Thay vì tạo nhiều endpoint, họ có thể viết một vài truy vấn cho các hoạt động phổ biến. Sau đó, họ sử dụng các truy vấn này ở nhiều nơi khác nhau
  • Truy vấn của GraphQL rất khác với các truy vấn SQL về cú pháp nhưng không phải về kiểu dáng!
Graph QL hoạt động như thế nào?
  • GraphQL triển khai cấu trúc đồ thị làm cơ sở dữ liệu
  • Có các truy vấn( aka query) và thay đổi (aka mutations)
  • Truy vấn để lấy dữ liệu từ server (query)
  • Các thay đổi (mutations) cho phép dữ liệu được chỉnh sửa
  • Các phân đoạn (Fragments) cho phép dễ dàng lưu danh sách các trường
  • Metafields cho phép kiểm tra truy vấn hoặc thông tin đột biến
Cấu trúc GraphQL:
  • Thông thường, chúng biểu diễn dữ liệu dưới dạng bảng, bảng tính dữ liệu
  • Nhưng chúng thường liên kết 2 bảng khác nhau với nhau bằng cách sử dụng ID
  • Chúng ta có thể biểu diễn về nó trong các cấu trúc phẳng nhưng dạng tự nhiên của dữ liệu này là một đồ thị!
3.png

Truy Vấn (Query):
  • Các truy vấn trong GraphQL có thể viết rất linh hoạt
  • Bạn có thể yêu cầu bất kỳ trường nào một cách dễ dàng, bao gồm các thực thể có liên quan trên biểu đồ và sau đó là một trường được liên kết với thực thể đó
  • Được viết dưới dạng các hàm
  • Có thể trả về một hoặc nhiều kết quả
  • Cũng có thể bao gồm các đối số
  • Hoặc thao tác dữ liệu
  • Rất có cấu trúc

4.png

Thay đổi (Mutations):
  • Trong khi truy vấn dữ liệu, có thể dùng mutation để chỉnh sữa dữ liệu
  • Có thể là chỉnh sửa hoặc xóa dữ liệu với các biến được chỉ định.
  • Cũng có thể truy vấn dữ liệu sau khi sửa đổi dữ liệu.
5.png

Fragments and Metaqueries:
  • Các Fragments cho phép bạn quyết định một danh sách các trường và yêu cầu nhiều truy vấn sử dụng cùng một danh sách.
  • Dùng để so sánh
  • Các Metaqueries cho phép bạn kiểm tra API, __typename trả về kiểu của tên.
  • Và nó cực kì quan trọng đối với truy vấn introspection.
Nếu các bạn muốn tìm hiểu sâu hơn về GraphQL thì có thể xem ở đây:

https://viblo.asia/p/tim-hieu-graphql-phan-1-graphql-vs-rest-api-924lJYG6ZPM

https://viblo.asia/p/graphql-la-gi-bat-dau-voi-graphql-gDVK2nX0KLj

Qua đó mình có thể hiểu ít nhiều về grapphQL. Vậy làm sao để biết được web hay app đó đang dùng là Graphql hay không?

Cách nhận biết xem làm thế nào để biết là web app có dùng GraphQL hay không?

Bởi vì nó chỉ là 1 endpoint nên rất dễ nhận biết:
  • GraphQL thường có các endpoint đặc biệt như /qql, /graphql, /graphiql, /graphql/console
  • Hoặc bạn có thể nhìn vào request và response có chứa các dạng cấu trúc như query hoặc mutation.
Có các Tool nào để hỗ trợ khai thác lỗ hỗng trên GraphQL hay không?

Câu trả lời là có nhé!!! .Hiện tại trên internet có một số tool chỉ hỗ trợ duy nhất cho khai thác lỗ hỗng trên GraphQL dưới đây:

GraphQL Voyager:

Biểu diễn bất kì GraphQL API dưới dạng đồ thị tương tác. Giúp cho người dùng có cái nhìn cụ thể hơn về các đối tượng hiện có trong một chương trình.

6.png

Tính năng:
  • Dễ dàng điều hướng trên biểu đồ
  • Bản điều hướng bên trái cung cấp thông tin chi tiết về các đối tượng và các trường có trong đối tượng đó
  • Khi bạn click vào các đối tượng thì nó sẽ hiển thị ra mối quan hiện với các đối tượng khác.
Bạn có thể tìm hiểu sâu hơn tại hơn: https://github.com/APIs-guru/graphql-voyager

GraphQL IDE – GraphQL IDE

GraphQL IDE giúp chúng ta dễ dàng tương tác với graphql api trong trình duyệt web. Và dễ dàng hơn trong việc viết query và mutation trong quá trình khai thác lỗ hổng.

7.png

Các tính năng của Graphqli:
  • Đánh dấu cú pháp
  • Đánh dấu và báo lỗi cú pháp trong lúc nhập.
  • Hoàn thành truy vấn và biến tự động
  • Tự động thêm các trường bắt buộc vào câu truy vấn
  • Lưu lịch sử truy vấn sử dụng localStorage
  • Hỗ trợ chạy và trả về kết quả là JSON
  • Hỗ trợ đầy đủ các dạng truy vấn của Graphql
Chi tiết tại: https://github.com/graphql/graphiql

Altair – GraphQL IDE

https://altair.sirmuel.design/

https://github.com/imolorhe/altair

https://chrome.google.com/webstore/detail/altair-graphql-client/flnheeellpciglgpaodhkhmapeljopja

Nếu như bạn đã từng dùng POSTMAN để tương tác hay tạo request với REST API. Thì Đối với GraphQL thì đó là Altair.

8.png

InQL – Burp addon and scanner

Nếu như bạn là một người đã từng biết về burp thì đây là 1 extension giúp bạn tiết kiệm được khối thời gian khi thực hiện kiểm tra lỗ hổng trên GraphQL.

Ở đây có cung cấp đầy đủ thông tin về extension này:

https://portswigger.net/bappstore/296e9a0730384be4b2fffef7b4e19b1f

Hoặc nếu như bạn muốn tự build thì tham khảo ở link dưới đây:

https://github.com/doyensec/inql

Và nếu như bạn là một người chưa biết set up burp như thể nào thì ở đây có bài viết khá chi tiết:

GraphQL Map

9.png

Graphql Map có thể:
  • dump toàn bộ GraphQL Schema
  • Tương tác trực tiếp với Graphql endpoint
  • Thực thi các truy ván trực tiếp
  • Tự động thêm vào các trường bắt buộc lúc truy vấn
  • Cung cấp tính năng fuzzing trường hoặc biến.
  • Kiểm tra NoSQL và SQL inject trong các trường hoặc biến
Chi tiết hơn: https://github.com/swisskyrepo/GraphQLmap

Trên đó là các tool đơn lẻ để có thể hỗ trợ tốt cho việc khai thác lỗ hổng. Ngoài ra thì còn có tool auto của graphql dưới đây mình hay dùng để kiểm tra phân quyền trong GrahQL.

AutoGraphQL

Nó được viết bởi Ron Chan. Nó hỗ trợ cho việc kiểm trả phân quyền trên GraphQL một cách tự động. Nó có thể phát hiện ra các lổ hổng liên quan đến phân quyền. Quá trình kiểm tra thì bao gồm các bước sau:
  • Đọc introspection file.
  • Chọn API mà bạn muốn test.
  • Cài đặt tài khoản bạn muốn dùng để kiểm tra.
  • Cuối cùng là chạy tool và kiểm tra nó được gọi đúng hay sai. Sau đó xem kết quả.
Để hiểu rõ hơn cách chạy thì đây có video khá rõ từ tác giả. Include This In Your Hacking Workflow by Continuous Monitoring with AuthoGraphQL (How-to guide)

Trên đó là tất cả các tool mình biết dùng để khai thác lỗ hỗng trong GraphQL.

Nếu bạn biết thêm tool nào thì có thể comment cho mình biết và bổ sung thêm vào bài viết này nhé.

Phần tiếp theo mình sẽ viết các lỗ hỗng của GraphQL và cách khai thác nó.

Cảm ơn bạn đã đọc đến đây.
 
Chỉnh sửa lần cuối bởi người điều hành:
Thẻ
api graphql graphql map
Bên trên