Attacchi a tempo: contro PHP Server - Prevenzione / Tutorial [duplicato]

-1

Qual è il modo più semplice ed efficace per prevenire gli attacchi di temporizzazione per i programmatori che usano PHP?

Sono uno studente delle superiori, sono nuovo alla programmazione e ho imparato la sicurezza da poche settimane. Conosco gli attacchi SQL Injection basati su Blind e Time e so come vengono eseguiti e come possiamo prevenirli. Tuttavia, in questa pagina di documenti PHP spiega che il confronto delle password è anche vulnerabile agli attacchi temporali (quando si usa '==' operatore).

Ho considerato che qualsiasi cosa scritta nel back-end del server con PHP è al sicuro da Prospettiva lato client ma qui il caso è completamente diverso. Gli hacker possono sfruttare i metodi indiretti e indovinare il backend e provare a sfruttarlo. Poiché non ci sono molti tutorial, materiale informativo, informazioni da leggere su come gli attacchi temporali possono essere eseguiti contro lo script PHP che esegue il confronto di 2 stringhe, voglio sapere quali cose tenere a mente per prevenire questo tipo di attacchi.

Voglio che risponda a queste domande.

  1. Se confronti gli hash con md5, allora sarà applicabile? (prospettiva pratica).
  2. Se sì, allora ci sono altre cose che potrebbero essere vulnerabili a parte il confronto tra stringhe? (esempi per favore)
  3. Qual è la cosa migliore che posso fare per impedirlo?
  4. Questi attacchi sono comuni / sensibili?
  5. Un breve tutorial / script per dimostrare come funzionano gli attacchi temporali.

Questa domanda non chiede quali sono gli attacchi temporali, ma come vengono eseguiti e come possono essere prevenuti? (solo per i server su PHP)

grazie:)

    
posta Abhas Kumar Sinha 18.10.2018 - 09:54
fonte

1 risposta

0

1) Un attacco di cronometraggio MD5 è uguale alla difficoltà di un attacco di temporizzazione in chiaro, più un attacco di tavolo arcobaleno MD5. Basta usare un normale attacco di cronometraggio per capire i primi 8-10 bit dell'MD5 (Generare stringhe con MD5 che hanno una sequenza specifica di 8-10 bit è facile). Quindi la tabella arcobaleno corrisponde ai primi 8-10 bit per ottenere una piccola serie di password. Quindi bruteforce quelle password.

2) Qualsiasi cosa in cui il controllo sia correlato al tempo. Un esempio potrebbe essere una query SQL complessa. Se si utilizza un DB SQL per verificare il primo input e quindi un'altra query per verificare il secondo input, l'utente malintenzionato potrebbe utilizzare un attacco di temporizzazione per verificare la validità del primo input prima di indovinare il secondo input.

3) Il ciclo for dovrebbe scorrere su tutti i caratteri della risposta corretta, senza uscire se viene trovato un carattere errato o una lunghezza di input. I compilatori potrebbero ottimizzare questo aspetto per cui è necessario assicurarsi che gli effetti collaterali generati da questo confronto non possano essere ottimizzati dal compilatore.

4) No, per niente. Se lo script PHP esegue qualsiasi chiamata di sistema, immediatamente renderà un confronto tra stringhe trascurabilmente breve. Dove la varianza nei tempi di confronto delle stringhe è centinaia o migliaia di volte inferiore a qualsiasi altra varianza. Basta scrivere numeri casuali in un file alla fine dello script e un attacco di temporizzazione è impossibile. Inoltre, se su Internet, un attacco di temporizzazione è incredibilmente impossibile. Gli orari di Internet si estendono su centinaia di millisecondi e talvolta anche su secondi. I confronti tra stringhe sono nei bassi microsecondi se non in nanosecondi.

5)

Server

correct = pwsd.length == ans.length;
for(int i = 0; i < pswd.length && i < ans.length && correct; i++ ) {
    sleep(1); // 1ms
    correct &= pswd[i] == ans[i];
}

attaccante

time = 0ms
guess = 0
while ( time < 0.9ms )
    guess = "A" * randomInt(1, 100)
    time = timeit(execute("Server.exe", guess))
log("LENGTH: ", guess.length)
time = 1ms
while ( time < 1.9ms )
    guess[0] = "A" + randomInt(0, 26)
    time = timeit(execute("Server.exe", guess))
log("First Character: ", guess[0])
time = 2ms
while ( time < 2.9ms )
    guess[1] = "A" + randomInt(0, 26)
    time = timeit(execute("Server.exe", guess))
log("Second Character: ", guess[1])
...

Ovviamente puoi mettere il time = Xms, while, log("Xth character") bit in una funzione e poi il ciclo su guess.length . Questo è molto utile quando si è sullo stesso sistema e si sta attaccando un binario linux destinato agli amministratori, poiché si dispone di un'eccellente precisione temporale. Un famoso esempio di attacchi temporali sono stati Meltdown e Spectre, che usano i tempi della cache della CPU per sfruttare i dati (le ipotesi corrette sono istantanee, mentre le cache mancano un po ').

    
risposta data 18.10.2018 - 21:13
fonte

Leggi altre domande sui tag