Cortando: exemplo de injecção sql para um programa c ++
injeção de código ocorre quando o usuário seduz seu programa C ++ para executar algum pedaço de código criado pelo usuário. "O que? Meu programa nunca faria isso!”, Você diz. Considere o mais comum e, felizmente, mais fácil de entender variante deste pequeno truque: injeção de SQL.
Conteúdo
Aqui estão alguns fatos sobre SQL:
SQL (Muitas vezes pronunciado “sequela”) significa Structured Query Language.
SQL é a linguagem mais comum para acessar bancos de dados.
SQL é usado quase universalmente no acesso a bancos de dados relacionais.
Se você ainda não sabe SQL, é suficiente dizer que SQL é muitas vezes interpretado em tempo de execução. Muitas vezes, as declarações C ++ irá enviar uma consulta SQL para um servidor separado banco de dados e, em seguida, processo e exibição de qualquer que seja o servidor envia de volta. Uma consulta SQL típica dentro de um C ++ programa pode parecer com o seguinte:
* Consulta de char = "SELECT * de transações ONDE accountid = `123456789`-"Resultados = enviar (query) -
Este código diz, “SELECIONAR todos os campos A PARTIR DE tabela de transações ONDE a accountid (Presumivelmente um dos campos na tabela de transação) é igual a 123456789 (id conta do usuário) “A. enviar() função de biblioteca pode enviar esta consulta off para o servidor de banco de dados.
Video: Aula 002 - Proteção contra SQL Injection PHP
O servidor de banco de dados iria responder com todos os dados que tem sobre cada transação que o usuário já fez nesta conta, que ficam armazenados na coleção resultados. O programa, então, iterar resultados, provavelmente exibindo as transações em uma tabela com cada transação em uma linha separada.
O usuário provavelmente não precisa que muitos dados. Talvez apenas aquelas transações entre data de início e data final, duas variáveis que o programa lê a partir da página de consulta do usuário. Este programa mais seletivo C ++ pode conter uma declaração como a seguinte:
* Consulta de char = "* SELECT FROM transações ONDE accountid = `123456789`"" e data gt; `" + + StartDate "`E DATA lt; `" + + EndDate "`-"-
Se o usuário digita 2013/10/01 para um data de início e 2013/11/01 para data final, em seguida, a consulta resultante que é enviado para o banco de dados é o seguinte:
* SELECT FROM transações ONDE accountid = `123456789` ANDdate gt; `2013/10/01` e data lt; `2013/11 / 1`
Em outras palavras, mostrar todas as transações realizadas no mês de outubro de 2013. Isso faz sentido. Qual é o problema?
O problema surge se o programa simplesmente aceita tudo o que o usuário digita como datas de início e fim e conecta-los para a consulta. Ele não faz qualquer verificação para certificar-se de que o usuário está entrando apenas uma data e nada mais que uma data. Este programa é muito confiante.
E se um hacker entrasse 2013/10/01 para o data de início, mas para o data final ele entrasse algo como 2013/11/01` OR accountid = `234567890. (Observe as aspas simples desequilibradas.) Agora a consulta SQL combinado que é enviado para o servidor de banco de dados seria semelhante
* SELECT FROM transações ONDE accountid = `123456789` ANDdate gt; `2013/10/01` e data lt; `2013/11/01` ORaccountID = `234567890`-
Este diz: “Mostre-me todas as transações para a conta 123456789 para o mês de outubro 2013, além de todas as transações para outra conta 234.567.890 que eu não possuo para qualquer data.”
Este pequeno exemplo pode levantar algumas questões: Ele não sabe - ele apenas tenta entrar SQL falso em cada campo que aceite texto personagem e vê o que acontece “Como é que o hacker sabe que ele pudesse entrar instruções SQL no lugar de datas?” . Se o programa reclama, “Isso não é uma data legal”, então o hacker sabe que o programa verifica para se certificar de que as datas de entrada são válidos e injeção de SQL não vai funcionar aqui.
Se, por outro lado, o programa exibe uma mensagem de erro como instrução SQL ilegal, em seguida, o hacker sabe que o programa aceita a entrada falsa e enviado-lo para o servidor de banco de dados que, em seguida, chutou para trás. Sucesso! Agora tudo o que tem a fazer é formular a consulta apenas para a direita.
Video: SQL Injection com SQLMAP - Vulnerabilidades Web #7
Então como é que o hacker sabe que o ID da conta foi chamado accountid? Ele não sabia o que quer, mas quanto tempo seria necessário para adivinhar que um? Hackers são muito persistentes.
Finalmente, como é que o hacker sabe que 234567890 foi um número de conta válido? Mais uma vez, ele não o fez - mas você realmente acha que o hacker vai parar lá? Claro que não. Ele vai tentar todas as combinações de dígitos, ele pode pensar até que ele encontra alguns realmente grandes contas com realmente grandes saldos que valem a pena roubar.
Lembre-se de três coisas:
injeção de SQL foi anos muito comuns atrás.
Foi apenas isso simples.
Com um melhor conhecimento de SQL e alguma sintaxe realmente torturado, um bom hacker pode fazer quase qualquer coisa que ele quer com uma injeção SQL como esta.