2009-03-12 10 views
8

मेरी एएसपी.नेट वेबसाइट में एक वैश्विक त्रुटि हैंडलर है जो वेब ऐप में किसी प्रकार की त्रुटि होने पर मुझे एक ईमेल भेजता है (और एक और डेवलपर)। हमें हाल ही में एक त्रुटि मिली जिसमें एक ईमेल पते पर एक सीसी शामिल है जिसे हमने कभी नहीं सुना होगा। डरावनी बात ये है कि डेवलपर्स की सूची जिसे त्रुटि ईमेल भेजा जाता है, संकलित ASP.NET कोड में हार्ड कोड किया जाता है। हम नहीं देखते कि सीसी कैसे जोड़ा जा सकता था।एसएमटीपी हेडर इंजेक्शन?

हम भी गलत खेल के बारे में बहुत संदिग्ध हैं क्योंकि अनुरोध के कारण त्रुटि स्पैम भेजने के लिए हमारे एक फॉर्म का उपयोग करने का प्रयास था। अनुरोध भेजा गया आईपी पता भी http://www.projecthoneypot.org/ पर सूचीबद्ध है।

अभी हमारा सबसे अच्छा अनुमान यह है कि अनुरोध किसी भी तरह से विकृत हो गया था कि उसने ईमेल में सीसी हेडर इंजेक्शन दिया था। समस्या यह है कि हम यह नहीं समझ सकते कि यह कैसे किया जा सकता है। हम ईमेल भेजने के लिए System.Net.Mail का उपयोग कर रहे हैं और ऐसा लगता है कि इस तरह की चीज के खिलाफ सुरक्षा है। MailMessage ऑब्जेक्ट का विषय केवल एक पंक्ति को स्वीकार करता है ताकि आप एक सीसी रेखा के साथ एक बहुभाषी विषय नहीं बना सकें। MailMessage में टू और सीसी पते को सेट करना बहुत मजबूत लगता है। और मैं नहीं देख सकता कि आप संदेश के शरीर में सीसी हेडर कैसे जोड़ सकते हैं। मुझे इस पर कोई जानकारी नहीं मिल रही है और मुझे यह जानना अच्छा लगेगा कि यह एक वास्तविक समस्या है या नहीं।

संपादित करें: किसी ने कोड का अनुरोध किया है। यह थोड़ा लंबा है, लेकिन यहाँ यह है:

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. 
     } 
    } 
} 
+0

हमें अपना कोड दिखाएं और हम सहायता कर सकते हैं। अन्यथा लोग जंगली अनुमान ले लेंगे ... – Eppz

+0

मैंने कोड जोड़ा। जैसा कि मैंने कहा, यह जटिल है, लेकिन मैं इसे बहुत कम नहीं करना चाहता था क्योंकि मुझे नहीं पता कि समस्या कहां हो सकती है। –

+0

कृपया ई-मेल (सभी शीर्षकों सहित, इसके कच्चे रूप में; जितना संभव हो उतना कम से कम obfuscate) में त्रुटि दर्ज करें जिसमें एक ईमेल पते पर एक सीसी शामिल है जिसे आपने कभी नहीं सुना होगा। ऐसा लगता है कि पूरा ई-मेल स्वयं जाली है। – bzlm

उत्तर

4

मैं इस एक बहुत रचनात्मक हमले का लक्ष्य किया जा रहा है देख सकते हैं .... आप अपने संदेश के मुख्य भाग में उपयोगकर्ता नियंत्रित डेटा भरने कर रहे हैं ... जो पर बिंदु, द्विआधारी डेटा COULD परिणामस्वरूप एक बॉडी जो एसएमटीपी सत्र के दौरान उचित डेटा भेजता है, इसे प्रारूपित करने के लिए जस्ट राइट ... यदि मैं कर सकता हूं, तो मैं सुझाव दूंगा कि शरीर को सभी ASCII पाठ में परिवर्तित कर दें , या अपनी स्ट्रिंग बिल्डिंग के दौरान, एक स्ट्रिंग सैनिटाइज़र लिखें जो केवल आरएफसी वर्णों को अनुमति देता है। (यूआरएल, रेफरर, रिमोट एड्रेस, और यूजरएजेंट फ़िल्टर करता है)। वे हमले के आपके संभावित बिंदु हैं।

कोड में एक मूल ईमेल बनाने के लिए एक दूसरा विचार हो सकता है, और उस शरीर को अटैच करें जिसे आपने टेक्स्ट, या एचटीएमएल, या पीडीएफ फाइल के रूप में बनाया है।

ध्यान रखें, SMTP लिफ़ाफ़ा डेटा नहीं संदेश डेटा के रूप में एक ही है, कि होता है .... अगर कोई पर्याप्त चालाक सही शरीर है कि वजह से एक CRLFCRLF.CRLFCRLF शरीर के अंग के दौरान भेजे जाने के लिए भेजने के लिए था भेजने को समाप्त करें, और फिर यदि वे डेटा भेजते रहते हैं, तो वे पूरे मेल भेज सकते हैं: आरसीपीटी टू:, डेटा, आदि ... (माना जाता है, यह एक असंभव परिदृश्य है ...) ...

I रॉ आपको प्राप्त ईमेल का स्रोत देखने के लिए प्यार है ... (वास्तविक एसएमटीपी लेनदेन के हेक्स डंप में, आउटलुक आपको क्या देखना चाहता है, या जो कुछ भी नहीं)।

तुम भी अपने शरीर को संदेश भेजने से पहले QP, या B64 का उपयोग कर एन्कोडिंग कोशिश कर सकते हैं .... यही कारण है कि आपकी समस्या का समाधान हो सकता है ...

यह एक दिलचस्प एक है, और मैं आगे देख रहा हूँ इसका परिणाम

+0

मैंने अंततः इस समस्या को हल नहीं किया और हमें केवल 1 बार समस्या थी। मैं इस जवाब को सबसे संभावित परिदृश्य के रूप में स्वीकार करने जा रहा हूं। मुझे लगता है कि उपयोगकर्ता दर्ज डेटा को एक बहुत ही चालाक तरीके से तैयार किया जाना चाहिए। मैं वास्तव में उपयोगकर्ता को डेटा फ़ाइल संलग्नक के रूप में डेटा जोड़ने का विचार पसंद करता हूं। –

1

आपका कोड बहुत सुरक्षित दिखता है, इसलिए मुझे नहीं लगता कि समस्या आपकी तरफ है।

आईएमओ, या तो किसी ने एसएमटीपी संदेश को रोक दिया, जबकि इसे मेलसेवर को भेजा जा रहा था और अतिरिक्त सीसी: लाइन इंजेक्शन दी गई थी; या मेलसेवर समझौता किया गया है।

यदि आपको कोई जवाब नहीं मिल रहा है तो मैं सुझाव देता हूं कि माइक्रोसॉफ्ट से सीधे संपर्क करें - आपने .NET Framework में एक शोषण खोला होगा।

0

एक कामकाज के रूप में, आप एसिमेटिकल लिप्यंतरण (उदाहरण के लिए सार्वजनिक कुंजी लिखित) का उपयोग करके ईमेल संदेश क्यों लिखे गए हैं? इस तरह केवल इच्छित रसीद इसे पढ़ने में सक्षम हो जाएगा।

इस तरह से यदि बुरे लोगों को आपके संदेश की प्रतिलिपि मिलती है (जो भी मतलब है) तो अब इसका उपयोग किया जाएगा।

यदि आपके पास एफबीआई या Google जैसी उच्च प्रोफ़ाइल वेबसाइट है, तो बहुत सारे रचनात्मक लोग बहुत समय व्यतीत करेंगे और इसे समझने के लिए बड़ी अवधि में जाएंगे। विस्तृत त्रुटि संदेशों की रक्षा करना बेहद महत्वपूर्ण है।