İyi günler Türk Hack Team ailesi.
Uzun zamandır yeni konu yayınlamıyordum.
Bugün sizlere faydalı olabileceğini düşündüğüm GraphQL ile ilgili bir konu paylaşacağım.
Bu konu içerisinde olabildiğince detaya girmeye çalışacağım.
Ardından tekrar inzivaya çekileceğim![Smile :) :)](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
GraphQL Nedir ve Nerede, Neden Kullanılır?
GraphQL Nedir?
GraphQL, Facebook tarafından geliştirilen ve 2015 yılında açık kaynak olarak sunulan bir sorgu dilidir.
REST API'lere alternatif olarak geliştirilmiş olup, istemcilerin ihtiyaç duydukları verileri daha esnek ve verimli bir şekilde sorgulamalarına olanak tanır.
Temel Özellikler
Esneklik: İstemciler, ihtiyaç duydukları belirli veri parçalarını sorgulayabilirler.
Verimlilik: Tek bir istekle birden fazla kaynaktan veri alınabilir.
Tip Güvenliği: GraphQL şeması, veri türlerini ve ilişkileri tanımlar, bu da istemcilerin hangi verilere erişebileceğini önceden bilmesini sağlar.
GraphQL'in neden önemli olduğunu anlamamız için nerede ve neden kullanıldığını anlamamız gerekiyor.
Bundan dolayı aşağıda yazacağım alanları okumanızı ve anlamlandırmanız için kendi içinizde sorgulamanızı istiyorum.
GraphQL mobil ve web tarafında yaygın bir şekilde kullanılır.
GraphQL, REST API'lerinde istemcilerin genellikle ihtiyaç duymadıkları büyük veri blokları almasının önüne geçerek yalnızca gerekli veri parçalarını çekmelerine olanak tanıdığı için tercih edilir. Ayrıca, farklı kaynaklardan gelen verileri tek bir sorguda birleştirebilmesi, API'lerin self-documenting (kendini belgeleyen) yapısıyla entegrasyonun kolaylaşması, güçlü geliştirici araçları sunması ve istemcilerin verileri belirli parçalara ayırarak sorgulamalarına imkan tanıyarak veri aktarımını ve işleme sürelerini optimize etmesi gibi özellikleriyle öne çıkar.
Temel Sorgular
GraphQL genellikle GET ve POST yöntemlerini destekler. İntrospeksiyon, şema bilgilerini ortaya çıkarmak için kullanılır ve saldırganlara hedef sistemin yapısını anlamada yardımcı olur.
Örnek sorgular
Tüm tiplerin adlarını bulmak için:
Tüm alanlar ve argümanları listelemek için:
Hataları İnceleme
Hata mesajları, sistem hakkında önemli ipuçları verebilir.
Hata mesajlarını tetiklemek için geçersiz sorgular gönderme:
Veri Çıkarma
Şemayı ve alanları öğrendikten sonra, veri çıkarma işlemleri yapılabilir. Örneğin, bir "user" nesnesi varsa, değerlerini almak için şu sorgu kullanılabilir:
Uzun zamandır yeni konu yayınlamıyordum.
Bugün sizlere faydalı olabileceğini düşündüğüm GraphQL ile ilgili bir konu paylaşacağım.
Bu konu içerisinde olabildiğince detaya girmeye çalışacağım.
Ardından tekrar inzivaya çekileceğim
![PpUz4Fr.gif](https://i.imgur.com/PpUz4Fr.gif)
GraphQL Nedir ve Nerede, Neden Kullanılır?
![umBqNLP.png](https://i.imgur.com/umBqNLP.png)
GraphQL Nedir?
![7402UV0.png](https://i.imgur.com/7402UV0.png)
GraphQL, Facebook tarafından geliştirilen ve 2015 yılında açık kaynak olarak sunulan bir sorgu dilidir.
REST API'lere alternatif olarak geliştirilmiş olup, istemcilerin ihtiyaç duydukları verileri daha esnek ve verimli bir şekilde sorgulamalarına olanak tanır.
Temel Özellikler
Esneklik: İstemciler, ihtiyaç duydukları belirli veri parçalarını sorgulayabilirler.
Verimlilik: Tek bir istekle birden fazla kaynaktan veri alınabilir.
Tip Güvenliği: GraphQL şeması, veri türlerini ve ilişkileri tanımlar, bu da istemcilerin hangi verilere erişebileceğini önceden bilmesini sağlar.
![aTg2fii.png](https://i.imgur.com/aTg2fii.png)
GraphQL'in neden önemli olduğunu anlamamız için nerede ve neden kullanıldığını anlamamız gerekiyor.
Bundan dolayı aşağıda yazacağım alanları okumanızı ve anlamlandırmanız için kendi içinizde sorgulamanızı istiyorum.
GraphQL mobil ve web tarafında yaygın bir şekilde kullanılır.
GraphQL, REST API'lerinde istemcilerin genellikle ihtiyaç duymadıkları büyük veri blokları almasının önüne geçerek yalnızca gerekli veri parçalarını çekmelerine olanak tanıdığı için tercih edilir. Ayrıca, farklı kaynaklardan gelen verileri tek bir sorguda birleştirebilmesi, API'lerin self-documenting (kendini belgeleyen) yapısıyla entegrasyonun kolaylaşması, güçlü geliştirici araçları sunması ve istemcilerin verileri belirli parçalara ayırarak sorgulamalarına imkan tanıyarak veri aktarımını ve işleme sürelerini optimize etmesi gibi özellikleriyle öne çıkar.
![gQwbQJA.png](https://i.imgur.com/gQwbQJA.png)
Temel Sorgular
![0xxmkeY.png](https://i.imgur.com/0xxmkeY.png)
GraphQL genellikle GET ve POST yöntemlerini destekler. İntrospeksiyon, şema bilgilerini ortaya çıkarmak için kullanılır ve saldırganlara hedef sistemin yapısını anlamada yardımcı olur.
Örnek sorgular
Tüm tiplerin adlarını bulmak için:
Kod:
{__schema{types{name}}}
![PSdpo5O.png](https://i.imgur.com/PSdpo5O.png)
Tüm alanlar ve argümanları listelemek için:
Kod:
{__schema{types{name,fields{name,args{name,description,type{name,kind}}}}}}
![PUsgsxW.png](https://i.imgur.com/PUsgsxW.png)
Hataları İnceleme
Hata mesajları, sistem hakkında önemli ipuçları verebilir.
Hata mesajlarını tetiklemek için geçersiz sorgular gönderme:
Kod:
{benaslindayogum}
![zYrNoJ0.png](https://i.imgur.com/zYrNoJ0.png)
Veri Çıkarma
Şemayı ve alanları öğrendikten sonra, veri çıkarma işlemleri yapılabilir. Örneğin, bir "user" nesnesi varsa, değerlerini almak için şu sorgu kullanılabilir:
JSON:
{
user(id: "1") {
id
name
email
}
}
![cDM8ve0.png](https://i.imgur.com/cDM8ve0.png)
Saldırı Vektörleri
![0xxmkeY.png](https://i.imgur.com/0xxmkeY.png)
Yetkilendirme ve Kimlik Doğrulama (Authorization and Authentication)
GraphQL API'leri, REST API'lerine göre daha ince taneli veri erişim kontrolüne ihtiyaç duyar. Yanlış yapılandırılmış yetkilendirme, kullanıcıların yetkileri dışında verilere erişmesine neden olabilir. Örneğin, konunun öncesinde bahsettiğim sorgu ile kullanıcılara erişmeyi deneyebilirsiniz.
JSON:
query {
user(id: "123") {
id
username
email
}
}
Batch Querying ve Denial of Service (DoS) Saldırıları
GraphQL, tek bir istekte birden fazla sorgunun yapılmasına izin verir. Bu özellik, saldırganların sunucuyu aşırı yüklemesine neden olabilir.
Yani, sunucuyu daha fazla veri döndürmesine zorlayabilirsiniz.
JSON:
query {
nestedField1 {
nestedField2 {
nestedField3 {
nestedField4 {
...
}
}
}
}
}
Bu tür bir sorgu, sunucunun işleme kapasitesini zorlayarak hizmet reddi saldırısına yol açabilir.
Mass Assignment (Toplu Atama) Saldırıları
GraphQL API'leri, istemcilerin veri yapısını belirlemesine izin verir. Bunu yapmak için genellikle mutation komutlarını kullanırız. Böylece yetkisiz alanlara veri ekleyebiliriz.
Mass Assignment (Toplu Atama) Saldırıları
GraphQL API'leri, istemcilerin veri yapısını belirlemesine izin verir. Bunu yapmak için genellikle mutation komutlarını kullanırız. Böylece yetkisiz alanlara veri ekleyebiliriz.
JSON:
mutation {
updateUser(id: "123", input: {role: "admin"}) {
id
role
}
}
Bu sorgu, bir kullanıcının yetkisiz bir şekilde yönetici rolüne yükseltilmesine neden olabilir.
Injection Saldırıları
GraphQL sorguları, doğrudan veritabanı işlemlerine dönüşür. Bu, SQL enjeksiyonu gibi klasik saldırılara açık olabilir.
Injection Saldırıları
GraphQL sorguları, doğrudan veritabanı işlemlerine dönüşür. Bu, SQL enjeksiyonu gibi klasik saldırılara açık olabilir.
JSON:
query {
user(username: "\" OR 1=1 --") {
id
username
}
}
"Deep Query" (Derin Sorgu) Saldırısı
Derin sorgu saldırısı, kötü niyetli bir kullanıcının çok derin ilişkili sorgular göndererek sunucunun aşırı yüklenmesini sağlar.
Derin sorgu saldırısı, kötü niyetli bir kullanıcının çok derin ilişkili sorgular göndererek sunucunun aşırı yüklenmesini sağlar.
JSON:
{
user(id: "1") {
friends {
friends {
friends {
// Bu şekilde derinleşerek devam edebilir.
}
}
}
}
}
Over-fetching ve Under-fetching Saldırıları
GraphQL'in en büyük avantajlarından biri, istemcilerin tam olarak ihtiyaç duydukları veriyi alabilmeleridir. Ancak, bu esneklik kötüye kullanılabilir.
GraphQL'in en büyük avantajlarından biri, istemcilerin tam olarak ihtiyaç duydukları veriyi alabilmeleridir. Ancak, bu esneklik kötüye kullanılabilir.
JSON:
{
user(id: "1") {
id
name
email
address
phone
orders {
id
total
items {
id
name
price
}
}
}
}
Bu sorgu, tek bir kullanıcı hakkında çok fazla bilgi çekerek sunucu kaynaklarını tüketebilir. Over-fetching saldırıları, hizmet reddi (DoS) saldırılarına yol açabilir.
Stored XSS
Zafiyet, komutların hedef sunucuda kalıcı olarak saklanması ve daha sonra kullanıcıya bir web sayfası olarak sunulmasıdır. Örneğin, bir GraphQL mutation kullanılarak sunucuya saklanan ve daha sonra kullanıcıya gönderilen temizlenmemiş girdiler stored XSS saldırılarına yol açabilir.
Stored XSS
Zafiyet, komutların hedef sunucuda kalıcı olarak saklanması ve daha sonra kullanıcıya bir web sayfası olarak sunulmasıdır. Örneğin, bir GraphQL mutation kullanılarak sunucuya saklanan ve daha sonra kullanıcıya gönderilen temizlenmemiş girdiler stored XSS saldırılarına yol açabilir.
![BHw6F9M.png](https://i.imgur.com/BHw6F9M.png)
OS Command Injection
Bir mutation veya sorgunun kullanıcı girdilerini bir sistem komutunda kullanması durumunda ortaya çıkabilir. Örneğin, sunucu bir URL'den avatar resmi çekmek için kullanıcı girdilerini shell komutlarına (wget, cURL vb.) dahil ettiğinde, yetersiz doğrulama veya temizleme nedeniyle komut enjeksiyonu gerçekleşebilir.
Server-Side Request Forgery (SSRF)
Saldırganın kötü niyetli bir GraphQL sorgusu veya mutasyonu sunarak, bir URL'yi değişken veya argüman olarak göndermesiyle gerçekleşebilir. Bu, savunmasız bir sunucu veya sisteme yetkisiz HTTP isteklerinin yapılmasına neden olabilir.
İpuçları
Yaygın Endpoint İsimleri
GraphQL servisleri genellikle benzer endpoint ekleri kullanır. GraphQL endpoint'lerini test ederken, evrensel sorguları aşağıdaki konumlara göndermelisiniz:
/graphql
/api
/api/graphql
/graphql/api
/graphql/graphql
Eğer bu yaygın endpoint'ler GraphQL yanıtı döndürmezse, yolun sonuna /v1 eklemeyi de deneyebilirsiniz.
Bir mutation veya sorgunun kullanıcı girdilerini bir sistem komutunda kullanması durumunda ortaya çıkabilir. Örneğin, sunucu bir URL'den avatar resmi çekmek için kullanıcı girdilerini shell komutlarına (wget, cURL vb.) dahil ettiğinde, yetersiz doğrulama veya temizleme nedeniyle komut enjeksiyonu gerçekleşebilir.
![MNr9WTf.png](https://i.imgur.com/MNr9WTf.png)
Server-Side Request Forgery (SSRF)
Saldırganın kötü niyetli bir GraphQL sorgusu veya mutasyonu sunarak, bir URL'yi değişken veya argüman olarak göndermesiyle gerçekleşebilir. Bu, savunmasız bir sunucu veya sisteme yetkisiz HTTP isteklerinin yapılmasına neden olabilir.
![RDuV7Wc.png](https://i.imgur.com/RDuV7Wc.png)
İpuçları
![0xxmkeY.png](https://i.imgur.com/0xxmkeY.png)
Yaygın Endpoint İsimleri
GraphQL servisleri genellikle benzer endpoint ekleri kullanır. GraphQL endpoint'lerini test ederken, evrensel sorguları aşağıdaki konumlara göndermelisiniz:
/graphql
/api
/api/graphql
/graphql/api
/graphql/graphql
Eğer bu yaygın endpoint'ler GraphQL yanıtı döndürmezse, yolun sonuna /v1 eklemeyi de deneyebilirsiniz.
![0xxmkeY.png](https://i.imgur.com/0xxmkeY.png)