Protezione dagli attacchi della console

0

Sto creando un'app web utilizzando PHP e jQuery Ajax per il mio lato client. Quando stavo testando alcuni elementi di sicurezza, ho pensato di inserire un account utente malintenzionato con accesso amministrativo nel database eseguendo una chiamata Ajax dalla console dello sviluppatore in Google Chrome:

$.ajax({
    url: base_url + "callbacks/AccountSettingsCallback/addUpdateAccount",
    type: "POST",
    data: {
        "addUpdateAccount": 1,
        "id": ""
        "first_name": "hack",
        "last_name: "hack",
        "username": "gethack",
        "password": "1234",
        "account_type": 1
    },
    dataType: "JSON",
    success: function(data) {
        console.log("get hacked")
    }
});

Con mia sorpresa, è stato effettivamente eseguito e i dati sono stati inseriti nel database, anche se non ero loggato e non avrei potuto farlo!

So che questa è una vulnerabilità molto critica, quindi la mia domanda è: quali sono i modi per prevenire questo tipo di attacco? È comunque possibile controllare tramite PHP che la richiesta provenga dalla console?

    
posta Akio 24.10.2017 - 09:14
fonte

4 risposte

3

No, non è possibile stabilire se una richiesta proviene dalla console, perché quando si ha un'applicazione client-server, client e server sono scatole nere tra loro. Una richiesta potrebbe provenire dal javascript in esecuzione nel browser, dalla console del browser, da un client telnet, da un programma fatto a mano o da un gruppo di scimmie che digitano caratteri casuali su tastiere collegate direttamente a un cavo Ethernet. Non c'è modo di distinguerli l'uno dall'altro.

Quindi, quando gestisci le richieste sul server, assicurati che il gestore delle richieste ogni controlli l'autenticazione. Ciò include i gestori di servizi web ajax. Solo perché l'utente medio non dovrebbe notare che esistono non significa che nessuno li troverà. Quindi il tuo script che sta ascoltando l'endpoint callbacks/AccountSettingsCallback/addUpdateAccount ha bisogno di controllare il cookie di sessione dell'utente (o quale altro meccanismo tu usi per tracciare le sessioni utente), controlla se l'utente ha il permesso richiesto per eseguire quell'operazione e che i dati passati a l'operazione è plausibile. Inoltre, dovresti implementare misure adeguate contro falsi di richieste cross-site così i proprietari di altri siti web non possono creare applicazioni web che induca l'utente a chiamare ajax webservices sul suo sito.

    
risposta data 24.10.2017 - 09:30
fonte
1

Ci sono due diversi scenari:

  1. l'utente che hai usato per eseguire la richiesta è autorizzato a farlo.

    In questo caso, potresti non essere in grado di fare molto su di esso - eccetto l'inserimento della protezione CSRF per far fronte a questo e / o XSS.

  2. l'utente che hai usato per eseguire la richiesta non è autorizzato a farlo.

    In questo caso, devi aggiungere l'autenticazione e il controllo di accesso a tutti ajax endpoint.

risposta data 24.10.2017 - 09:27
fonte
0

CAN indica se si tratta di una richiesta Ajax (come da codice della tua console) o di una richiesta regolare. Vedi qui per un'implementazione PHP: link

Tuttavia è inutile. Non è affidabile al 100% e, soprattutto, la sicurezza non dovrebbe mai accadere sul lato client. Aggiungi controlli lato client per comodità, ma sempre il 100% delle volte, senza eccezioni, filtra, disinfetti e convalida lato server .

    
risposta data 24.10.2017 - 11:18
fonte
0

No, non è possibile distinguere se una richiesta è stata effettuata dalla console o meno. Non c'è nessun punto da provare. Non è solo che le richieste potrebbero essere inviate dalla console. Il codice JS della tua applicazione potrebbe essere modificato, o le richieste potrebbero essere inviate da un programma che non è nemmeno un browser, e non c'è modo per te di dire la differenza.

Pertanto, la sicurezza deve essere applicata al server. Non puoi mai, mai fidarti del client per rafforzare la sicurezza per te.

Se puoi creare nuovi utenti solo quando sei connesso con un account autorizzato a farlo, va bene. Qualcuno che può creare utenti ha creato un utente, questo è tutto.

Tuttavia, se hai creato quell'utente senza essere connesso come qualcuno autorizzato a farlo, hai grossi problemi. Chiaramente il server non controlla correttamente se gli utenti hanno il permesso di fare cose. Ciò significa che la tua app è completamente aperta agli abusi e probabilmente dovresti prenderla offline fino a quando non potrai risolvere il problema.

Quindi come lo risolvi? Sul server, a ogni endpoint, è necessario verificare se l'utente che ha effettuato l'accesso è autorizzato ad accedervi e negare in caso contrario.

    
risposta data 24.10.2017 - 09:30
fonte

Leggi altre domande sui tag