1. Introduction
1.1 Apa itu GraphQL
1.2 REST API vs GraphQL
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 objekhero
. - Subfield
name
: Di dalam objekhero
, query meminta fieldname
, yang mengindikasikan bahwa hanya nama darihero
yang diminta.
2.1.2 Response Query - Graphql:
- Root Object
data
: Semua respons GraphQL dibungkus dalam objekdata
. - Field
hero
: Sesuai dengan query, objekhero
dikembalikan. - Field
name
: Di dalam objekhero
, fieldname
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 mengidentifikasihuman
dengan ID tertentu.
2.2.1 Request Query - Graphql:
- Query Structure: Query dimulai dengan
{}
, yang menandakan bahwa ini adalah sebuah query. - Field
human
dengan Argumentid
: Field ini meminta objekhuman
dengan spesifik menggunakan argumentid
dengan nilai"1000"
. - Subfields
name
danheight
: Di dalam objekhuman
, query meminta fieldname
danheight
, yang mengindikasikan bahwa hanya nama dan tinggi darihuman
yang diminta.
2.2.2 Response Query - Graphql:
- Root Object
data
: Semua respons GraphQL dibungkus dalam objekdata
. - Field
human
: Sesuai dengan query, objekhuman
dikembalikan. - Field
name
danheight
: Di dalam objekhuman
, fieldname
memiliki nilai"Luke Skywalker"
dan fieldheight
memiliki nilai1.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
danrightComparison
digunakan sebagai alias untuk mempermudah identifikasi dalam respons.- Alias
leftComparison
: Mengambil datahero
dari episodeEMPIRE
dan menggunakan fragmentcomparisonFields
. - Alias
rightComparison
: Mengambil datahero
dari episodeJEDI
dan menggunakan fragmentcomparisonFields
.
- Alias
- Fragments:
comparisonFields
digunakan untuk menghindari pengulangan dalam query, memungkinkan pengambilan beberapa field yang sama pada berbagai objek.- Fragment
comparisonFields
: Mengambil fieldname
,appearsIn
, danfriends
yang terdiri dari subfieldname
.
- Fragment
2.3.2 Response Query - Graphql:
- Root Object
data
: Semua respons GraphQL dibungkus dalam objekdata
. - Field
leftComparison
: Sesuai dengan query, objekleftComparison
dikembalikan dengan fieldname
,appearsIn
, danfriends
.- Field
name
: Nilai"Luke Skywalker"
. - Field
appearsIn
: Daftar episode di mana Luke Skywalker muncul:"NEWHOPE"
,"EMPIRE"
, dan"JEDI"
. - Field
friends
: Daftar teman dengan fieldname
masing-masing:"Han Solo"
,"Leia Organa"
,"C-3PO"
, dan"R2-D2"
.
- Field
- Field
rightComparison
: Sesuai dengan query, objekrightComparison
dikembalikan dengan fieldname
,appearsIn
, danfriends
. - Field
name
: Nilai"R2-D2"
. - Field
appearsIn
: Daftar episode di mana R2-D2 muncul:"NEWHOPE"
,"EMPIRE"
, dan"JEDI"
. - Field
friends
: Daftar teman dengan fieldname
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
bertipeEpisode!
dan$review
bertipeReviewInput!
.- Variable
$ep
: Menyimpan episode yang akan di-review. - Variable
$review
: Menyimpan data review yang akan ditambahkan.
- Variable
- Fields: Mutation meminta field
stars
dancommentary
dari hasilcreateReview
.
2.4.2 Response Query - Graphql:
- Variable
ep
: Nilai"JEDI"
, menentukan episode yang di-review. - Variable
review
: Objek yang berisi fieldstars
dengan nilai5
dancommentary
dengan nilai"This is a great movie!"
. - Root Object
data
: Semua respons GraphQL dibungkus dalam objekdata
. - Field
createReview
: Sesuai dengan mutation, objekcreateReview
dikembalikan dengan fieldstars
dancommentary
. - Field
stars
: Nilai5
, 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 objekdata
. - Field
__schema
: Berisi informasi tentang schema yang diminta.- Field
types
: Daftar tipe yang ada dalam schema, misalnyaQuery
,String
,ID
, dll.
- Field
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.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)
https://muh-hidayat7799.medium.com/ngesec-bebas-3-how-to-avoid-n-a-on-submissions-9acf14ef7ba1
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)
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.- Query
- Mutation
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.
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 AnalysisKurang lebih yang akan saya bahas terkait attack vector GraphQL di Generic university ini ga banyak, yaitu:
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
danremember_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
danremember_token
.
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
, danremember_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/
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.
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.