Nah, sebelum kita fokus nyari bug.. alangkah baiknya kita kumpulin informasi sebanyak-banyaknya
Salah satu informasinya adalah GraphQL Endpoint.. dari sini kita bisa tau target kita pake GraphQL atau REST API. Tapi gak semua web target pake endpoint yang sama kaya diatas, di bawah ini contoh-contoh endpoint yang paling umum:
/v1/explorer
/v1/graphiql
/graph
/graphql
/graphql/console/
/graphql.php
Kalo kita udah dapet endpoint graphql si target, langkah selanjutnya adalah mencari Full Schema dari GraphQL nya. “Fungsinya buat apa bang?” nah, kita bisa dapet banyak informasi dari Full Schema itu.. Misalnya; Mutation, Query, dan Fields. Introspection Query adalah salah satu cara dapetin schema secara utuh.. Contohnya di bawah ini:
{__schema{queryType{name}mutationType{name}subscriptionType{name}types{...FullType}directives{name description locations args{...InputValue}}}}fragment FullType on __Type{kind name description fields(includeDeprecated:true){name description args{...InputValue}type{...TypeRef}isDeprecated deprecationReason}inputFields{...InputValue}interfaces{...TypeRef}enumValues(includeDeprecated:true){name description isDeprecated deprecationReason}possibleTypes{...TypeRef}}fragment InputValue on __InputValue{name description type{...TypeRef}defaultValue}fragment TypeRef on __Type{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name}}}}}}}}
Sebelah kiri dari gambar diatas adalah Introspection Query, dan yang di respon adalah Full Schema nya. Kita juga bisa pake tool buat dapetin schema dari target. Contohnya InQL, informasi lebih lengkapnya bisa cek disini: https://github.com/doyensec/inql
NB: Ada kemungkinan kita gak bisa pake Introspection Query di beberapa target. Biasanya introspection query di nonaktifkan. Kenapa bang? ya tentu saja karena alasan keamanan.. Pake Nanya *Emot Batu*
Kalo ketemu kasus di atas, kita bisa pake tool Clairvoyance buat dump Schema nya.. info lengkapnya cek disini: https://github.com/nikitastupin/clairvoyance
Setelah kita dapet Full Schema dari target.. langkah selanjutnya adalah membaca alur dari Schema yang kita dapet, kita bisa manfaatin tool yang bernama GraphQL Voyager. Langkah-langkahnya di bawah ini:
1. Buka https://graphql-kit.com/graphql-voyager
2. Pilih “Change Schema”
3. Paste Full Schema yang berhasil kita dapetin
Nah dari GraphQL Voyager.. yang bisa kita lakuin adalah baca alur, dapetin field tertentu (yang mungkin gak ada di front-end webnya), data apa aja yg disembunyikan dari aplikasi kalo dipake user secara normal, dan lain-lain.
Setelah kita baca alur, dapetin field tersembunyi, dan beberapa info lainnya. Langkah selanjutnya eksploitasi. Terus nyari bug apa bang? Ya kaya biasanya aja sih.. bisa IDOR, Cross Site Scripting (XSS), Business Logic Error, SQL Injection, dsb.
Apa itu Query? Umumnya query adalah pernyataan atau perintah untuk mengambil data dari server. Contohnya di bawah ini:
query {
getUserDetail(userId: Int!) {
email
full_name
address
}
}
Contoh di atas adalah query untuk mengambil data user dari database. Dan userId: Int! adalah argumen untuk menentukan data mana yang mau kita ambil. Sedangkan email, full_name, dan address adalah data yang akan muncul di respon. Di bawah ini adalah contoh penggunaan query untuk mengambil data user dengan ID 182.
Apa itu Mutation? Kebalikan dari query, Umumnya Mutation adalah pernyataan atau perintah untuk menulis, mengubah, dan menghapus data dari di database. Contohnya di bawah ini:
mutation {
deleteUserAddress(id: Int!)
}
Contoh di atas adalah mutation untuk mengambil menghapus alamat user dari database. Sedangkan id: Int! adalah argumen untuk menentukan data dengan ID berapa yang mau kita hapus. Berikut contoh penggunaan Mutation
Terakhir.. Beberapa Query dan Mutation tertentu mungkin bentuknya gini:
mutation {
addProductReview(input: ProductReviewInput!) {
# Contains the completed product review
review {
name
product_id
title
text
}
}
}
Apa maksudnya input: ProductReviewInput! di atas? kalo kita ketemu mutation atau query kaya di atas, kita gak bisa langsung masukin ID (Integer) atau String secara langsung, kita harus balik lg ke GraphQL Voyager buat cek apa aja isi dari Objek ProductReviewInput. Contohnya ada di bawah ini:
Dari gambar di atas.. name, product_id, title, dan text adalah isi dari objek ProductReviewInput. Contoh:
{name: "hacker", product_id: "ABCDEF1234", title: "Mantap", text: "Produknya bagus sesuai deskripsi, pengiriman juga cepat"}
Sekian artikel dari gw.. maaf kalo ada kalimat atau penjelasan yang sulit dipahami. Semoga ini bisa jadi referensi buat belajar.. Thank you ^^
Buat yang mau kasih bansos bisa kesini ya gess wkwkwk ✌️