-->

Memahami GraphQL Apps Attacks [Generic University]


1. Introduction


1.1 Apa itu GraphQL


GraphQL adalah sebuah query language untuk API dan runtime yang mengeksekusi query-query tersebut berdasarkan data yang ada. Teknologi ini digunakan untuk mengambil data secara efisien dari berbagai sumber dan memberikan fleksibilitas bagi pengembang untuk menentukan struktur respons yang mereka butuhkan. Tipe data yang didukung oleh GraphQL mencakup scalar types seperti String, Int, dan Boolean, serta tipe yang lebih kompleks seperti objects, lists, dan enums. Di Indonesia, beberapa perusahaan e-commerce besar yang menggunakan GraphQL antara lain Tokopedia dan Bukalapak, yang memanfaatkannya untuk meningkatkan performa dan efisiensi dalam pengelolaan data serta interaksi dengan aplikasi pengguna.

1.2 REST API vs GraphQL

REST API secara teknis lebih mudah dibuat karena mengikuti arsitektur yang sudah mapan dengan metode HTTP standar seperti GET, POST, PUT, dan DELETE. Namun, pengambilan data dari REST API bisa menjadi rumit karena harus mengunjungi berbagai endpoint URL tertentu dengan berbagai parameter data untuk mendapatkan informasi yang dibutuhkan. Sebaliknya, GraphQL secara teknis lebih sulit untuk dibuat karena membutuhkan definisi skema yang kompleks dan resolver yang harus dikonfigurasi. Meskipun demikian, pengambilan data dengan GraphQL jauh lebih sederhana karena hanya memerlukan satu endpoint dan bergantung pada querying untuk mendapatkan data yang diinginkan dengan struktur yang spesifik dan presisi tinggi.

2. Konsep Utama GraphQL


2.1 Queries & Fields


  • Queries: Queries di GraphQL digunakan untuk mengambil data dari server. Mereka memungkinkan klien untuk secara tepat menentukan data apa yang dibutuhkan.
  • Fields: Fields merepresentasikan potongan data yang spesifik dalam query. Setiap field bisa memiliki subfields, memungkinkan nested queries untuk mengambil struktur data yang kompleks.

2.1.1 Request Query - Graphql:

  • Query Structure: Query dimulai dengan {}, yang menandakan bahwa ini adalah sebuah query.
  • Field hero: Field ini meminta objek hero.
  • Subfield name: Di dalam objek hero, query meminta field name, yang mengindikasikan bahwa hanya nama dari hero yang diminta.

2.1.2 Response Query - Graphql:

  • Root Object data: Semua respons GraphQL dibungkus dalam objek data.
  • Field hero: Sesuai dengan query, objek hero dikembalikan.
  • Field name: Di dalam objek hero, field name berisi nilai "R2-D2", yang merupakan nama dari hero yang diminta.

2.2 Arguments


  • Arguments: Arguments dalam GraphQL digunakan untuk menyaring atau menspesifikkan data yang diinginkan dalam query. Dalam contoh ini, argument id digunakan untuk mengidentifikasi human dengan ID tertentu.

2.2.1 Request Query - Graphql:

  • Query Structure: Query dimulai dengan {}, yang menandakan bahwa ini adalah sebuah query.
  • Field human dengan Argument id: Field ini meminta objek human dengan spesifik menggunakan argument id dengan nilai "1000".
  • Subfields name dan height: Di dalam objek human, query meminta field name dan height, yang mengindikasikan bahwa hanya nama dan tinggi dari human yang diminta.

2.2.2 Response Query - Graphql:

  • Root Object data: Semua respons GraphQL dibungkus dalam objek data.
  • Field human: Sesuai dengan query, objek human dikembalikan.
  • Field name dan height: Di dalam objek human, field name memiliki nilai "Luke Skywalker" dan field height memiliki nilai 1.72.

2.3 Fragment & Aliases


  • Aliases: Aliases memungkinkan pengambilan beberapa field atau data yang sama dari query dengan berbagai parameter atau arguments tanpa konflik nama.
  • Fragments: Fragments memungkinkan penggunaan kembali bagian query yang sama di beberapa tempat, menghindari duplikasi dan membuat query lebih bersih dan mudah dikelola.

2.3.1 Request Query - Graphql:

  • Aliases: leftComparison dan rightComparison digunakan sebagai alias untuk mempermudah identifikasi dalam respons.
    • Alias leftComparison: Mengambil data hero dari episode EMPIRE dan menggunakan fragment comparisonFields.
    • Alias rightComparison: Mengambil data hero dari episode JEDI dan menggunakan fragment comparisonFields.
  • Fragments: comparisonFields digunakan untuk menghindari pengulangan dalam query, memungkinkan pengambilan beberapa field yang sama pada berbagai objek.
    • Fragment comparisonFields: Mengambil field name, appearsIn, dan friends yang terdiri dari subfield name.

2.3.2 Response Query - Graphql:

  • Root Object data: Semua respons GraphQL dibungkus dalam objek data.
  • Field leftComparison: Sesuai dengan query, objek leftComparison dikembalikan dengan field name, appearsIn, dan friends.
    • Field name: Nilai "Luke Skywalker".
    • Field appearsIn: Daftar episode di mana Luke Skywalker muncul: "NEWHOPE", "EMPIRE", dan "JEDI".
    • Field friends: Daftar teman dengan field name masing-masing: "Han Solo", "Leia Organa", "C-3PO", dan "R2-D2".
  • Field rightComparison: Sesuai dengan query, objek rightComparison dikembalikan dengan field name, appearsIn, dan friends.
    • Field name: Nilai "R2-D2".
    • Field appearsIn: Daftar episode di mana R2-D2 muncul: "NEWHOPE", "EMPIRE", dan "JEDI".
    • Field friends: Daftar teman dengan field name masing-masing: "Luke Skywalker", "Han Solo", dan "Leia Organa".

2.4 Mutations


  • Mutations: Mutations digunakan untuk mengubah data di server.

2.4.1 Request Query - Graphql:

  • Mutation Name: CreateReviewForEpisode adalah nama mutation ini.
  • Variables: Mutation ini menggunakan dua variable, $ep bertipe Episode! dan $review bertipe ReviewInput!.
    • Variable $ep: Menyimpan episode yang akan di-review.
    • Variable $review: Menyimpan data review yang akan ditambahkan.
  • Fields: Mutation meminta field stars dan commentary dari hasil createReview.

2.4.2 Response Query - Graphql:

  • Variable ep: Nilai "JEDI", menentukan episode yang di-review.
  • Variable review: Objek yang berisi field stars dengan nilai 5 dan commentary dengan nilai "This is a great movie!".
  • Root Object data: Semua respons GraphQL dibungkus dalam objek data.
  • Field createReview: Sesuai dengan mutation, objek createReview dikembalikan dengan field stars dan commentary.
    • Field stars: Nilai 5, sesuai dengan input review.
    • Field commentary: Nilai "This is a great movie!", sesuai dengan input review.

2.5 Introspection

  • Introspection: Introspection digunakan untuk meminta informasi dari schema GraphQL tentang query apa saja yang didukung.

2.5.1 Request Query - GraphQL:

  • Query Name: __schema adalah nama field yang digunakan untuk introspeksi schema.
  • Fields: Query ini meminta field types yang mengandung daftar nama tipe yang tersedia dalam schema.

2.5.2 Response Query - GraphQL:

  • Root Object data: Semua respons GraphQL dibungkus dalam objek data.
  • Field __schema: Berisi informasi tentang schema yang diminta.
    • Field types: Daftar tipe yang ada dalam schema, misalnya Query, String, ID, dll.

Introspection memungkinkan developer untuk membuat tools yang lebih canggih, seperti browser dokumentasi atau pengalaman IDE yang kaya fitur, dengan memanfaatkan kemampuan introspeksi schema GraphQL.

3. GraphQL Methodology Attacks


3.1 GraphQL Attack Vector

GraphQL, seperti REST API, adalah antarmuka yang memungkinkan aplikasi berkomunikasi dengan server untuk mengakses atau memodifikasi data. Sebagai API, GraphQL juga menghadapi berbagai potensi kerentanan keamanan yang serupa dengan REST API.

3.2 Generic University (Using Methodology) 


Saya menggunakan lab dari Generic University milik InsiderPHD, yang dirancang untuk mensimulasikan lingkungan IT departemen di sebuah kampus. Aplikasi di lab ini sengaja dibuat dengan celah-celah keamanan untuk menjadi latihan bagi para penetration tester.

Pada aplikasi tersebut, digunakan teknologi GraphQL API. GraphQL inilah yang akan saya gunakan untuk melakukan demonstrasi praktis terkait attack vector pada GraphQL API.
Dalam konteks metodologi pentesting web apps yang telah saya buat, terdapat beberapa elemen penting yang perlu diperhatikan:
  • Program Requirements (Syarat pelaksanaan Bug Bounty / Pentesting)
  • Security Framework Concept (CIA Triad) & Risk Assessment (Analisis Risiko)
  • Analysis Attack Surface (Analisis Asset Target) & Threat Modeling (Membuat Skema Model Penyerangan)
Lengkapnya Disini:
https://muh-hidayat7799.medium.com/ngesec-bebas-3-how-to-avoid-n-a-on-submissions-9acf14ef7ba1

Dengan pemahaman tersebut, kita dapat melanjutkan ke pembahasan lebih mendalam mengenai 3 hal diatas. Berikut adalah rincian tentang cakupan target dan syarat pelaksanaan yang relevan untuk pentesting pada aplikasi berbasis GraphQL.

3.2.1. Program Requirements (Syarat pelaksanaan Bug Bounty / Pentesting)

In-Scope (Cakupan Target):

  • Domain: Domain atau subdomain yang diizinkan untuk diuji, seperti http://192.168.244.128:1001/.
  • Aplikasi: Generic University Web Apps.
  • Bug Diterima: Jenis bug yang diperbolehkan, seperti SQL Injection, XSS, CSRF, dll.
  • Level Risiko: Kategori risiko yang diterima, seperti Critical, High, Medium, Low.

Out-of-Scope (Luar Cakupan Target):

  • Domain: Domain atau subdomain yang tidak boleh diuji.
  • Aplikasi: Fitur atau modul yang dikecualikan.
  • Bug Tidak Diterima: Jenis bug atau masalah yang tidak sesuai dengan kriteria cakupan, seperti masalah non-sekuriti atau fungsionalitas yang tidak berhubungan dengan keamanan.

3.2.2 Analysis Attack Surface (Analisis Asset Target) & Threat Modeling (Membuat Skema Model Penyerangan)

3.2.2.1 Attack Surface

Discover schema information
Untuk menggunakan introspection untuk menemukan informasi schema, query field __schema. Field ini tersedia pada root type dari semua queries. Menemukan informasi schema ini membantu dalam analisis attack surface, karena dapat mengungkapkan struktur dan fungsi internal dari API yang memungkinkan pengujian lebih mendalam terhadap potensi kerentanan.


Setelah menjalankan query introspection ini, ditemukan beberapa schema menarik:
  • Query
  • Mutation
Schema-schema ini akan menjadi attack surface kita. Selanjutnya, kita akan mengeksplorasi attack surface tersebut secara lebih detail untuk mengidentifikasi potensi kerentanan yang dapat dieksploitasi.

Query 

Response query ini menunjukkan beberapa endpoint penting, seperti users, grades, vulnerabilities, class, dan roles. Informasi ini mungkin terkait dengan data user, grade, vulnerability, class, dan role.

Hasil ini akan digunakan untuk menentukan threat modeling tahap selanjutnya. Dengan memahami struktur dan fungsi dari setiap field, kita bisa mengidentifikasi potensi celah keamanan dan mengembangkan strategi pengujian yang lebih efektif.

Mutation 

Response query ini menunjukkan beberapa endpoint penting, seperti users, grades, vulnerabilities, class, dan roles, serta mutations seperti updateUserPassword, userMutation, dan gradeMutation. Informasi ini mungkin terkait dengan data user, grade, vulnerability, class, dan role, serta memungkinkan perubahan data seperti password dan grade.

Hasil ini akan digunakan untuk menentukan threat modeling tahap selanjutnya. Dengan memahami struktur dan fungsi dari setiap field dan mutation, kita bisa mengidentifikasi potensi celah keamanan dan mengembangkan strategi pengujian yang lebih efektif.

3.2.2.2 Threat Modeling

Exploit & Vulnerability Analysis

Kurang lebih yang akan saya bahas terkait attack vector GraphQL di Generic university ini ga banyak, yaitu:

Broken Object Level Authorization (BOLA)


Analisis:

  • Berdasarkan introspection, Query users memungkinkan akses ke detail pengguna dengan ID tertentu. Tanpa kontrol akses yang memadai, pengguna dapat mengganti ID dan mengakses informasi pengguna lain.
  • Field seperti password dan remember_token adalah data sensitif yang seharusnya tidak dapat diakses secara langsung melalui query.

Ancaman:

  • Unauthorized Access: Pengguna dapat memodifikasi ID untuk mengakses informasi pribadi dari pengguna lain.
  • Data Exposure: Data sensitif yang dapat digunakan untuk serangan lebih lanjut, seperti peretasan akun atau pencurian identitas.

Mitigasi:

  • Terapkan kontrol akses berbasis objek untuk memastikan hanya pengguna yang memiliki hak akses yang sesuai yang dapat mengakses data pengguna tertentu.
  • Hapus atau batasi akses ke field sensitif seperti password dan remember_token.

Broken Function Level Authorization (BFLA)

Analisis:

  • Berdasarkan introspection, mutation updateUserPassword memungkinkan perubahan password untuk pengguna dengan ID tertentu. Tanpa kontrol akses yang tepat, pengguna yang tidak sah dapat memanfaatkan fungsi ini untuk mengganti password akun orang lain, termasuk akun admin.
  • Mutation ini mengembalikan field sensitif seperti id, name, password, dan remember_token, yang seharusnya tidak terpapar atau diubah oleh pengguna yang tidak berwenang.

Ancaman:

  • Unauthorized Access: Pengguna yang tidak sah dapat menggunakan mutation ini untuk mengubah password akun lain, termasuk akun dengan hak istimewa administratif, yang dapat menyebabkan akses dan kontrol tidak sah.
  • Privilege Escalation: Mengubah password melalui mutation ini dapat mengakibatkan eskalasi hak istimewa, di mana penyerang mendapatkan akses ke akun dengan hak lebih tinggi dari yang dimiliki.

Mitigasi:

  • Terapkan kontrol akses berbasis peran untuk memastikan bahwa hanya pengguna dengan izin yang sesuai yang dapat menjalankan fungsi sensitif seperti updateUserPassword.
  • Validasi hak akses pengguna sebelum mengizinkan mereka mengakses fungsi yang memodifikasi data sensitif untuk mencegah tindakan tidak sah dan melindungi integritas data.


Bonus Tips

Inspection & Mapping Query dengan GraphQL Voyager

https://apis.guru/graphql-voyager/

GraphQL Voyager adalah alat yang berguna untuk pentester yang ingin memahami struktur dan hubungan dalam API GraphQL. Dengan GraphQL Voyager, pentester dapat memvisualisasikan API GraphQL sebagai grafik interaktif, yang memudahkan dalam menganalisis kontrol akses dan menemukan potensi celah keamanan. Alat ini membantu dalam mengidentifikasi titik-titik lemah dengan menyediakan gambaran jelas tentang schema dan hubungan antar objek, serta memungkinkan pentester untuk mengeksplorasi endpoint API dengan lebih mendalam. Dengan pemahaman visual dari struktur API, pentester dapat lebih efektif dalam merancang pengujian dan mengevaluasi kerentanan keamanan.

1. Copy Query inspection yang disediakan Graphql Voyager



2. Paste hasilnya di kolom “Paste Instropection Here”. Lalu klik display

3. Terlihat hasil object, data dll


InQL - Graphql Scanner - Extention Burp

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

InQL v5.0 adalah alat penting bagi pentester yang menargetkan GraphQL endpoints. Alat ini menyediakan scanner yang dapat dikustomisasi untuk menganalisis GraphQL API atau file introspeksi schema. Scanner ini menghasilkan semua kemungkinan queries dan mutations, menyajikannya dalam format terorganisir untuk penilaian keamanan yang mendalam. Pentester dapat menggunakan hasilnya untuk mengidentifikasi potensi kerentanan dan mengirimkannya ke alat Burp Suite seperti Repeater atau Intruder untuk eksploitasi dan analisis lebih lanjut.

1. Copy URL lengkap website Graphql ke kolom, Lalu klik Analyze

2. Muncul semua Schema hasil Instrospection, lalu pilih salah satu untuk di teruskan di repeater, dengan klik kanan, pilih Repeater.

3. Ubah sedikit sesuaikan data yang ingin di extract lalu send repeater.

Kesimpulan:

Untuk pentester yang ingin menguji aplikasi web berbasis GraphQL, fokus utama harus pada analisis kontrol akses di level objek dan fungsi. Pentester perlu memanfaatkan introspection untuk memahami struktur schema dan API endpoints, serta mengidentifikasi potensi celah keamanan seperti kontrol akses yang lemah dan sensitive data yang tidak terlindungi. Pengujian harus mencakup verifikasi bahwa hanya pengguna yang berwenang yang dapat mengakses data atau menjalankan fungsi tertentu.

GraphQL memberikan fleksibilitas dalam pengambilan data tetapi juga menghadirkan tantangan keamanan yang spesifik. Dengan pendekatan yang hati-hati dan teknik mitigation strategies yang tepat, pentester dapat mengidentifikasi dan mengeksploitasi vulnerabilities, memastikan bahwa aplikasi GraphQL aman dan tidak rentan terhadap serangan yang dapat merusak integrity dan security data.


Komentar