PYTHON

Cara Membuat Scanner XSS Dengan Python

Pendahuluan

Cross site scripting (juga dikenal sebagai XSS ) adalah kerentanan keamanan web yang memungkinkan penyerang membahayakan interaksi yang dimiliki pengguna dengan aplikasi web yang rentan. Penyerang bertujuan untuk mengeksekusi skrip di browser web korban dengan memasukkan kode berbahaya di halaman web normal. Kelemahan yang memungkinkan jenis serangan ini cukup luas di aplikasi web yang memiliki input pengguna. Pada tutorial sebelumnya juga saya telah membuat scanner sql injection dengan python kamu bisa kunjungi di sini dalam tutorial ini, Anda akan belajar bagaimana Anda bisa menulis skrip Python dari awal untuk mendeteksi kerentanan ini.

Kita perlu menginstal perpustakaan ini:

pip3 install requests bs4

Baiklah, mari kita mulai:

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

Karena jenis kerentanan web ini dieksploitasi dalam input dan formulir pengguna, sebagai hasilnya, kami perlu mengisi formulir apa pun yang kami lihat dengan beberapa kode javascript. Jadi, pertama-tama mari kita buat fungsi untuk mendapatkan semua formulir dari konten HTML halaman web mana pun.

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

Sekarang fungsi ini mengembalikan daftar formulir sebagai objek sup , kita memerlukan cara untuk mengekstrak setiap detail dan atribut formulir (seperti action , metode , dan berbagai atribut input), fungsi di bawah ini melakukan hal itu:

def get_form_details(form):
    """
   Fungsi ini mengekstrak semua informasi yang mungkin berguna tentang `form` HTML HTML
    """
    details = {}
    # dapatkan form action (url sasaran)
    action = form.attrs.get("action").lower()
    # dapatkan method form (POST, GET, dll.)
    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")
        inputs.append({"type": input_type, "name": input_name})
    # masukkan semuanya ke kamus yang dihasilkan
    details["action"] = action
    details["method"] = method
    details["inputs"] = inputs
    return details

Setelah kami mendapatkan detail formulir, kami memerlukan fungsi lain untuk mengirimkan formulir apa pun:

def submit_form(form_details, url, value):
    """
   Mengirimkan formulir yang diberikan dalam `form_details`
    Parameter:
        form_details (daftar): kamus yang berisi informasi formulir
        url (str): URL asli yang berisi formulir itu
        value (str): ini akan diganti ke semua input teks dan pencarian
    Mengembalikan Respon HTTP setelah pengiriman formulir
    """
    # buat URL lengkap (jika url yang diberikan dalam tindakan bersifat relatif)
    target_url = urljoin(url, form_details["action"])
    # dapatkan input
    inputs = form_details["inputs"]
    data = {}
    for input in inputs:
        # ganti semua teks dan nilai pencarian dengan `value`
        if input["type"] == "text" or input["type"] == "search":
            input["value"] = value
        input_name = input.get("name")
        input_value = input.get("value")
        if input_name and input_value:
            # jika nama dan nilai input bukan Tidak Ada,
            # lalu tambahkan ke data pengiriman formulir
            data[input_name] = input_value

    if form_details["method"] == "post":
        return requests.post(target_url, data=data)
    else:
        # GET request
        return requests.get(target_url, params=data)

Fungsi di atas mengambil form_details yang merupakan output dari fungsi get_form_details() yang baru saja kita tulis sebagai argumen, yang berisi semua detail formulir, juga menerima url tempat formulir HTML asli diletakkan, dan nilai yang disetel ke setiap teks atau cari kolom input. Setelah kami mengekstrak informasi formulir, kami hanya mengirimkan formulir menggunakan metode request.get() atau request.post() (tergantung pada metode formulir ).

Sekarang kami memiliki fungsi yang siap untuk mengekstrak semua detail formulir dari halaman web dan mengirimkannya, sekarang mudah untuk memindai kerentanan XSS sekarang:

def scan_xss(url):
    """
   Diberikan `url`, ia mencetak semua formulir rentan XSS dan
    mengembalikan Benar jika ada yang rentan, Salah jika tidak
    """
    # dapatkan semua formulir dari URL
    forms = get_all_forms(url)
    print(f"[+] Detected {len(forms)} forms on {url}.")
    js_script = "<Script>alert('hi')</scripT>"
    # mengembalikan nilai
    is_vulnerable = False
    # ulangi semua bentuk
    for form in forms:
        form_details = get_form_details(form)
        content = submit_form(form_details, url, js_script).content.decode()
        if js_script in content:
            print(f"[+] XSS Detected on {url}")
            print(f"[*] Form details:")
            pprint(form_details)
            is_vulnerable = True
            # tidak akan pecah karena kami ingin mencetak formulir rentan yang tersedia
    return is_vulnerable
    Berikut adalah fungsi yang dilakukan:
  • Diberikan URL, ia mengambil semua formulir HTML dan kemudian mencetak jumlah formulir yang terdeteksi.
  • Itu kemudian mengulangi seluruh formulir dan mengirimkan formulir dengan meletakkan nilai semua teks dan mencari bidang input dengan kode Javascript.
  • Jika kode Javscript disuntikkan dan berhasil dieksekusi, maka ini adalah tanda yang jelas bahwa halaman web tersebut rentan terhadap XSS.

Mari kita coba ini:

if __name__ == "__main__":
    url = "https://xss-game.appspot.com/level1/frame"
    print(scan_xss(url))

Ini adalah situs web rentan XSS yang dimaksud, inilah hasilnya:

[+] Detected 1 forms on https://xss-game.appspot.com/level1/frame.
[+] XSS Detected on https://xss-game.appspot.com/level1/frame
[*] Form details:
{'action': '',
 'inputs': [{'name': 'query',
             'type': 'text',
             'value': "<Script>alert('hi')</scripT>"},
            {'name': None, 'type': 'submit'}],
 'method': 'get'}
True

Seperti yang Anda lihat, kerentanan XSS berhasil dideteksi, sekarang kode ini tidak sempurna untuk situs web rentan XSS mana pun, jika Anda ingin mendeteksi XSS untuk situs web tertentu, Anda mungkin perlu memfaktorkan ulang kode ini untuk kebutuhan Anda.

Disclaimer

Tujuan dari tutorial ini adalah untuk membuat Anda mengetahui jenis serangan ini dan pada dasarnya mempelajari cara mendeteksi kerentanan XSS. Tolong jangan di salah gunakan!

Sumber asli : thepythoncode.com