Estou testando a resiliência contra ataques de injeção em um banco de dados do SQL Server.
Todos os nomes de tabela no banco de dados são minúsculos e o agrupamento diferencia maiúsculas de minúsculas, Latin1_General_CS_AS .
A sequência que eu posso enviar é forçada a maiúscula e pode ter no máximo 26 caracteres. Portanto, não posso enviar uma DROP TABLE porque o nome da tabela estaria em maiúsculas e, portanto, a instrução falharia devido ao agrupamento.
Então - qual o dano máximo que eu poderia causar em 26 caracteres?
EDITAR
Eu sei tudo sobre consultas parametrizadas e assim por diante - vamos imaginar que a pessoa que desenvolveu o front end que cria a consulta para enviar não usava parâmetros neste caso.
Também não estou tentando fazer nada nefasto, este é um sistema construído por outra pessoa na mesma organização.
fonte
Respostas:
Fácil:
Ou, acho que nesse caso seria
Faça a sua escolha de variações sobre isso.
Com toda a probabilidade, você poderá testar isso agora em relação ao seu sistema atual, mas qualquer número de pequenas alterações no banco de dados ao longo do tempo pode invalidar o teste. A cadeia de caracteres pode mudar, alguém pode criar um procedimento armazenado em minúsculas com potencial destrutivo - qualquer coisa. Você nunca pode dizer com 100% de confiança que não há um ataque destrutivo de 26 caracteres que alguém possa construir.
Sugiro que você encontre uma maneira de fazer com que o desenvolvedor siga as práticas recomendadas de segurança básicas padrão do setor, mesmo que seja por sua conta como alguém que eu presumo ser pelo menos parcialmente responsável caso ocorram violações de segurança.
Editar:
E por malícia / diversão, você pode tentar ativar todos os sinalizadores de rastreamento. Isso seria interessante de observar. Parece um post que Brent Ozar faria ...
fonte
SET LOCK_TIMEOUT 0;
,SET LANGUAGE Malaysian;
,SET ANSI_NULLS OFF:
...SET
(afecta apenas as configurações de sessão, como são configurações satabase e servidor mudouALTER DATABASE ...;
?)DROP DATABASE ..;
Iria infligir mais danos, em seguida, se conseguiu;)O
SHUTDOWN
comando ouKILL
Comando (escolha um número aleatório acima de 50) ambos têm significativamente menos de 26 caracteres, embora a conta que executa as consultas do aplicativo esperançosamente não tenha permissões suficientes para executá-los.fonte
Você pode criar uma tabela que preenche até o final do tempo ou o espaço em disco acabar, o que ocorrer primeiro.
fonte
while 1=1 insert t values('')
is 30 ...create table x(i int)
=>while 1=1 insert t select 0
is 27x:insert t select 0 GOTO x
tem exatamente 26 anos.Dependendo da sua definição de dano, você pode executar o seguinte: WAITFOR DELAY '23: 59 'Para ser realmente mau, você pode usar uma ferramenta de teste de carga para executar isso de 32.768 clientes.
fonte
Variação baseada na resposta de @ MikaelEriksson e de @ MartinSmith no meu comentário inicial:
Inicialmente, tentei fazer uma declaração WHILE, mas o melhor que pude fazer foram 27 caracteres:
Mas Martin apontou GOTO:
GOTO ... a raiz de todo mal e criador de uma instrução de inserção de loop infinito em 26 caracteres.
Com isso dito ... pode ser vantajoso ficar com CHAR (99) em vez de int, pois isso usaria mais espaço. Outras opções usam nomes mais longos e quebram o limite de 26 caracteres ... ou usam menos espaço de armazenamento por linha.
Código de teste completo:
fonte
set @S = 'x:insert t;select 0;GOTO x';
para compatibilidade futura do seu ataque de injeção;);
s ... o segundo está bom - substitui um espaço e funciona se não for necessário. O primeiro interrompe a consulta - separa a instrução INSERT da instrução SELECT.Dependendo de quão prejudicial você considere um desligamento. :-)
Isso exige que o xp_cmdshell esteja ativado no servidor, algo que não é o caso da última versão do SQL Server. Também exige que a conta de serviço tenha o desligamento correto, o que pode ou não ter.
A ativação do xp_cmdshell provavelmente vai além do seu limite de 26 caracteres. Você permitiria várias injeções?
fonte