SQL Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
RootedCON İspanya'daki en önemli siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilgiyi teşvik etme misyonu ile bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
SQL enjeksiyonu, saldırganların bir uygulamanın veritabanı sorgularıyla etkileşimde bulunmasına olanak tanıyan bir güvenlik açığıdır. Bu zafiyet, saldırganların görmesine, değiştirmesine veya silmesine izin verebilir; bu, diğer kullanıcıların bilgileri veya uygulamanın erişebileceği herhangi bir veri dahil olmak üzere, erişmemeleri gereken verilere erişim sağlar. Bu tür eylemler, uygulamanın işlevselliğinde veya içeriğinde kalıcı değişikliklere veya hatta sunucunun tehlikeye girmesine veya hizmetin reddine yol açabilir.
Bir sitenin, SQLi ile ilgili girdilere alışılmadık sunucu yanıtları nedeniyle SQL enjeksiyonuna (SQLi) duyarlı olduğu görünüyorsa, ilk adım, sorguya veri enjekte etmenin ve bunu bozmadan yapmanın yolunu anlamaktır. Bu, mevcut bağlamdan etkili bir şekilde kaçış yöntemini belirlemeyi gerektirir. İşte bazı faydalı örnekler:
Sonra, sorguyu hatasız hale getirmeyi bilmeniz gerekiyor. Sorguyu düzeltmek için veri girebilir ve önceki sorgunun yeni veriyi kabul etmesini sağlayabilirsiniz veya sadece verinizi girebilir ve sonuna bir yorum sembolü ekleyebilirsiniz.
Hata mesajlarını görebiliyorsanız veya bir sorgunun çalıştığında ve çalışmadığında farklılıkları fark edebiliyorsanız, bu aşama daha kolay olacaktır.
SQL injection zafiyetini doğrulamanın güvenilir bir yöntemi, bir mantıksal işlem gerçekleştirmek ve beklenen sonuçları gözlemlemektir. Örneğin, ?username=Peter
gibi bir GET parametresinin ?username=Peter' or '1'='1
olarak değiştirildiğinde aynı içeriği vermesi, bir SQL injection zafiyetini gösterir.
Benzer şekilde, matematiksel işlemlerin uygulanması etkili bir doğrulama tekniği olarak hizmet eder. Örneğin, ?id=1
ve ?id=2-1
erişimlerinin aynı sonucu vermesi, SQL injection'ı gösterir.
Mantıksal işlem doğrulamasını gösteren örnekler:
Bu kelime listesi, önerilen şekilde SQL enjeksiyonlarını doğrulamak için oluşturulmuştur:
Bazı durumlarda, test ettiğiniz sayfada hiçbir değişiklik fark etmeyeceksiniz. Bu nedenle, kör SQL enjeksiyonlarını keşfetmenin iyi bir yolu, veritabanının işlemler yapmasını sağlamak ve bu işlemlerin sayfanın yüklenme süresi üzerinde etkisi olacaktır. Bu nedenle, SQL sorgusuna tamamlanması uzun sürecek bir işlemi birleştireceğiz:
Bazı durumlarda sleep fonksiyonlarına izin verilmeyecek. O zaman, bu fonksiyonları kullanmak yerine, sorgunun karmaşık işlemler gerçekleştirmesini sağlayabilirsiniz. Bu tekniklerin örnekleri her teknoloji için ayrı ayrı yorumlanacaktır (varsa).
Arka ucu belirlemenin en iyi yolu, farklı arka uçların fonksiyonlarını çalıştırmaya çalışmaktır. Önceki bölümdeki sleep fonksiyonlarını veya bu fonksiyonları kullanabilirsiniz (tablo payloadsallthethings:
Ayrıca, sorgunun çıktısına erişiminiz varsa, veritabanının sürümünü yazdırmasını sağlayabilirsiniz.
Devamında, farklı SQL Injection türlerini istismar etmenin çeşitli yöntemlerini tartışacağız. Örnek olarak MySQL kullanacağız.
Sorgunun çıktısını görebiliyorsanız, bunu istismar etmenin en iyi yoludur. Öncelikle, ilk isteğin döndürdüğü sütunların sayısını bulmamız gerekiyor. Bunun nedeni, her iki sorgunun da aynı sayıda sütun döndürmesi gerektiğidir. Bu amaçla genellikle iki yöntem kullanılır:
Bir sorgudaki sütun sayısını belirlemek için, ORDER BY veya GROUP BY ifadelerinde kullanılan sayıyı kademeli olarak artırarak yanlış bir yanıt alınana kadar ayarlayın. SQL içindeki GROUP BY ve ORDER BY'nın farklı işlevlerine rağmen, her ikisi de sorgunun sütun sayısını belirlemek için aynı şekilde kullanılabilir.
Sorgu doğru olana kadar daha fazla null değeri seçin:
null
değerlerini kullanmalısınız çünkü bazı durumlarda sorgunun her iki tarafındaki sütunların türü aynı olmalıdır ve null her durumda geçerlidir.
Sonraki örneklerde, tüm veritabanlarının adını, bir veritabanının tablo adını ve tablonun sütun adlarını alacağız:
Her farklı veritabanında bu verileri keşfetmenin farklı bir yolu vardır, ancak metodoloji her zaman aynıdır.
Bir sorgunun çıktısı görünürken, ancak birleşim tabanlı bir enjeksiyon mümkün görünmüyorsa, bu gizli birleşim tabanlı enjeksiyon varlığını gösterir. Bu senaryo genellikle kör enjeksiyon durumuna yol açar. Kör enjeksiyonu birleşim tabanlı bir hale dönüştürmek için, arka plandaki yürütme sorgusunun anlaşılması gerekir.
Bu, hedef Veritabanı Yönetim Sistemi (DBMS) için varsayılan tablolarla birlikte kör enjeksiyon tekniklerinin kullanılmasıyla gerçekleştirilebilir. Bu varsayılan tabloları anlamak için, hedef DBMS'nin belgelerine başvurulması önerilir.
Sorgu çıkarıldıktan sonra, orijinal sorguyu güvenli bir şekilde kapatacak şekilde yükünüzü özelleştirmeniz gerekmektedir. Ardından, yükünüze bir birleşim sorgusu eklenir ve bu, yeni erişilebilir birleşim tabanlı enjeksiyonun sömürülmesini kolaylaştırır.
Daha kapsamlı bilgiler için Kör Enjeksiyonları İyileştirme başlıklı makaleye başvurun.
Eğer bir sebepten dolayı sorgunun çıkışını göremiyorsanız ama hata mesajlarını görebiliyorsanız, bu hata mesajlarını veritabanından veri sızdırmak için kullanabilirsiniz. Birleşim Tabanlı sömürüdeki benzer bir akışı takip ederek veritabanını dökme işlemini gerçekleştirebilirsiniz.
Bu durumda sorgunun sonuçlarını veya hataları göremezsiniz, ancak sorgunun doğru veya yanlış bir yanıt döndürdüğünü ayırdedebilirsiniz çünkü sayfada farklı içerikler vardır. Bu durumda, veritabanını karakter karakter dökmek için bu davranışı kötüye kullanabilirsiniz:
Bu, önceki durumla aynı ama sorgudan gelen doğru/yanlış yanıtı ayırt etmek yerine, SQL sorgusundaki bir hata olup olmadığını ayırt edebilirsiniz (belki HTTP sunucusu çöküyor). Bu nedenle, bu durumda doğru karakteri her tahmin ettiğinizde bir SQL hatası zorlayabilirsiniz:
Bu durumda, sayfanın bağlamına dayalı olarak sorgunun yanıtını ayırmanın herhangi bir yolu yoktur. Ancak, tahmin edilen karakter doğruysa sayfanın yüklenme süresini uzatmasını sağlayabilirsiniz. Bu tekniği daha önce SQLi zafiyetini doğrulamak için kullanırken gördük.
Stacked sorguları kullanarak birden fazla sorguyu peş peşe çalıştırabilirsiniz. Sonraki sorgular çalıştırılırken, sonuçlar uygulamaya geri döndürülmez. Bu nedenle, bu teknik esasen kör zafiyetler ile ilgilidir; burada ikinci bir sorgu kullanarak bir DNS sorgusu, koşullu hata veya zaman gecikmesi tetikleyebilirsiniz.
Oracle stacked queries'i desteklemez. MySQL, Microsoft ve PostgreSQL destekler: QUERY-1-HERE; QUERY-2-HERE
Eğer başka bir istismar yöntemi çalışmadıysa, veritabanının bilgiyi sizin kontrolünüzdeki harici bir hosta sızdırmasını sağlamayı deneyebilirsiniz. Örneğin, DNS sorguları aracılığıyla:
Bir SQLi zafiyetini sqlmap ile sömürmek için SQLMap Cheatsheet dosyasını kontrol edin.
Bir SQL Injection zafiyetini sömürmenin tüm yollarını zaten tartıştık. Bu kitapta veritabanı teknolojisine bağlı daha fazla ipucu bulabilirsiniz:
Ya da MySQL, PostgreSQL, Oracle, MSSQL, SQLite ve HQL ile ilgili birçok ipucu bulacaksınız https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection
RootedCON İspanya'daki en ilgili siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilgiyi teşvik etme misyonu ile bu kongre, her disiplinde teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
Giriş işlevini atlatmaya çalışmak için liste:
Bu sorgu, kimlik doğrulama kontrollerinde ham çıktı için true ile MD5 kullanıldığında bir güvenlik açığını sergilemektedir ve sistemi SQL injection'a karşı savunmasız hale getirmektedir. Saldırganlar, hash'lenildiğinde beklenmedik SQL komut parçaları üreten girdiler oluşturarak bunu istismar edebilir ve yetkisiz erişim sağlayabilir.
Önerilen liste:
Kullanıcı adı olarak listenin her bir satırını ve şifre olarak her zaman: Pass1234. kullanmalısınız. (Bu yükler, bu bölümün başında bahsedilen büyük listede de bulunmaktadır)
Eğer ' kaçış karakteri ile işleniyorsa %A8%27 kullanabilirsiniz ve ' kaçış karakteri ile işlendiğinde şu şekilde oluşturulacaktır: 0xA80x5c0x27 (╘')
Python betiği:
Bunu yapmak için "ana nesne" olarak adlandırılan yeni bir nesne oluşturmayı denemelisiniz (kullanıcılar için muhtemelen admin):
Adı olan kullanıcı oluşturun: AdMIn (büyük & küçük harfler)
Adı olan bir kullanıcı oluşturun: admin=
SQL Truncation Attack (kullanıcı adı veya e-posta için bazı türde uzunluk sınırı olduğunda) --> Adı olan kullanıcı oluşturun: admin [bir sürü boşluk] a
Eğer veritabanı savunmasızsa ve kullanıcı adı için maksimum karakter sayısı örneğin 30 ise ve admin kullanıcısını taklit etmek istiyorsanız, "admin [30 boşluk] a" adında bir kullanıcı adı oluşturmaya çalışın ve herhangi bir şifre belirleyin.
Veritabanı, girilen kullanıcı adının veritabanında var olup olmadığını kontrol edecektir. Eğer yoksa, kullanıcı adını izin verilen maksimum karakter sayısına (bu durumda: "admin [25 boşluk]") kesecek ve ardından veritabanında kullanıcıyı "admin" yeni şifreyle güncelleyerek sonundaki tüm boşlukları otomatik olarak kaldıracaktır (bazı hatalar ortaya çıkabilir ama bu, işlemin çalışmadığı anlamına gelmez).
Daha fazla bilgi: https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html & https://resources.infosecinstitute.com/sql-truncation-attack/#gref
Not: Bu saldırı, en son MySQL kurulumlarında yukarıda açıklandığı gibi artık çalışmayacaktır. Karşılaştırmalar varsayılan olarak son boşlukları hala göz ardı etse de, bir alanın uzunluğundan daha uzun bir dize eklemeye çalışmak bir hataya yol açacak ve ekleme başarısız olacaktır. Bu kontrol hakkında daha fazla bilgi için: https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation
VALUES ifadesinden çıkmak için düşündüğünüz kadar ','',''
ekleyin. Gecikme gerçekleşirse, bir SQLInjection'a sahipsiniz.
MySQL'deki ON DUPLICATE KEY UPDATE
ifadesi, UNIQUE indeks veya PRIMARY KEY'de bir tekrar eden değer oluşturacak şekilde bir satır eklenmeye çalışıldığında veritabanının alacağı eylemleri belirtmek için kullanılır. Aşağıdaki örnek, bu özelliğin bir yönetici hesabının şifresini değiştirmek için nasıl istismar edilebileceğini göstermektedir:
Örnek Yük Enjeksiyonu:
Bir enjeksiyon yükü şu şekilde oluşturulabilir; burada users
tablosuna iki satır eklenmeye çalışılmaktadır. İlk satır bir aldatmaca, ikinci satır ise mevcut bir yöneticinin e-posta adresini hedef alarak şifreyi güncellemeyi amaçlamaktadır:
Here's how it works:
Sorgu, generic_user@example.com
için bir ve admin_generic@example.com
için başka bir satır eklemeye çalışır.
Eğer admin_generic@example.com
için satır zaten mevcutsa, ON DUPLICATE KEY UPDATE
ifadesi tetiklenir ve MySQL'e mevcut satırın password
alanını "bcrypt_hash_of_newpassword" olarak güncellemesi talimatı verilir.
Sonuç olarak, admin_generic@example.com
ile bcrypt hash'ine karşılık gelen şifre ile kimlik doğrulama yapılmaya çalışılabilir ("bcrypt_hash_of_newpassword" yeni şifrenin bcrypt hash'ini temsil eder, bu da istenen şifrenin gerçek hash'i ile değiştirilmelidir).
Yeni bir kullanıcı ve kullanıcı adı oluşturulmaya çalışıldığında, şifre ve e-posta gereklidir:
Bu teknikle yalnızca 1 hesap oluşturarak bilgi çıkarabilirsiniz. Hiçbir şeyi yorumlamanıza gerek olmadığını belirtmek önemlidir.
hex2dec ve substr kullanarak:
Metni almak için şunu kullanabilirsiniz:
hex ve replace (ve substr) kullanarak:
RootedCON İspanya'daki en önemli siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilgiyi teşvik etme misyonu ile bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
Yönlendirilmiş SQL enjeksiyonu, enjekte edilebilir sorgunun çıktı vermediği, ancak enjekte edilebilir sorgunun çıktısının çıktı veren sorguya gittiği bir durumdur. (Kaynak: Paper)
Örnek:
No Space (%20) - boşluk alternatifleri kullanarak bypass
No Whitespace - yorumlar kullanarak atlatma
No Whitespace - parantez kullanarak atlatma
Virgül - OFFSET, FROM ve JOIN kullanarak bypass
Anahtar kelimeleri kullanarak kara liste - büyük/küçük harf kullanarak atlatma
Kelimeleri büyük/küçük harf duyarsız olarak kara listeye alma - eşdeğer bir operatör kullanarak atlatma
Bu hile hakkında daha derin bir açıklamayı gosecure blog adresinde bulabilirsiniz. Temelde, WAF'ı atlatmak için bilimsel notasyonu beklenmedik şekillerde kullanabilirsiniz:
Öncelikle, orijinal sorgu ve bayrağı almak istediğiniz tablonun aynı sayıda sütuna sahip olduğunu fark edin, sadece şunu yapabilirsiniz: 0 UNION SELECT * FROM flag
Bir tablonun üçüncü sütununa adını kullanmadan erişmek mümkündür, aşağıdaki gibi bir sorgu kullanarak: SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
, bu nedenle bir sqlinjection'da bu şöyle görünecektir:
Veya virgül atlatması kullanarak:
Bu hile https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/ adresinden alınmıştır.
RootedCON İspanya'daki en ilgili siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilgiyi teşvik etme misyonu ile bu kongre, her disiplinde teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)