SMTP injecție antet în ASP.NET?

voturi
8

Site-ul meu ASP.NET are un handler de eroare la nivel mondial, care trimite un e-mail la mine (și un alt dezvoltator), atunci când nu există nici un fel de eroare în aplicația web. Am primit recent o eroare care conținea un CC la o adresă de e-mail pe care nu am auzit. Lucrul înfricoșător este că lista de dezvoltatori că mesajul de eroare este trimis este greu codificate în cod ASP.NET compilat. Noi nu vedem cum ar fi putut fi adăugate CC.

Suntem de asemenea , foarte suspicioși antijoc , deoarece solicitarea care a cauzat eroarea a fost o încercare de a utiliza una dintre formele noastre pentru a trimite spam. Adresa IP care a trimis cererea este de asemenea listat pe http://www.projecthoneypot.org/ .

Presupunerile noastre chiar acum este faptul că cererea a fost incorectă într-un mod care să-l injectat un antet CC în e-mail. Problema este că nu ne putem da seama cum acest lucru ar putea fi realizat. Folosim System.Net.Mail pentru a trimite e-mailuri și se pare a fi protejat împotriva acestui tip de lucru. Subiectul obiectului MailMessage acceptă doar o singură linie, astfel încât să nu creați un subiect multilinie cu o linie de CC. Setarea la și cc adresele din MailMessage pare destul de robust. Și nu pot să văd cum ai putea adăuga un antet CC în corpul mesajului. Nu pot găsi nici o informație despre acest lucru și mi-ar plăcea să știu dacă aceasta este o problemă reală.

EDIT: Cineva a solicitat codul. E un pic cam lung, dar aici este:

public class Global : System.Web.HttpApplication
{
    protected void Application_Error(Object sender, EventArgs e)
    {
        // Get the last exception.
        Exception objException = Server.GetLastError();

        // Work out the error details based on the exception.
        string ErrorType = ;
        string ErrorDescription = ;
        string ErrorHtml = ;

        if (objException == null)
        {
            // This should never occur.
            ErrorType = Unknown Error;
            ErrorDescription = Unknown Error;
        }
        else if (objException.GetType() == typeof(HttpException))
        {
            // This will occur when the ASP.NET engine throws a HttpException.
            HttpException objHttpException = objException as HttpException;
            if (objHttpException.GetHttpCode() == 404)
            {
                string Resource = Globals.GetFullUrl(this.Context);
                Server.ClearError();
                Response.Redirect(/ResourceNotFound.aspx?BadUrl= + Server.UrlEncode(Resource));
                return;
            }
            else
            {
                ErrorType = objHttpException.GetHttpCode().ToString();
                ErrorDescription = objHttpException.Message;
            }
        }
        else if (objException.GetType() == typeof(HttpUnhandledException) && objException.InnerException != null && objException.InnerException.GetType() == typeof(HttpException))
        {
            // This will occur when the code throws a HttpException (e.g. a fake 404).
            HttpException objHttpException = objException.InnerException as HttpException;
            if (objHttpException.GetHttpCode() == 404)
            {
                string Resource = Globals.GetFullUrl(this.Context);
                Server.ClearError();
                Response.Redirect(/ResourceNotFound.aspx?BadUrl= + Server.UrlEncode(Resource));
                return;
            }
            else
            {
                ErrorType = objHttpException.GetHttpCode().ToString();
                ErrorDescription = objHttpException.Message;
            }
        }
        else if (objException.GetType() == typeof(HttpUnhandledException))
        {
            // This will occur when a page throws an error.
            HttpUnhandledException objHttpUnhandledException = (HttpUnhandledException) objException;
            ErrorType = objHttpUnhandledException.GetHttpCode().ToString();
            if (objHttpUnhandledException.InnerException != null)
                ErrorDescription = objHttpUnhandledException.InnerException.Message;
            else
                ErrorDescription = objHttpUnhandledException.Message;
            if (objHttpUnhandledException.GetHtmlErrorMessage() != null)
            {
                ErrorHtml = objHttpUnhandledException.GetHtmlErrorMessage();
            }
        }
        else if (objException.GetType() == typeof(HttpRequestValidationException) && !Globals.IsTtiUser(this.Context))
        {
            // Do nothing.  This is mostly just spider junk and we don't want to know about it.
        }
        else
        {
            // This will occur when the ASP.NET engine throws any error other than a HttpException.
            ErrorType = objException.GetType().Name;
            ErrorDescription = objException.Message;
        }

        // Send an email if there's an error to report.
        if (ErrorType !=  || ErrorDescription != )
        {
            Globals.SendErrorEmail(this.Context, ErrorType, ErrorDescription, ErrorHtml);
        }
    }

    public static void SendErrorEmail (HttpContext context, string errorType, string errorDescription, string errorHtml)
    {
        // Build the email subject.
        string Subject = EM:  + errorType + :  + context.Request.ServerVariables[SCRIPT_NAME];

        // Build the email body.
        string Body;

        StringBuilder sb = new StringBuilder();
        sb.Append(Server:\r\n);
        sb.Append(Globals.Server.ToString() + \r\n);
        sb.Append(\r\n);
        sb.Append(URL:\r\n);
        sb.Append(Globals.GetFullUrl(context) + \r\n);
        sb.Append(\r\n);
        sb.Append(Error Type + :\r\n);
        sb.Append(errorType + \r\n);
        sb.Append(\r\n);
        sb.Append(Error Description + :\r\n);
        sb.Append(errorDescription + \r\n);
        sb.Append(\r\n);
        sb.Append(Referring Page:\r\n);
        sb.Append(context.Request.ServerVariables[HTTP_REFERER] + \r\n);
        sb.Append(\r\n);
        sb.Append(Date/Time:\r\n);
        sb.Append(DateTime.Now.ToString() + \r\n);
        sb.Append(\r\n);
        sb.Append(Remote IP:\r\n);
        sb.Append(context.Request.ServerVariables[REMOTE_ADDR] + \r\n);
        sb.Append(\r\n);
        sb.Append(User Agent:\r\n);
        sb.Append(context.Request.ServerVariables[HTTP_USER_AGENT] + \r\n);
        sb.Append(\r\n);
        sb.Append(Crawler:\r\n);
        sb.Append(context.Request.Browser.Crawler.ToString() + \r\n);
        sb.Append(\r\n);
        sb.Append(Admin User:\r\n);
        sb.Append(context.User.Identity.Name + \r\n);
        sb.Append(\r\n);
        sb.Append(\r\n);
        Body = sb.ToString();

        // If there's HTML to represent the error (usually from HttpUnhandledException),
        // then stuff the body text into the HTML (if possible).
        bool HtmlMessage = false;

        if (errorHtml != )
        {
            Regex r = new Regex((?<thebodytext><body.*?>), RegexOptions.IgnoreCase);
            if (r.IsMatch(errorHtml))
            {
                Body = Body.Replace(\r\n, <br>);
                Body = r.Replace(errorHtml, ${thebodytext} + Body, 1);
                HtmlMessage = true;
            }
        }

        // Send an email to the TTI developers.
        MailMessage objMail;
        objMail = new MailMessage();
        objMail.From = new MailAddress(from-address);
        objMail.To.Add(new MailAddress(to-address));
        objMail.CC.Add(new MailAddress(cc-address));
        objMail.CC.Add(new MailAddress(another-cc-address));
        if (HtmlMessage)
            objMail.IsBodyHtml = true;
        else
            objMail.IsBodyHtml = false;
        if (errorType == 404)
            objMail.Priority = MailPriority.Low;
        else
            objMail.Priority = MailPriority.High;
        objMail.Subject = Subject;
        objMail.Body = Body;

        try
        {
            SmtpClient objSmtpClient = new SmtpClient();
            objSmtpClient.Send(objMail);
        }
        finally
        {
            // Do nothing.
        }
    }
}
Întrebat 12/03/2009 la 14:36
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
4

Am putut vedea acest lucru fiind ținta unui FOARTE atac creativ .... Sunteți umplutura de date controlate de utilizator în corpul mesajului ... La ce punct, utilizarea vicleanul a datelor binare POT duce într - un corp care trimite datele corespunzătoare în cursul procedurii sesiune SMTP pentru a-l formatat doar dreapta ... Dacă aș putea, aș sugera fie de conversie a corpului la tot textul ASCII, sau în timpul clădirii dvs. șir de caractere, a scrie un șir de caractere care permite doar Sanitizer chars RFC. (Filtre URL-urile, referentul, Adresa la distanță, și UserAgent). Acestea sunt punctele tale mai probabil de atac.

Un al doilea gând ar putea fi de a construi un e-mail de bază în cod, și anexați corpul pe care le-ați construit ca un text sau HTML, sau un fișier PDF.

Rețineți, SMTP date PLIC este NU la fel ca date de mesaje .... Dacă cineva a fost suficient de șiret pentru a trimite corpul corect , care a cauzat o CRLFCRLF.CRLFCRLF care urmează să fie trimise în timpul părții corpului, care ar termina trimiterea, și apoi în cazul în care au ținut trimiterea de date, acestea ar putea trimite întregul mail de la: RCPT LA :, dATE, etc ... (Desigur, acest lucru este un scenariu puțin probabil ...) ...

Mi - ar place pentru a vedea RAW sursa e - mailului primit ... (Ca și în groapa de hex a tranzacției reale SMTP, nu ceea ce vrea Outlook să vedeți, sau orice altceva).

Ați putea încerca, de asemenea codifică corpul folosind QP sau B64 înainte de a trimite mesajul .... Asta ar putea rezolva problema ...

Aceasta este una interesantă, și aștept cu nerăbdare rezultatul acesteia.

Publicat 17/03/2009 la 23:26
sursa de către utilizator

voturi
1

Codul dvs. pare foarte sigur, așa că nu cred că problema este de partea ta.

OMI, fie cineva interceptat mesajul SMTP în timp ce era trimis la mailserver și injectat CC suplimentar: linie; sau mailserver a fost compromisă.

Dacă nu puteți găsi un răspuns Vă sugerez să contactați direct Microsoft - este posibil să fi descoperit o exploateze în .NET Framework.

Publicat 18/03/2009 la 10:05
sursa de către utilizator

voturi
0

Ca soluție alternativă, de ce nu encript mesajul e-mail folosind asymeterical de criptare (de exemplu, criptare cu chei publice)? În acest fel numai recepient intenționat va fi capabil să-l citească.

În acest fel, chiar dacă băieții răi primi o copie a mesajului (prin orice mijloace) va fi de acum folosesc pentru a le.

Să recunoaștem, dacă aveți un site de profil înalt cum ar fi FBI sau Google, o mulțime de oameni foarte creativi vor petrece o mulțime de timp și du-te la lungimi mari pentru a-l comprimise. Este extrem de important pentru protejarea mesajelor de eroare detaliate.

Publicat 19/07/2009 la 17:35
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more