Le Stanze preparate sono sufficienti?
Gli Stumenti Preparati non sono sufficienti da soli.
Dovresti esaminare il tuo codice e chiediti cosa è necessario e cosa è possibile. Passa sia dal lato client che lato server, e vedi quali dati vengono inviati, se è possibile modificarli e cosa fa. Guarda cosa puoi fare.
Non riesco a vedere il resto del codice, ma a prima vista questo codice sembra vulnerabile a più exploit Reference diretto . È possibile che si stiano inserendo valori nel database senza verificare se questi valori sono validi o che devono essere modificati o che l'utente è autorizzato a modificare tali valori.
INSERT INTO fcomments (poster, lid, post_id, comment, time_stamp)
VALUES(user_id, lid, post_id, comment, timeNow
Solo perché si vincolano queste variabili non significa che non siano sfruttabili. Proviamo un caso di test. Facciamo alcuni casi di test ajax (presumo che 'lid' sia l'importo in aumento): callAjaxDatabaseUpdate(post_id, lid);
Ora chiamiamolo: callAjaxDatabaseUpdate(25, 100)
;
Ti aspetti che sia esattamente così come è entrato, in questo modo :
INSERT INTO fcomments (poster, 100, 25, comment, time_stamp)
VALUES(user_id, lid, post_id, comment, timeNow
Cosa succede se cambio i dati in transito? : (
Domande che devi pormi
Esaminiamo i parametri associati:
$insertQuery->bindParam(':user_id',$user_id);
$insertQuery->bindParam(':lid',$lid);
$insertQuery->bindParam(':post_id',$post_id);
$insertQuery->bindParam(':comment',$comment);
$insertQuery->bindParam(':timeNow',$timeNow);
L'utente dovrebbe essere in grado di inviare user_id
? Dovrebbe essere presentato il lid
? Sembra tutto ciò che l'utente potrebbe cambiare se lo stai inviando tramite il client.
Diciamo che vuoi fare un post, giusto? Facciamo un post quindi:
postDataToForum(user_id, lid, post_id, comment);
Poiché sai chi è loggato in quel momento, puoi prenderne il user_id
e usarlo per inviare cose nella tua istruzione sql, ecc. Non è un grosso problema, giusto?
Bene, ecco un potenziale problema: posso colpire F11 e andare nella console degli sviluppatori e cambiare quei valori, oppure potrei usare un programma come TamperData
per FireFox per scoprire cosa viene inviato e quindi modificare in transito.
Quindi ti aspetti questo:
postDataToForum(23, 100, 450, "Hi everyone");
Ma l'intruso controlla l'elenco degli utenti o utilizza un numero casuale e modifica i dati:
// user_id = 1 = admin.
postDataToForum(1, 100, 450, "I have altered the input. Pray I do not alter it further.");
E poi mostra l'amministratore che ha pubblicato, invece che l'utente. Questo exploit DOR
potrebbe essere ovunque nella tua applicazione web. Nel caso del tuo upvote, l'utente avrebbe potuto inserire "-1" e non l'hai verificato.