Vou abordar hoje uma das maneira mais fáceis de inserir código malicioso em comando SQL. O título indicando o Firebird é só um direcionamento do teste, mas se aplica praticamente a todos os banco de dados relacional (ou quase todos).
1. Um código Vulnerável
Uma simples janela de “login” pode significar uma entrada a explorar, como veremos.
Em geral uma janela de “login” pede o código/senha de usuário.
Exemplos de “select” para validar o usuário:
Caso 1:
considere o select: ‘select codigo,nome from usuario where codigo=’ +edit1.text+’ and senha=’+edit2.text;
como testar:
- digite uma aspas ‘ no edit1.text e tente entrar; se o resultado for um erro, então você receberá informações sobre o que ocorreu e poderá indicar que o código do aplicativo é vulnerável.
- tente digitar no edit1.text:
' or 1=1 --
note que com o select indicado o usuário ganhará acesso ao sistema.
Caso 2:
considere o select: format(‘select codigo,nome from usuario where codigo=%s and senha=%s,[edit1.text,edit2.text]);
- tente digitar no edit1.text:
' or 1=1 --
2. Como quebrar a vulnerabilidade
Para quebrar a vulnerabilidade, o passo mais seguro é utilizar parâmetros nos “select” ou forçar as aspas por código, vejamos como fazer o correto:
- ‘select codigo,nome from usuario where codigo=:codigo and senha=:senha’
- ‘select codigo,nome from usuario where codigo=’+quotedstr(edit1.text)+’ and senha=’+quotedstr(edit2.text);