Dichiarazione di non responsabilità: sono un programmatore di computer, non un analista della sicurezza o nulla a che fare con la sicurezza. Non ho esperienza nel mondo della crittografia, quindi abbi pazienza con me per favore.
Situazione: mi è stato assegnato il compito di integrare il sito di un cliente con un sito di hosting dei dati. Mentre ci lavoravo, mi sono imbattuto in una query che scarica tutti i dati degli utenti. Per fare questa query, l'utente deve "autenticarsi" per ottenere una sessione e usare quel codice di sessione per fare questa query, che poi controlla che l'utente abbia i privilegi di amministratore prima di completare la query e di rispondere.
Ma comunque ... sembra una cosa orribile per me. Soprattutto perché si tratta di alcuni dei dati che vengono rinviati se la query viene eseguita correttamente:
"username": "[email protected]",
"firstname": "Test",
"lastname": "Name",
"userpassword": "$1$te000000$qMpAriadAHuRyDkK58YKS0"
Ci sono più dati restituiti che è orribile da esporre, ma non è la mia preoccupazione principale.
Chiaramente nessuno è mai stato nominato "Nome test" e "testemail.blerg" non è un dominio registrato, per non parlare del fatto che "blerg" è un possibile dominio di primo livello. Anche se lo fosse, quell'account è stato cancellato dal sito di hosting dei dati e non può accedere. La password che è stata utilizzata è debole, test-case e non è in uso da nessuno.
E 'possibile per me brute-force / rainbow-table (mentre non ho esperienza, conosco alcune parole flash: P) o qualcosa da cui ottenere la password? Quel poco (penso) che io sappia è che la prima parte di userpassword
è il sale MD5, ma non conosco altro.
Se qualcuno può spiegare quanto sia facile, posso dimostrare al mio capo che questo sito è completamente orribile e convincere il nostro cliente a migrare da questo sito di hosting dei dati.
C'è ancora qualcosa che so sulla salatura (cioè come ottiene il sale, quale lingua / funzione sta usando, ecc.), ma mi piacerebbe vedere con quanta facilità qualcuno che non ha accesso a tali informazioni può capirlo. Un'altra cosa per me è andare al mio capo con, si spera.
EDIT: Sembra esserci un po 'di confusione riguardo al fatto che nella descrizione sia intenzionalmente vaga, in parte allo scopo di impedire qualsiasi indicazione su quale CRM sia, per motivi legali / ecc. Mi rendo anche conto che la mia chiamata "data hosting" era potenzialmente fuorviante, quindi la mia cattiva notizia. Spero che questo chiarisca:
Il lavoro svolto dal nostro team è la creazione di un sito Web di base per un'azienda che mostri i loro prodotti. L'unica interazione che ho con il CRM è:
- Quando una persona compila il modulo Contattaci, noi
POST
al CRM aContacts
oggetto con le informazioni dell'utente. - Esegui un
GET
in un elenco diDealers
che vendono i loro prodotti da visualizzare.
Ho iniziato con # 2, la chiamata API GET
, in cui ho scoperto che posso eseguire query sulla tabella Users
. Non ho creato l'API, ne ho solo richiesto le richieste.
La chiamata GET
richiede un parametro query=
in cui il valore è un'istruzione SELECT
nel linguaggio di query del sistema, che viene quindi tradotto in SQL (presumibilmente prevenendo attacchi SQLI, ma non so come interpreti / si traduce in SQL, quindi non lo sto toccando con un palo da 10 piedi). Modificando SELECT * FROM Dealers;
in SELECT * FROM Users;
nella query sono riuscito a visualizzare i dati di ogni utente.
Il modo in cui il CRM gestisce gli utenti è con un portale sul loro sito. Un utente viene creato nel portale, dove è presente una casella di controllo "Is Admin". Questo può essere modificato in qualsiasi momento attraverso il portale. Questo è il processo per effettuare richieste API:
-
Un utente fa una richiesta al CRM, contenente il nome utente, per un token.
-
Il token è concatenato con la chiave di accesso "segreta" per quell'utente, la stringa risultante è MD5 hash e quindi inviata indietro per richiedere un token di sessione.
-
Questo token di sessione è incluso in ogni richiesta, come parametro querystring, per "verificare" che la richiesta sia "autorizzata".
Uno dei problemi è che se un utente "admin" effettua una richiesta della tabella Users
, la risposta è una lista di ogni utente con le informazioni che ho elencato sopra così come token di accesso "segreto" dell'utente (e altre informazioni). Quindi è anche peggio che esporre una password, significa praticamente concedere l'accesso a chiunque impersonando qualcuno.