SQL açığının nasıl sömürüldüğünü öğrenmeden önce nasıl ortaya çıktığını anlatmamız gerekiyor. O zaman bir simülasyon oluşturalım.
Web sitemizde ürünlerimizi listeliyor olalım. Bu durumda bir ürünün detay sayfası için "product.php" sayfasını kullandığımızı varsayalım. Biz "product.php" sayfasında hangi ürünü göstereceğimizi, sayfaya gelen kullanıcının verdiği
query string'den anlıyoruz. Bu durumda "https://mybeautifulwebsite.com/product.php?
id=5" şeklinde bir istek ile gelindiğinde biz gelen HTTP isteğini ayrıştırarak kullanıcının verdiği ID değerini alıyoruz ve veri tabanına SQL sorgusu olarak gönderiyoruz. Bunu farklı programlama dillerinde farklı şekillerde yapıyor olsak bile genel mantık aynıdır;
<?php
$product_id = $_GET["id"];
$sql = "SELECT* FROM products WHERE id = $product_id";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);
echo "Ürün: ".$row["name"];
?>
Burada görüldüğü gibi 2. satırda gelen HTTP isteğindeki "id" değerini aldık ve 3. satırda, product tablosundaki id değeri HTTP isteğinde gönderilen id değerine eşit olan kaydı getirmesini istedik (bu durumda id no 5 olan kayıt gelecek). Böylece ekrana 6. satırda, SQL'den dönen sonucun "name" değerini basıtrabildik. Yani bizim RAW SQL sorgumuz şu şekilde yorumlanıyor;
SELECT* FROM products WHERE id = 5
Detaylı bilgiler için;
https://www.atakdomain.com/blog/sql-select-nedir-kullanimi-nasildir-orneklerle-anlatim
https://kodlamaklazim.com/blog/php-select-islemi
Şimdi gelelim açığın oluşma sebebine ve bunu istismar etmeye.
Yukarıdaki örnek normal bir geliştirme sürecini anlatıyor olsa da bu şekilde kullanımında bir güvenlik açığı mevcut. 3. satırda kullanıcıdan alınan değer direkt olarak SQL sunucusuna gönderildi, hiç bir kontrol mekanizması devreye girmedi. Bu durumda kötü niyetli kişiler HTTP isteğinde id değeri olarak SQL sorgusunu manipüle ederlerse ve güvenlik önemli de alınmazsa veri tabanındaki farklı kayıtlara erişmek mümkün olur.
Örneğin burada HTTP isteği ile "id=5 OR 1=1" şeklinde bir veri gönderildiğinde, WHERE komutundan sonra sanki SQL sorgusu devam ediyormuş gibi bir algı oluşur ve sunucu tarafından yorumlanan SQL sorgusu şu hale gelir;
SELECT* FROM products WHERE id=5 OR 1=1
Bu aynı zamanda birazda SQL bilgisi olan birinin sistem üzerinde her türlü cambazlığı yapmasına olanak sağlayacaktır. Şayet ID değerinden sonra gönderilen bütün kayıtlar veri tabanı sunucunda işlenecektir.
Bu da bizi sorunuzun cevabına götürüyor; EVET her türlü işlem yapılabilir. Yeter ki SQL bilginiz olsun.
Burada güzel bir makale var; https://infosecwriteups.com/sql-injection-with-insert-statement-bdcf4d47d178
Umarım faydalı olur ^^