> For the complete documentation index, see [llms.txt](https://emre-ermenek.gitbook.io/sqli-egitimi/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://emre-ermenek.gitbook.io/sqli-egitimi/sql-injection-sqli-egitim-modulu-ve-portswigger/relational-dbmsler-nasil-calisir.md).

# Relational DBMSler nasıl çalışır

**Tablo Nedir?**

Tablolar, verilerin satır ve sütunlar (row & column) halinde tutulduğu yapılardır. Bir veritabanındaki her tablo, belirli bir nesneyi temsil eder (Örneğin; `Kullanıcılar`, `Ürünler` veya `Yorumlar`).

* **Sütunlar (Columns/Fields):** Tablonun iskeletidir. Her sütunun bir adı ve **veri tipi** vardır.

  > **Dikkat:** Eğer bir sütun "Sayı" (Integer) bekliyorsa ve siz oraya "Metin" (String) girmeye çalışırsanız veritabanı hata verir. Bu hata mesajları, biz hackerlar için veritabanının iç yapısını anlamamızı sağlayan birer ipucudur!
* **Key Field (Birincil Anahtar):** Genellikle **Auto-increment** özelliğiyle her satıra benzersiz bir sayı (1, 2, 3...) atanır. Bu, o satırı diğerlerinden ayıran "T.C. Kimlik Numarası" gibidir.
* **Satırlar (Rows/Records):** Tabloya girilen her bir gerçek veridir. Bir kullanıcı kayıt olduğunda tabloya yeni bir satır eklenir; hesabı silindiğinde ise o satır yok olur.

Örnek users tablosu:

| **id (Int/AI)** | **username (String)** | **password (String)** |
| --------------- | --------------------- | --------------------- |
| 1               | administrator         | 1851f72v...           |
| 2               | wiener                | peter                 |
| 3               | carlos                | montoya               |

Bu tablolardan veriyi SQL sorgularını kullanarak çekeriz

**Temel SQL Sorguları**

Veritabanından verileri çekmek, eklemek veya değiştirmek için SQL dilini kullanırız. Ancak SQL Injection zafiyetlerini sömürürken bizim en çok odaklanacağımız komut, verileri okumamızı sağlayan **SELECT** komutudur.

Bir sızma testi uzmanının (veya hacker'ın) bilmesi gereken en temel yapılar şunlardır:

**1. SELECT ve FROM (Veriyi Çekmek)** Veritabanına "Bana şu tablodan şu sütunları getir" deme şeklimizdir.

* `SELECT username, password FROM users;` (Sadece kullanıcı adlarını ve şifreleri getirir.)
* `SELECT * FROM users;` (Yıldız işareti "her şeyi getir" demektir. Tablodaki tüm sütunları döker.)

**2. WHERE (Filtreleme ve Koşul)** Uygulamalar genellikle veritabanındaki her şeyi ekrana basmaz. Belirli bir veriyi ararlar. Örneğin bir giriş sayfasında arka planda şu sorgu çalışır:

* `SELECT * FROM users WHERE username = 'administrator' AND password = '123';`*(Çevirisi: Kullanıcılar tablosuna git, adı administrator VE şifresi 123 olan satırı getir. Eğer eşleşirse sisteme giriş yapmama izin ver.)*

> **Hacker'ın Gözünden:** SQL Injection saldırılarının %90'ı işte bu **WHERE** kısmında gerçekleşir. Girdiğimiz zararlı kodlarla bu koşulu manipüle ederiz.

**3. Yorum Satırları (Sorguyu Kesip Atmak)** Bir kod satırının sonuna yorum işareti koyarsanız, veritabanı o işaretten sonraki hiçbir şeyi okumaz. Bu, uygulamanın orijinal sorgusunu "öldürüp" kendi istediğimiz kodları çalıştırmak için en büyük silahımızdır.

* **`-`** (Çift tire): PostgreSQL, SQLite ve MS SQL'de kullanılır.
* **`#`** veya **`-`** (Boşluklu çift tire): MySQL'de kullanılır.
* Örnek: `SELECT * FROM users WHERE username = 'admin' -- VE SIFRE KONTROLU BURADA KALDI...` (Veritabanı tirelerden sonrasını okumadığı için şifre sormadan admin hesabına gireriz!)

**4. UNION (Sorguları Birleştirmek)**

İki farklı `SELECT` sorgusunun sonucunu tek bir tabloda (alt alta) birleştirmeye yarar.

```sql
SELECT username FROM users UNION SELECT name FROM products;
```

*(Örneğin bu sorgu, hem kullanıcıları hem de ürün isimlerini aynı ekranda alt alta listeler.)*

İleride göreceğimiz "UNION-Based SQL Injection" saldırılarının tam kalbidir. Hackerlar bu masum birleştirme komutunu, uygulamanın orijinal sorgusuna kendi zararlı sorgularını "kaynak yapmak" için kullanırlar. *(Bunun nasıl yapıldığını ve veritabanının bizden istediği o meşhur altın kuralları bir sonraki bölümde detaylıca göreceğiz.)*

Peki nasıl oluyor da SQL sorguları manipüle edilebiliyor. Aslında her şey yazılımcının bizden aldığı input’a fazla güvenmesiyle başlıyor.
