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 dariheroyang diminta.
2.1.2 Response Query - Graphql:
- Root Object
data: Semua respons GraphQL dibungkus dalam objekdata. - Field
hero: Sesuai dengan query, objekherodikembalikan. - Field
name: Di dalam objekhero, fieldnameberisi 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
iddigunakan untuk mengidentifikasihumandengan ID tertentu.
2.2.1 Request Query - Graphql:
- Query Structure: Query dimulai dengan
{}, yang menandakan bahwa ini adalah sebuah query. - Field
humandengan Argumentid: Field ini meminta objekhumandengan spesifik menggunakan argumentiddengan nilai"1000". - Subfields
namedanheight: Di dalam objekhuman, query meminta fieldnamedanheight, yang mengindikasikan bahwa hanya nama dan tinggi darihumanyang diminta.
2.2.2 Response Query - Graphql:
- Root Object
data: Semua respons GraphQL dibungkus dalam objekdata. - Field
human: Sesuai dengan query, objekhumandikembalikan. - Field
namedanheight: Di dalam objekhuman, fieldnamememiliki nilai"Luke Skywalker"dan fieldheightmemiliki 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:
leftComparisondanrightComparisondigunakan sebagai alias untuk mempermudah identifikasi dalam respons.- Alias
leftComparison: Mengambil dataherodari episodeEMPIREdan menggunakan fragmentcomparisonFields. - Alias
rightComparison: Mengambil dataherodari episodeJEDIdan menggunakan fragmentcomparisonFields.
- Alias
- Fragments:
comparisonFieldsdigunakan untuk menghindari pengulangan dalam query, memungkinkan pengambilan beberapa field yang sama pada berbagai objek.- Fragment
comparisonFields: Mengambil fieldname,appearsIn, danfriendsyang terdiri dari subfieldname.
- Fragment
2.3.2 Response Query - Graphql:
- Root Object
data: Semua respons GraphQL dibungkus dalam objekdata. - Field
leftComparison: Sesuai dengan query, objekleftComparisondikembalikan 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 fieldnamemasing-masing:"Han Solo","Leia Organa","C-3PO", dan"R2-D2".
- Field
- Field
rightComparison: Sesuai dengan query, objekrightComparisondikembalikan 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 fieldnamemasing-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:
CreateReviewForEpisodeadalah nama mutation ini. - Variables: Mutation ini menggunakan dua variable,
$epbertipeEpisode!dan$reviewbertipeReviewInput!.- Variable
$ep: Menyimpan episode yang akan di-review. - Variable
$review: Menyimpan data review yang akan ditambahkan.
- Variable
- Fields: Mutation meminta field
starsdancommentarydari hasilcreateReview.
2.4.2 Response Query - Graphql:
- Variable
ep: Nilai"JEDI", menentukan episode yang di-review. - Variable
review: Objek yang berisi fieldstarsdengan nilai5dancommentarydengan nilai"This is a great movie!". - Root Object
data: Semua respons GraphQL dibungkus dalam objekdata. - Field
createReview: Sesuai dengan mutation, objekcreateReviewdikembalikan dengan fieldstarsdancommentary. - 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:
__schemaadalah nama field yang digunakan untuk introspeksi schema. - Fields: Query ini meminta field
typesyang 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:
.png)
Analisis:
- Berdasarkan introspection, Query
usersmemungkinkan akses ke detail pengguna dengan ID tertentu. Tanpa kontrol akses yang memadai, pengguna dapat mengganti ID dan mengakses informasi pengguna lain. - Field seperti
passworddanremember_tokenadalah 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
passworddanremember_token.
Analisis:
- Berdasarkan introspection, mutation
updateUserPasswordmemungkinkan 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.


.png)
.png)
.png)
.png)

.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)