Scanner di siti Web di base per sottopagine in Python

Jan 26 2023
Ciao a tutti! Nell'articolo di oggi, parlerò di come possiamo creare una versione semplice di uno strumento che può essere utilizzato nei test di penetrazione per trovare sottopagine esistenti per i siti web. Come indica il titolo, userò Python, ma questo non è obbligatorio, perché può essere fatto anche in altri linguaggi.

Ciao a tutti! Nell'articolo di oggi, parlerò di come possiamo creare una versione semplice di uno strumento che può essere utilizzato nei test di penetrazione per trovare sottopagine esistenti per i siti web. Come indica il titolo, userò Python, ma questo non è obbligatorio, perché può essere fatto anche in altri linguaggi.

● Cosa fa uno scanner di siti web?

Lo scopo di questo tipo di scanner è rilevare se esistono sottopagine specifiche su un determinato sito web. Nel caso in cui tu abbia familiarità con il termine di attacco di forza bruta per le password, il principio è quasi lo stesso, solo che al posto delle password hai delle sottopagine.

Ci sono 2 parti obbligatorie: il sito Web in cui deve essere eseguita la scansione e un file di testo contenente un elenco di possibili sottopagine.

● Un semplice esempio per una migliore comprensione

Consideriamo https://www.nicevintagecars.com come il nostro sito web (ipotetico, non esiste). È abbastanza semplice, con solo 4 voci nel menu: Home , About , Gallery e Contact . Se qualcuno naviga nel sito, troverà solo le pagine sopra menzionate. Tuttavia, ciò non significa automaticamente che siano gli unici disponibili. A volte le cose esistono, anche se non sono visibili.

Abbiamo uno dei 2 elementi necessari, ne rimane un altro. Il nostro file di testo potrebbe essere composto da un paio di possibili sottopagine: admin , secret , luxury , auction e owners .

Sulla base dei 2 componenti del nostro esempio, lo scanner verificherà l'esistenza dei seguenti collegamenti:

▪ https://www.nicevintagecars.com/admin
▪ https://www.nicevintagecars.com/secret
▪ https://www.nicevintagecars.com/luxury
▪ https://www.nicevintagecars.com/auction
▪ https https://www.nicevintagecars.com/owners

Alcuni di loro potrebbero esistere, altri no. O forse nessuno di questi esiste. Ma lo scanner può aiutarci a scoprire.

● Come facciamo a sapere se esiste una pagina?

Diresti che devi solo digitare il collegamento nel browser, premere <Invio> e vedere se viene visualizzato qualcosa. Che è corretto. Ma non è un'opzione adatta per il nostro programma. Non è una soluzione fattibile nemmeno per te, nel caso in cui la tua lista sia lunga 1000 righe.

La storia dietro il controllo è questa: quando il client accede alla pagina Web nel proprio browser, invia una richiesta al server in cui è ospitato il sito Web. In quella richiesta, richiede una risorsa. Il server restituisce una risposta e, in base al codice di stato ricevuto, viene determinato il risultato. Se è 200, la pagina si carica bene (questo è il codice più comune). Un codice di stato 404 implica la mancata ricerca della pagina.

Una pagina può esistere su un sito Web, anche se il codice di stato ricevuto non è 200. Ad esempio, puoi ottenere 401 o 403. Ciò non significa che la pagina non è stata trovata, semplicemente non sei autenticato o non autorizzato.

● Passi nel nostro algoritmo

Ci sono 3 fasi che considero essenziali:

▪ ottenere l'input

Come si dice, dobbiamo impostare i nostri 2 elementi richiesti, la pagina web e l'elenco delle directory (o anche dei file, funziona anche in questo caso).

▪ creando l'elenco completo degli URL da scansionare

In questo passaggio, per ogni riga del nostro file di testo, prenderemo quel valore e lo aggiungeremo alla fine dell'URL principale, separandoli con un carattere "/". Successivamente, memorizzeremo il collegamento finale in una variabile di tipo elenco.

▪ inviare richieste per ogni URL e determinarne lo stato

Come passaggio finale, prenderemo l'elenco creato in precedenza e lo analizzeremo. Per ogni collegamento, invieremo una richiesta get e verificheremo se il suo codice di stato è 200. In tal caso, mostreremo semplicemente quel collegamento come valido.

C'è un approccio diverso che ho avuto quando ho creato una versione avanzata di questo strumento. Non ho filtrato i risultati in base al codice di stato 200, ho solo escluso quelli con 404. Come ho detto in precedenza, alcune pagine esistono anche se il codice di stato non è 200.

Puoi trovare questa versione sul mio profilo GitHub, usando il link qui sotto:

● Codificare il nostro programma

Il codice che presenterò qui è quello di base, il minimo necessario per il funzionamento di questo strumento.

Secondo i passaggi presentati in precedenza, la prima cosa da fare è ottenere il nostro contributo. Ho creato 2 variabili per memorizzare ciascuno di questi 2 elementi, ma ho anche importato il modulo delle richieste . Ne avremo bisogno in seguito, quando invieremo le richieste get. Prendi in considerazione che questo non è un modulo Python predefinito, quindi devi prima installarlo.

import requests

# Define variables

main_url = "https://www.nicevintagecars.com"
wordlist = "directories.txt" # Directories must be each on a different row

# Create list of URLs to scan

full_url_list = []
dirs = open(wordlist, 'r')
for directory in dir:
    url = main_url + "/" + directory.strip()
    full_url_list.append(url)

# Send get requests to URLs

print("Scan started...\n")

for url in full_url_list:
    url_request = requests.get(url)
    if url_request.status_code == 200:
        print("Found:", url)

print("\nScan finished!")

Nel video qui sotto, puoi vedere l'intero tutorial in cui creo questo scanner, lo eseguo e verifico anche i risultati che ho ottenuto. Dare un'occhiata!

● Dichiarazione di non responsabilità

Questo articolo è solo a scopo didattico. L'utilizzo dello strumento per attaccare obiettivi senza previo consenso reciproco è illegale. Non mi assumo alcuna responsabilità e non sono responsabile per qualsiasi uso improprio o danno causato da questo strumento.

Per ora è tutto, spero vi sia piaciuto. Grazie per il tempo che hai dedicato a leggere questo! Ci vediamo al mio prossimo articolo!