İd'ye attım tırnağı aldım syntaxı, verdim sqlmape çektim datayı.
Herkese tekrardan selam konuları boş oldukça atıyorum. Bu gün ki konumuz başlıktaki yazdığı üzere SQL Injection.
~Tanım~
SQL injection, bir web uygulamasına yapılan kötü niyetli bir saldırı türüdür. Bu saldırıda saldırgan, bir web formu, arama kutusu veya başka bir giriş alanına, SQL sorgusu olarak kullanılacak olan kodu ekler. Uygulama, kullanıcının girdiği bu kodu doğrudan SQL sorgusu olarak çalıştırır ve bu da uygulamayı etkileyen bir güvenlik açığına yol açar. SQL injection saldırıları, web uygulamalarında yaygın bir güvenlik açığıdır. Uygulama geliştiricileri, güvenli kodlama tekniklerini kullanarak, kullanıcı girdilerini güvenli bir şekilde işleyerek ve özel karakterlerin kullanımını sınırlayarak bu tür saldırılardan korunabilirler.
~Uygulama~
Labımızdan Sql Injection tarafına tıkladığımız da önümüzde bu şekilde bir sayfa açılıyor.
Hemen aklınıza sql login bypass gelebilir. ( ' OR '1'='1--), fakat burada sql injection yok bunun kaynak kodunada analiz kısmında değineceğim.
Bu lab üzerinde sizlere anlatmak istediğim zafiyetin direk erişebileceğimiz yerde çıkmamasıdır. Artık çoğu zafiyet kullanıcının bir oturum açtıktan sonra önümüze gelen dashboard, panel gibi yerlerde çıkmasıdır.
Verilen bilgiler ile login olalım.
Burada önümüze OwaspTop10 listesinin açıldığını görüyoruz.
Sıralama sisteminin id ile sıralama yaptığını fark edince birinin üzerine tıklıyorum.
Tahmin ettiğimiz gibi tablodaki yazıları veri tabanından çekiyor ve bunu id ile alıyor, burada sql injection zafiyetini tespit etmek ve sorguya müdahale etmek için ' işaretini atmayı deniyoruz.
Daha demin tabloya yansıyan veriler gitti demek ki burada syntax hatası almadığımıza göre bir blind sql injection açığı var.
Manuel Sql ile tonlarca konu olduğu için sqlmap aracı ile db yi çekeceğim.
Bilmeyenler için --dbs parametresi ile database isimlerini çekmek istediğimi --batch parametresi ile ise bize sorulan soruları otomatik yes veya no demesini sağlıyorum.
önümüze database isimlerini getirdi, burada ben owasptop10 çekeceğim isteyen istediğini çekebilir.
-D ile çekmek istediğim database ismini yazdıktan sonra --tables parametresi ile tablo isimlerini çekiyorum.
administrator colonundaki tüm bilgileri --dump yazarak çekiyorum.
giriş bilgilerini de çektiğimize göre zafiyeti sömürdük.
~Zafiyetin Kaynaklandığı Yer~
Login.php kısmı basit görüldüğü üzere eğer kullanıcı adı ve şifre admin:admin değilse hata verdiriyor doğru ise dashboard.php ye yönlendiriliyor.
dashboard.php dosyasında ise owasp.php den id değeri ile yönlendirme attığını görüyoruz.
owasp.php kodunu analiz etmemiz gerekirse,
- Veritabanına bağlanır ve karakter kodlamasını UTF-8 olarak ayarlıyor.
- URL'de belirtilen 'id' değişkeninden gelen veriyi alır.
- 'id' değişkeni belirtilmişse, SQL sorgusu kullanarak OWASP Top 10 veritabanındaki sıralama numarası eşleşen zafiyet ve açıklamaları alır.
- Karakter dizisi içinde tek tırnak varsa, yasaklı karakter kullanıldığına dair bir uyarı gösterir ve 'id' değişkenini boşaltır.
- Alınan verileri tablo biçiminde ekrana yazdırır.
Fakat;
Bu koddaki zafiyet, kullanıcı tarafından verilen 'id' parametresinin doğru bir şekilde işlenmediği ve sorgu dizgesine doğrudan yerleştirildiği SQL enjeksiyonuna açık olmasıdır.
Kullanıcı tarafından sağlanan 'id' değeri doğru şekilde filtrelenmediğinden, kötü niyetli bir kullanıcı bu parametreye özel karakterler ekleyerek sorguyu değiştirebilir ve veritabanından istenmeyen verileri çekebilir veya manipüle edebilir.
Örneğin: ?id=1'; DROP TABLE owasptop10; -- gibi bir sorgu yazılırsa bu sorgu, SQL enjeksiyonu yoluyla 'owasptop10' tablosunu siler. Bu nedenle, 'id' değerinin doğru şekilde doğrulanması ve filtrelenmesi gerekmektedir.
zafiyeti ise bindparam kullanarak kapatabiliriz.
Okuduğunuz İçin Teşekkürler
Bu koddaki zafiyet, kullanıcı tarafından verilen 'id' parametresinin doğru bir şekilde işlenmediği ve sorgu dizgesine doğrudan yerleştirildiği SQL enjeksiyonuna açık olmasıdır.
Kullanıcı tarafından sağlanan 'id' değeri doğru şekilde filtrelenmediğinden, kötü niyetli bir kullanıcı bu parametreye özel karakterler ekleyerek sorguyu değiştirebilir ve veritabanından istenmeyen verileri çekebilir veya manipüle edebilir.
Örneğin: ?id=1'; DROP TABLE owasptop10; -- gibi bir sorgu yazılırsa bu sorgu, SQL enjeksiyonu yoluyla 'owasptop10' tablosunu siler. Bu nedenle, 'id' değerinin doğru şekilde doğrulanması ve filtrelenmesi gerekmektedir.
zafiyeti ise bindparam kullanarak kapatabiliriz.
PHP:
$error = "";
try {
$bag = new PDO('mysql:host=localhost;dbname=owasptop10', "root", "");
$bag->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$bag->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$id = $_GET['id'];
if (isset($id)) {
$stmt = $bag->prepare("SELECT * FROM owasptop10 WHERE sıralama = :id");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetchAll();
echo "<table border='1' width='400px'>";
echo "<tr><th>Sıralama</th><th>Zafiyet</th><th>Açıklama</th></tr>";
foreach ($result as $row) {
echo "<tr><td>".@$row["sıralama"]."</td><td>".@$row["zafiyet"]."</td><td>".@$row["aciklama"]."</td></tr>";
}
echo "</table>";
}
} catch(PDOException $e) {
$error = $e->getMessage();
}
if (!empty($error)) {
echo "Hata: " . $error;
}
Okuduğunuz İçin Teşekkürler
Son düzenleme: