Hacking: Exemplo de SQL Injection em um programa C ++
A 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. # 147-O quê? Meu programa nunca faria isso! # 148- você diz. Considere o mais comum e, felizmente, mais fácil de entender variante deste pequeno truque: injeção de SQL.
Aqui estão alguns fatos sobre SQL:
SQL (Muitas vezes pronunciada # 147 sequela 148- #) 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ê don # 8242-t já sabe SQL, ele # 8242-s suficiente para dizer que o SQL é muitas vezes interpretado em tempo de execução. Muitas vezes, as declarações C ++ irá enviar uma consulta SQL para um servidor separado do 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 programa C ++ pode parecer com o seguinte:
char * query = "SELECT * FROM transações em que accountid = # 8242-123456789 # 8242 -" resultados = enviar (query) -
Este código diz, # 147-SELECIONAR todos os campos A PARTIR DE a mesa de operações ONDE a accountid (Presumivelmente um dos campos na tabela de transação) é igual a 123456789 (o usuário # 8242-s conta id). # 148- A enviar() função da biblioteca pode enviar esta consulta off para o servidor de banco de dados.
O servidor de banco de dados responderia 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, percorrer resultados, provavelmente exibindo as transações em uma tabela com cada transação em uma linha separada.
O usuário provavelmente doesn # 8242-t precisa que muitos dados. Talvez apenas aquelas transações entre data inicial e data final, duas variáveis que o programa lê a partir da página de consulta 8242-s usuário #. Este programa mais seletivo C ++ pode conter uma declaração como a seguinte:
char * query = "SELECT * FROM transações em que accountid = # 8.242-123.456.789 # 8242-" "e data> # 8242- "+ startDate +" # 8242- e data lt; 8242- # "+ endDate +" # 8242 - "-
Se o usuário digita 2013/10/01 para um data inicial 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 em que accountid = # 8242-123.456.789 # 8242- ANDdate> # 8242-2013 / 01/10 # 8242- e data lt; # 8242-2013 / 01/11 # 8242--
Em outras palavras, mostrar todas as operações realizadas no mês de outubro de 2013. Isso faz sentido. O # 8242-s o problema?
O problema surge se o programa só aceita o que quer que o usuário entra como datas de início e término e conecta-los para a consulta. Ele doesn # 8242-t fazer 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 inicial, mas para a data final ele fosse para digitar algo como 2013/11/01# 8242- OR accountid = # 8.242-234.567.890. (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 em que accountid = # 8242-123.456.789 # 8242- ANDdate> # 8242-2013 / 01/10 # 8242- e data lt; # 8242-2013 / 01/11 # 8242- ORaccountID = # 8.242-234.567.890 # 8242--
Este diz, # 147 Mostre-me todas as transações para a conta 123456789 para o mês de outubro de 2013, além de todas as transações para alguma outra conta de 234.567.890 que eu don # 8242-t própria para qualquer data # 148.;
Este pequeno exemplo pode levantar algumas questões: ? # 147-Como é que o hacker sabe que ele pudesse entrar instruções SQL no lugar de datas # 148- Ele não # 8242-t saber - ele só tenta entrar SQL falso em cada campo que aceite texto personagem e vê o que acontece. Se o programa reclama, # 147 Aquele # 8242-S não uma data legal, # 148- seguida, o hacker sabe que o programa verifica para se certificar de que as datas de entrada são válidos e injeção SQL ganhou # 8242-t trabalho 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 aceite a entrada falsa e enviado-lo para o servidor de banco de dados que, em seguida, chutou-o de volta. Sucesso! Agora tudo o que tem a fazer é formular a consulta apenas para a direita.
Então como é que o hacker sabe que a identificação da conta foi chamado accountid? Ele não # 8242-t sabe 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 # 8242-t - mas você realmente acha que o hacker # 8242-s vai parar lá? Claro que não. Ele # 8242-S 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 ano 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 injecção SQL como esta.