SQL Injection
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 nedir?
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.
Giriş noktası tespiti
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.
Yorumlar
Mantıksal işlemlerle doğrulama
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:
Zaman ile Doğrulama
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 Uç Belirleme
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.
PortSwigger ile Tanımlama
Union Tabanlı İstismar
Sütun sayısını tespit etme
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:
Order/Group by
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.
UNION SELECT
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.
Veritabanı adlarını, tablo adlarını ve sütun adlarını çıkarın
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.
Gizli Birleşim Tabanlı Sömürme
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.
Hata Tabanlı Sömürme
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.
Blind SQLi'yi İstismar Etme
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:
Hata Kör SQLi Sömürüsü
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:
Zaman Tabanlı SQLi İstismar Etme
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 Queries
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
Out of band Exploitation
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:
XXE aracılığıyla bant dışı veri sızdırma
Otomatik Sömürü
Bir SQLi zafiyetini sqlmap ile sömürmek için SQLMap Cheatsheet dosyasını kontrol edin.
Teknolojiye özel bilgiler
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.
Kimlik Doğrulama Atlatma
Giriş işlevini atlatmaya çalışmak için liste:
Login bypass ListHam hash kimlik doğrulama Atlatma
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.
Enjekte Edilmiş Hash Kimlik Doğrulama Atlatma
Ö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)
GBK Kimlik Doğrulama Atlatma
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:
Polyglot injection (multicontext)
Insert Statement
Mevcut nesne/kullanıcının şifresini değiştirme
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
SQL Truncation Attack
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
MySQL Ekleme zaman tabanlı kontrol
VALUES ifadesinden çıkmak için düşündüğünüz kadar ','',''
ekleyin. Gecikme gerçekleşirse, bir SQLInjection'a sahipsiniz.
ON DUPLICATE KEY UPDATE
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 veadmin_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ınpassword
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).
Extract information
Aynı anda 2 hesap oluşturma
Yeni bir kullanıcı ve kullanıcı adı oluşturulmaya çalışıldığında, şifre ve e-posta gereklidir:
Onaltılık veya ondalık kullanma
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
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:
WAF Bypass
Boşluk olmadan bypass
No Space (%20) - boşluk alternatifleri kullanarak bypass
No Whitespace - yorumlar kullanarak atlatma
No Whitespace - parantez kullanarak atlatma
Virgül bypass'ı
Virgül - OFFSET, FROM ve JOIN kullanarak bypass
Genel Atlatmalar
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
Bilimsel Notasyon WAF atlatma
Bu hile hakkında daha derin bir açıklamayı gosecure blog adresinde bulabilirsiniz. Temelde, WAF'ı atlatmak için bilimsel notasyonu beklenmedik şekillerde kullanabilirsiniz:
Bypass Column Names Restriction
Ö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.
WAF atlatma öneri araçları
Diğer Kılavuzlar
Brute-Force Tespit Listesi
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.
Last updated