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

Thảo luận trong 'Exploitation' bắt đầu bởi tuantran, 29/05/21, 04:05 PM.

  1. tuantran

    tuantran Moderator Thành viên BQT

    Tham gia: 27/04/17, 09:04 AM
    Bài viết: 29
    Đã được thích: 12
    Điểm thành tích:
    3
    [​IMG]
    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. 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:

    upload_2021-5-29_15-56-12.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ị!

    upload_2021-5-29_15-56-42.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

    upload_2021-5-29_15-57-23.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.

    upload_2021-5-29_15-57-48.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.

    upload_2021-5-29_15-58-12.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.

    upload_2021-5-29_15-58-39.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.

    upload_2021-5-29_15-59-26.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

    upload_2021-5-29_15-59-47.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
     

    Các file đính kèm:

    Chỉnh sửa cuối: 29/05/21, 04:05 PM
    Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
    vodanh2504 and bobby13689 like this.