Iniezione di SQL Server: quanto danno in 26 caratteri?


21

Sto testando la resilienza contro gli attacchi di iniezione su un database di SQL Server.

Tutti i nomi di tabella nel db sono in minuscolo e le regole di confronto fanno distinzione tra maiuscole e minuscole, Latin1_General_CS_AS .

La stringa che posso inviare è forzata in maiuscolo e può avere una lunghezza massima di 26 caratteri. Quindi non posso inviare una DROP TABLE perché il nome della tabella sarebbe in maiuscolo e quindi la dichiarazione fallirebbe a causa delle regole di confronto.

Quindi - qual è il danno massimo che potrei fare in 26 personaggi?

MODIFICARE

So tutto sulle query con parametri e così via: immaginiamo che la persona che ha sviluppato il front-end che costruisce la query per l'invio non abbia utilizzato i parametri in questo caso.

Inoltre, non sto provando a fare qualcosa di nefasto, questo è un sistema creato da qualcun altro nella stessa organizzazione.


1
Stiamo immaginando o in realtà stai testando la penna e hai dei requisiti che ti impediscono di evitare l'iniezione? Stai cercando un modo per spezzare la sua mancanza di sicurezza?
LowlyDBA,

41
Perché è anche un'opzione che la porta deve essere lasciata aperta? Sembra che tu abbia già trascorso più tempo a contemplarlo di quanto non sarebbe costato chiudere a chiave la porta. Lo percepisco come un esercizio inutile: se si presentano 10 vulnerabilità, diranno, collegheremo quelle 10 vulnerabilità e sicuramente non ci sarà un undicesimo. È qui che ci hanno procurato le stringhe di "pulizia". / facepalm
Aaron Bertrand

5
Questa è una domanda follemente vaga e arbitraria, e non può nemmeno essere teoricamente affrontata. Esistono altre funzionalità di mitigazione native di SQL Injection (autorizzazioni, sandbox, firewall ecc.) E dovresti tenere conto di tutte queste cose per rispondere a questa domanda.
Evan Carroll,

2
Cosa sta imponendo il limite di 26 caratteri? L'applicazione?
Jonathan Fite,

7
Smettila. Smettila e basta. Se le query con parametri sono un'opzione da remoto , utilizzale . Se qualcun altro non sa come usarli, trova una risorsa decente e fagli leggere. Se non ascoltano, avvisa un manager o un supervisore che stanno producendo vulnerabilità di sicurezza critiche (una demo non distruttiva non farebbe male) e si rifiuteranno di essere istruiti.
jpmc26,

Risposte:


38

Facile:

GRANT EXECUTE TO LowlyDBA

Oppure, suppongo che in questo caso sarebbe

grant execute to lowlydba 

Fai la tua scelta di variazioni su questo.

Con ogni probabilità potresti essere in grado di testarlo ora con il tuo sistema attuale, ma qualsiasi numero di piccole modifiche nel database nel tempo potrebbe invalidare il test. La stringa di caratteri potrebbe cambiare, qualcuno potrebbe creare una stored procedure in minuscolo che ha un potenziale distruttivo - qualsiasi cosa. Non puoi mai dire con la certezza del 100% che non c'è un attacco distruttivo a 26 personaggi che qualcuno potrebbe costruire.

Ti suggerisco di trovare un modo per far sì che lo sviluppatore segua le migliori pratiche di sicurezza standard di base del settore, anche solo per il tuo bene come qualcuno che presumo sia almeno parzialmente responsabile in caso di violazioni della sicurezza.

Modificare:

E per malware / divertimento, potresti provare ad abilitare ogni flag di traccia. Questo sarebbe interessante da osservare. Sembra che un post sul blog che Brent Ozar farebbe ...

DBCC TRACEON(xxxx, -1)

1
Oltre ad abilitare i flag di traccia: cambiare diverse impostazioni casuali: SET LOCK_TIMEOUT 0;, SET LANGUAGE Malaysian;, SET ANSI_NULLS OFF:...
ypercubeᵀᴹ

2
@ ypercubeᵀᴹ avrebbero tutti effetti solo sulla tua sessione.
Martin Smith,

2
@MartinSmith thnx. Se SETriguarda solo le impostazioni della sessione, come vengono modificate le impostazioni di satabase e server ( ALTER DATABASE ...;?) Infliggerebbe DROP DATABASE ..;più danni, se riusciva;)
ypercubeᵀᴹ

1
Modifica il database e sp_configure principalmente per le impostazioni a livello di DB e server. Anche se potresti raggiungere il limite di 26 caratteri con questi. Inoltre, queste impostazioni specifiche a livello di database vengono utilizzate solo se la connessione client non le imposta. E per impostazione predefinita la maggior parte o tutti lo fanno.
Martin Smith,

7
Assomiglio a quell'osservazione.
Brent Ozar,

22

Il SHUTDOWNcomando o il KILLcomando (scegli un numero casuale superiore a 50) richiede entrambi significativamente meno di 26 caratteri, anche se si spera che l'account che esegue le query dell'applicazione non disponga di autorizzazioni sufficienti per eseguirli.


Di solito l'account non avrebbe bisogno nemmeno del drop table ...
Greg

3
@Greg yep. Sebbene sia possibile ipotizzare un ambiente che sta prendendo in considerazione la possibilità di consentire l'iniezione di SQL, purché la lunghezza sia breve, non segue le migliori pratiche di sicurezza e gli account potrebbero non essere configurati con autorizzazioni minime.
Martin Smith,

14

È possibile creare una tabella da riempire fino alla fine del tempo o allo spazio su disco che si esaurisce, a seconda dell'evento che si verifica per primo.

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

19
@AlanB Bene, allora avresti bisogno di qualcosa che mi impedisca di sfruttare la debolezza più di una volta.
Mikael Eriksson,

1
tarnations ... while 1=1 insert t values('')is 30 ... create table x(i int)=> while 1=1 insert t select 0is 27
WernerCD

1
Potresti usare questo per creare un comando più lungo del limite di caratteri e quindi eseguirlo?
Lawtonfogle,

1
@MartinSmith Ho pensato di andarmene così, ma ora devo solo provarlo :). Ti farò sapere se lo capirò.
Mikael Eriksson,

7
Però @WernerCD ha x:insert t select 0 GOTO xesattamente 26 anni.
Martin Smith,

4

A seconda della definizione di danno, è possibile eseguire questo: RITARDO IN ATTESA '23: 59 'Per essere veramente malvagi, è possibile utilizzare uno strumento di test del carico per eseguirlo da 32.768 client.



1
Se la stringa viene iniettata in un batch ad-hoc che contiene blocchi, potrebbe fornire un rifiuto del servizio fattibile come singola chiamata senza la necessità di causare la fame di thread.
David Spillett,

3

Variazione basata sulla risposta di @ MikaelEriksson e sulla risposta di @ MartinSmith al mio commento iniziale:

declare @S char(26);

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

Inizialmente avevo provato a fare un'istruzione WHILE, ma il meglio che potevo fare era 27 caratteri:

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

Ma Martin ha sottolineato GOTO:

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

GOTO ... la radice di tutto il male e creatore di un'istruzione insert a ciclo infinito in 26 caratteri.

Detto questo ... potrebbe essere vantaggioso attenersi a CHAR (99) anziché a int in quanto utilizzerebbe più spazio. Altre opzioni usano nomi più lunghi e infrangono il limite di 26 caratteri ... o usano meno spazio di archiviazione per riga.

Codice test 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

1
set @S = 'x:insert t;select 0;GOTO x';per la compatibilità futura del tuo attacco di iniezione;)
ypercubeᵀᴹ

@ ypercubeᵀᴹ Hai aggiunto due ;s ... il secondo va bene - sostituisce uno spazio ed è funzionale se non necessario. Il primo interrompe la query: separa l'istruzione INSERT dall'istruzione SELECT.
WernerCD,

Ah sì. Ecco cosa succede quando non si usano i separatori! Non sappiamo dove finisce ogni query e quando inizia la prossima!
ypercubeᵀᴹ

1
@WarnerCD Lo so. Era più uno scherzo sulla procedura di deprezzamento in SQL Server. Sembra prendere per sempre. Tuttavia, è buona norma utilizzare i punti e virgola tra le istruzioni e non solo dove è richiesto.
ypercubeᵀᴹ

2
@yper dubito che sarà mai applicato. Probabilmente c'è un sacco di codice legacy che avrebbe bisogno di aggiungere punti e virgola aggiunti senza alcun valore commerciale specifico per farlo. E potrebbe essere incorporato in applicazioni difficili o non possibili da aggiornare.
Martin Smith,

0
XP_CMDSHELL 'SHUTDOWN -PF'

A seconda di quanto dannoso consideri un spegnimento. :-)

Ciò richiede che xp_cmdshell sia abilitato sul server, cosa che non è il caso dell'ultima versione di SQL Server. Richiede inoltre che l'account del servizio disponga del diritto di arresto, che può avere o meno.

L'abilitazione di xp_cmdshell probabilmente supera il limite di 26 caratteri. Consentiresti iniezioni multiple?

SP_CONFIGURE 'SHOW ADV',1

RECONFIGURE

SP_CONFIGURE 'XP', 1

RECONFIGURE

1
EXEC è facoltativo solo se questa è la prima istruzione nel batch. Che probabilmente non sarà il caso qui.
Martin Smith,

@Martin Smith, bel commento. EXEC aggiunge 5 caratteri a ciascuna linea di chiamata della procedura, che spinge la maggior parte di essi su 26 caratteri. Mi chiedo se CREATE ALIAS sarebbe d'aiuto qui?
Greenstone Walker,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.