PYTHON

Cara Membuat Scanner Sql Injection Dengan Python

Pendahuluan

Injeksi SQL adalah teknik injeksi kode yang digunakan untuk mengeksekusi kueri SQL melalui data input pengguna ke aplikasi web yang rentan. Ini adalah salah satu teknik peretasan web yang paling umum dan berbahaya. Eksploitasi injeksi SQL yang berhasil dapat menyebabkan banyak kerusakan berbahaya pada database dan aplikasi web secara umum. Misalnya, dapat membaca data sensitif seperti kata sandi pengguna dari database, memasukkan, mengubah, dan bahkan menghapus data. Dalam tutorial ini, Anda akan belajar cara membuat skrip Python sederhana untuk mendeteksi kerentanan injeksi SQL di aplikasi web.

Mari kita instal perpustakaan yang diperlukan untuk tutorial ini:

pip3 install requests bs4

Mari impor modul yang diperlukan:

import requests
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin
from pprint import pprint

# inisialisasi sesi HTTP & atur browser
s = requests.Session()
s.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36"

Kami juga menginisialisasi sesi permintaan dan mengatur agen pengguna. Karena injeksi SQL adalah tentang input pengguna, kita perlu mengekstrak formulir web terlebih dahulu. Beruntung bagi kami, saya sudah menulis tutorial tentang mengekstraksi dan mengisi formulir dengan Python , kami akan membutuhkan fungsi-fungsi di bawah ini:

def get_all_forms(url):
    """Diberikan `url`, ia mengembalikan semua formulir dari konten HTML"""
    soup = bs(s.get(url).content, "html.parser")
    return soup.find_all("form")


def get_form_details(form):
    """
    Fungsi ini mengekstrak semua informasi yang mungkin berguna tentang `form` HTML HTML
    """
    details = {}
    # dapatkan tindakan formulir (target url)
    try:
        action = form.attrs.get("action").lower()
    except:
        action = None
    # dapatkan metode formulir (POST, GET, etc.)
    method = form.attrs.get("method", "get").lower()
    # dapatkan semua detail input seperti jenis dan nama
    inputs = []
    for input_tag in form.find_all("input"):
        input_type = input_tag.attrs.get("type", "text")
        input_name = input_tag.attrs.get("name")
        input_value = input_tag.attrs.get("value", "")
        inputs.append({"type": input_type, "name": input_name, "value": input_value})
    # masukkan semuanya ke kamus yang dihasilkan
    details["action"] = action
    details["method"] = method
    details["inputs"] = inputs
    return details

get_all_forms() menggunakan perpustakaan BeautifulSoup untuk mengekstrak semua tag formulir dari HTML dan mengembalikannya sebagai daftar Python, sedangkan get_form_details() fungsi mendapatkan objek tag formulir tunggal sebagai argumen dan mem-parsing informasi yang berguna tentang formulir, seperti tindakan (URL target), metode ( GET, POST, dll) dan semua atribut bidang input ( type, name dan value).

Selanjutnya, kami mendefinisikan fungsi yang memberi tahu kami apakah halaman web memiliki kesalahan SQL di dalamnya, ini akan berguna saat memeriksa kerentanan injeksi SQL:

def is_vulnerable(response):
    """Fungsi boolean sederhana yang menentukan apakah suatu halaman
    apakah SQL Injection rentan dari `respons` .nya"""
    errors = {
        # MySQL
        "you have an error in your sql syntax;",
        "warning: mysql",
        # SQL Server
        "unclosed quotation mark after the character string",
        # Oracle
        "quoted string not properly terminated",
    }
    for error in errors:
        # jika Anda menemukan salah satu kesalahan ini, kembalikan Benar
        if error in response.content.decode().lower():
            return True
    # tidak ada kesalahan yang terdeteksi
    return False

Jelas, saya tidak dapat menentukan kesalahan untuk semua server basis data, untuk pemeriksaan yang lebih andal, Anda perlu menggunakan ekspresi reguler untuk menemukan kecocokan kesalahan, periksa file XML ini yang memiliki banyak dari mereka (digunakan oleh utilitas sqlmap ).

Sekarang kita memiliki semua alat, mari kita definisikan fungsi utama yang mencari semua formulir di halaman web dan mencoba menempatkan karakter kutipan dan kutipan ganda di bidang input:

def scan_sql_injection(url):
    # tes di URL
    for c in "\"'":
        # tambahkan karakter kutipan/kutipan ganda ke URL
        new_url = f"{url}{c}"
        print("[!] Trying", new_url)
        # buat permintaan HTTP
        res = s.get(new_url)
        if is_vulnerable(res):
            # SQL Injection terdeteksi pada URL itu sendiri, 
            # tidak perlu didahului untuk mengekstraksi formulir dan mengirimkannya
            print("[+] SQL Injection vulnerability detected, link:", new_url)
            return
    # tes pada formulir HTML
    forms = get_all_forms(url)
    print(f"[+] Detected {len(forms)} forms on {url}.")
    for form in forms:
        form_details = get_form_details(form)
        for c in "\"'":
            # badan data yang ingin kami kirimkan
            data = {}
            for input_tag in form_details["inputs"]:
                if input_tag["type"] == "hidden" or input_tag["value"]:
                    # formulir input apa pun yang disembunyikan atau memiliki nilai tertentu,
                    # gunakan saja dalam bentuk tubuh
                    try:
                        data[input_tag["name"]] = input_tag["value"] + c
                    except:
                        pass
                elif input_tag["type"] != "submit":
                    # semua yang lain kecuali kirim, gunakan beberapa data sampah dengan karakter khusus
                    data[input_tag["name"]] = f"test{c}"
            # gabungkan url dengan tindakan (form request URL)
            url = urljoin(url, form_details["action"])
            if form_details["method"] == "post":
                res = s.post(url, data=data)
            elif form_details["method"] == "get":
                res = s.get(url, params=data)
            # menguji apakah halaman yang dihasilkan rentan
            if is_vulnerable(res):
                print("[+] SQL Injection vulnerability detected, link:", url)
                print("[+] Form:")
                pprint(form_details)
                break

Sebelum mengekstrak formulir dan mengirimkannya, fungsi di atas memeriksa kerentanan di URL terlebih dahulu, karena URL itu sendiri mungkin rentan, ini cukup dilakukan dengan menambahkan karakter kutipan ke URL. Kami kemudian membuat permintaan menggunakan perpustakaan permintaan dan memeriksa apakah konten respons memiliki kesalahan yang kami cari.

Setelah itu, kami mengurai formulir dan membuat pengiriman dengan karakter kutipan pada setiap formulir yang ditemukan, inilah hasil pengujian saya pada halaman web yang diketahui rentan:

if __name__ == "__main__":
    url = "http://testphp.vulnweb.com/artists.php?artist=1"
    scan_sql_injection(url)

Keluaran:

[!] Trying http://testphp.vulnweb.com/artists.php?artist=1"
[+] SQL Injection vulnerability detected, link: http://testphp.vulnweb.com/artists.php?artist=1"

Seperti yang Anda lihat, ini rentan di URL itu sendiri, tetapi setelah saya menguji ini di server rentan lokal saya ( DVWA ), saya mendapatkan hasil ini:

[!] Trying http://localhost:8080/DVWA-master/vulnerabilities/sqli/"
[!] Trying http://localhost:8080/DVWA-master/vulnerabilities/sqli/'
[+] Detected 1 forms on http://localhost:8080/DVWA-master/vulnerabilities/sqli/.
[+] SQL Injection vulnerability detected, link: http://localhost:8080/DVWA-master/vulnerabilities/sqli/
[+] Form:
{'action': '#',
 'inputs': [{'name': 'id', 'type': 'text', 'value': ''},
            {'name': 'Submit', 'type': 'submit', 'value': 'Submit'}],
 'method': 'get'}

Kesimpulan

Perhatikan bahwa saya telah menguji skrip ini di banyak situs web yang rentan dan berfungsi dengan baik. Namun, jika Anda menginginkan alat injeksi SQL yang lebih andal, pertimbangkan untuk menggunakan sqlmap , yang juga ditulis dalam bahasa Python, dan ini mengotomatiskan proses pendeteksian serta mengeksploitasi kelemahan injeksi SQL. Anda dapat memperluas kode ini dengan menambahkan fitur eksploitasi, lembar contekan ini dapat membantu Anda menggunakan perintah SQL yang tepat. Atau Anda mungkin ingin mengekstrak semua tautan situs web dan memeriksa kerentanan di semua halaman situs, Anda juga dapat melakukannya!


Disclaimer

Tolong jangan di salah gunakan pada tutorial ini, saya tidak bertanggung jawab, tutorial ini hanya untuk tujuan pendidikan.

Sumber asli : thepythoncode