2013-09-24 15 views
5

Dopo la scansione della mia applicazione Web con Acunetix, i risultati hanno mostrato 9 istanze di "Modulo HTML trovato nella pagina di reindirizzamento". Le intestazioni HTTP per riprodurre l'attacco di prova sono i seguenti:Test di sicurezza del sito Web Mostra Response.Redirect vulnerabile a un attacco

Request 
GET /entities/add HTTP/1.1 
Pragma: no-cache 
Referer: https://test.mysite.com/entities/view 
Acunetix-Aspect: enabled 
Acunetix-Aspect-Password: 082119f75623eb7abd7bf357698ff66c 
Acunetix-Aspect-Queries: filelist;aspectalerts 
Cookie: __AntiXsrfToken=97c0a6bb164d4121b07327df405f9db4; mysitecookie= 
Host: test.mysite.com 
Connection: Keep-alive 
Accept-Encoding: gzip,deflate 
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
Acunetix-Product: WVS/8.0 (Acunetix Web Vulnerability Scanner - NORMAL) 
Acunetix-Scanning-agreement: Third Party Scanning PROHIBITED 
Acunetix-User-agreement: http://www.acunetix.com/wvs/disc.htm 
Accept: */* 

Response 
HTTP/1.1 302 Found 
Cache-Control: private 
Content-Type: text/html; charset=utf-8 
Location: /login 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
Set-Cookie: mysitecookie=; expires=Mon, 11-Oct-1999 22:00:00 GMT; path=/; HttpOnly 
X-Powered-By: ASP.NET 
Date: Tue, 24 Sep 2013 10:38:12 GMT 
Content-Length: 9447 

La Location: /login parte della risposta mi ha portato a credere che se ho finito la risposta dopo reindirizzando l'utente alla pagina di login, la vulnerabilità potrebbe essere collegato. Così ho cambiato tutte le istanze di questo codice:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     Response.Redirect("/login"); 
    } 
    else 
    { 
     // etc 
    } 
} 

a:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     Response.Redirect("/login", true); 
    } 
    else 
    { 
     // etc 
    } 
} 

Quale potrebbe essere il motivo per cui è ancora mostrando come vulnerabile?

+0

Acunetix ha un sacco di documentazione. Invece di chiedere la gente qui, perché non leggi la documentazione di Acunetix? http://www.acunetix.com/blog/web-security-zone/html-form-found-in-redirect-page/ descrive il tuo scenario particolare. Il problema teorico qui è che avresti potuto rendere * la * pagina * reale * con un reindirizzamento alla pagina di accesso. – bzlm

risposta

1

Il flag viene generato perché nella pagina è presente un modulo HTML, insieme a un reindirizzamento nell'intestazione della risposta. Presumo che si tratti di una vulnerabilità perché può fornire a un utente non autenticato alcune informazioni su come funziona l'applicazione. Quello che puoi fare per evitare che questo flag venga sollevato è CANCELLARE la tua risposta prima di reindirizzare.

provare quanto segue:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     Response.Clear(); 
     Response.Redirect("/login", true); // btw true is the default... 
    } 
    else 
    { 
     // etc 
    } 
} 

Se stai impostando le variabili di sessione, cookie, ecc, allora avrete bisogno di tweak che un po 'in modo che sei sicuro che tutto rende in risposta ad esempio usa endResponse = false, Response.End(); ritorno; eccetera.

http://msdn.microsoft.com/en-us/library/system.web.httpresponse.clear.aspx

+0

'Il metodo Clear non cancella le informazioni di intestazione. Questo è qualcosa che ho trovato nel link che hai suggerito, puoi spiegarlo? come sono anche nuovo nella tecnologia web e queste due affermazioni sembrano contrastanti. –

+2

Richieste e risposte HTTP sono costituite da un'intestazione e un corpo (e un metodo, vedi link sotto). Nel tuo caso, la tua intestazione sta dicendo "No" (Reindirizzamento) ma il tuo corpo sta dicendo "Sì" (scusa non ho potuto resistere) inviando (almeno un po ') il modulo HTML. Puoi cancellare le intestazioni se vuoi con un metodo diverso, ma nel tuo caso non vuoi cancellare le intestazioni (vuoi reindirizzare) vuoi solo cancellare il corpo. http://geekexplains.blogspot.com/2008/06/whats-http-explain-http-request-and.html – mikey

+0

Grazie +1 per l'aiuto. –

0

Response.Redirect invia un round trip aggiuntivo al client (codice di risposta 302). Significa che il cliente dovrà chiamare il "nuovo" URL. Questo di solito è qualcosa che non vuoi fare.

In .Net è anche possibile effettuare il reindirizzamento sul server direttamente, ovvero senza un ulteriore viaggio di andata e ritorno.

Invece di Response.Redirect si desidera chiamare Server.Transfer o Server.TransferRequest (che è il nuovo metodo che richiede pool di applicazioni integrato).

http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.transferrequest.aspx

se Server non è disponibile nel vostro contesto, troverete anche un'istanza di HttpServerUtility in HttpContext.Current.

+0

Questa risposta non ha nulla a che fare con la vulnerabilità segnalata o la sua risoluzione. [Vedi questa risposta per ulteriori informazioni.] (Http://stackoverflow.com/a/18986165/7724) – bzlm

+1

Di causa lo fa. Doing Response.Redirect non è una buona cosa perché causa traffico extra e solitamente viene trattato come una potenziale vulnerabilità di sicurezza. Ecco perché si desidera reindirizzare il proprio sito sul server e non inviare un 302 al client ... Questo è esattamente il modo in cui funziona il routing. E come/Login sembra essere sullo stesso server/sito, questa è un'opzione valida per non causare problemi ... – MichaC

+0

Scusa, stai confrontando mele e arance. Controlla la risposta collegata e il link alla descrizione per questa particolare vulnerabilità segnalata su Acunetix. Inoltre, l'osservazione del fatto che "Response.Redirect" non è una "buona cosa" è una sciocchezza. :) – bzlm

0

Beh non posso dire che su quello criteri Acunetix calcola vulnerabilità ma posso suggerire di utilizzare response.redirect("url",false) sovraccarico - check here

Se si specifica true per il parametro endResponse, questo metodo chiama il metodo finale per la richiesta originale , che genera un'eccezione ThreadAbortException al termine. Questa eccezione ha un effetto dannoso sulle prestazioni dell'applicazione Web, motivo per cui è consigliabile passare false per il parametro endResponse.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     Response.Clear(); 
     Response.Redirect("/login", false); 
     Context.ApplicationInstance.CompleteRequest(); 
    } 
    else 
    { 
     // etc 
    } 
} 

Context.ApplicationInstance.CompleteRequest(); cause ASP.NET bypassare tutti gli eventi e il filtraggio sulla catena conduttura HTTP di esecuzione e direttamente eseguire l'evento EndRequest. Ignora gli eventi che causano ThreadAbortException.

+0

[Gli stessi Acunetix possono dire su quali critere calcolano la vulnerabilità.] (Http://www.acunetix.com/blog/web-security-zone/html-form-found-in-redirect-page/) – bzlm

+0

@bzlm Grazie per il collegamento. Molti browser Web hanno implementato questo codice in modo tale da violare questo standard, modificando il tipo di richiesta della nuova richiesta in GET, indipendentemente dal tipo utilizzato nella richiesta originale (ad esempio POST) -http: //en.wikipedia.org/wiki/HTTP_302 –

+0

@bzlm Secondo lo screenshot mostra il tipo di metodo 'GET', quindi c'è un modo per evitare questo o gli utenti devono far fronte a questo. http://www.acunetix.com/wp-content/uploads/2012/02/html-form-redirect-redirpage-302.png –

Problemi correlati