ASP.NET中的SMTP头注入?

前端之家收集整理的这篇文章主要介绍了ASP.NET中的SMTP头注入?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的ASP.NET网站有一个全局错误处理程序,当Web应用程序中出现任何类型的错误时,它会向我(以及另一个开发人员)发送电子邮件.我们最近收到一条错误,其中包含我们从未听说过的电子邮件地址的CC.可怕的是,发送错误电子邮件的开发人员列表在编译的ASP.NET代码中进行了硬编码.我们没有看到如何添加CC.

我们也非常怀疑犯规行为,因为导致错误的请求是尝试使用我们的某个表单发送垃圾邮件.发送请求的IP地址也列在http://www.projecthoneypot.org/上.

我们现在最好的猜测是,请求在某种程度上是错误的,它在电子邮件中注入了CC标头.问题是我们无法弄清楚如何做到这一点.我们正在使用System.Net.Mail发送电子邮件,它似乎可以防止这种情况. MailMessage对象的主题只接受一行,因此您不会创建带有CC行的多行主题.在MailMessage中设置to和cc地址似乎非常强大.我无法看到如何在消息正文中添加CC标头.我找不到任何关于此的信息,我很想知道这是否是一个真正的问题.

编辑:有人要求代码.它有点长,但它是:

  1. public class Global : System.Web.HttpApplication
  2. {
  3. protected void Application_Error(Object sender,EventArgs e)
  4. {
  5. // Get the last exception.
  6. Exception objException = Server.GetLastError();
  7.  
  8. // Work out the error details based on the exception.
  9. string ErrorType = "";
  10. string ErrorDescription = "";
  11. string ErrorHtml = "";
  12.  
  13. if (objException == null)
  14. {
  15. // This should never occur.
  16. ErrorType = "Unknown Error";
  17. ErrorDescription = "Unknown Error";
  18. }
  19. else if (objException.GetType() == typeof(HttpException))
  20. {
  21. // This will occur when the ASP.NET engine throws a HttpException.
  22. HttpException objHttpException = objException as HttpException;
  23. if (objHttpException.GetHttpCode() == 404)
  24. {
  25. string Resource = Globals.GetFullUrl(this.Context);
  26. Server.ClearError();
  27. Response.Redirect("/ResourceNotFound.aspx?BadUrl=" + Server.UrlEncode(Resource));
  28. return;
  29. }
  30. else
  31. {
  32. ErrorType = objHttpException.GetHttpCode().ToString();
  33. ErrorDescription = objHttpException.Message;
  34. }
  35. }
  36. else if (objException.GetType() == typeof(HttpUnhandledException) && objException.InnerException != null && objException.InnerException.GetType() == typeof(HttpException))
  37. {
  38. // This will occur when the code throws a HttpException (e.g. a fake 404).
  39. HttpException objHttpException = objException.InnerException as HttpException;
  40. if (objHttpException.GetHttpCode() == 404)
  41. {
  42. string Resource = Globals.GetFullUrl(this.Context);
  43. Server.ClearError();
  44. Response.Redirect("/ResourceNotFound.aspx?BadUrl=" + Server.UrlEncode(Resource));
  45. return;
  46. }
  47. else
  48. {
  49. ErrorType = objHttpException.GetHttpCode().ToString();
  50. ErrorDescription = objHttpException.Message;
  51. }
  52. }
  53. else if (objException.GetType() == typeof(HttpUnhandledException))
  54. {
  55. // This will occur when a page throws an error.
  56. HttpUnhandledException objHttpUnhandledException = (HttpUnhandledException) objException;
  57. ErrorType = objHttpUnhandledException.GetHttpCode().ToString();
  58. if (objHttpUnhandledException.InnerException != null)
  59. ErrorDescription = objHttpUnhandledException.InnerException.Message;
  60. else
  61. ErrorDescription = objHttpUnhandledException.Message;
  62. if (objHttpUnhandledException.GetHtmlErrorMessage() != null)
  63. {
  64. ErrorHtml = objHttpUnhandledException.GetHtmlErrorMessage();
  65. }
  66. }
  67. else if (objException.GetType() == typeof(HttpRequestValidationException) && !Globals.IsTtiUser(this.Context))
  68. {
  69. // Do nothing. This is mostly just spider junk and we don't want to know about it.
  70. }
  71. else
  72. {
  73. // This will occur when the ASP.NET engine throws any error other than a HttpException.
  74. ErrorType = objException.GetType().Name;
  75. ErrorDescription = objException.Message;
  76. }
  77.  
  78. // Send an email if there's an error to report.
  79. if (ErrorType != "" || ErrorDescription != "")
  80. {
  81. Globals.SendErrorEmail(this.Context,ErrorType,ErrorDescription,ErrorHtml);
  82. }
  83. }
  84.  
  85. public static void SendErrorEmail (HttpContext context,string errorType,string errorDescription,string errorHtml)
  86. {
  87. // Build the email subject.
  88. string Subject = "EM: " + errorType + ": " + context.Request.ServerVariables["SCRIPT_NAME"];
  89.  
  90. // Build the email body.
  91. string Body;
  92.  
  93. StringBuilder sb = new StringBuilder("");
  94. sb.Append("Server:\r\n");
  95. sb.Append(Globals.Server.ToString() + "\r\n");
  96. sb.Append("\r\n");
  97. sb.Append("URL:\r\n");
  98. sb.Append(Globals.GetFullUrl(context) + "\r\n");
  99. sb.Append("\r\n");
  100. sb.Append("Error Type" + ":\r\n");
  101. sb.Append(errorType + "\r\n");
  102. sb.Append("\r\n");
  103. sb.Append("Error Description" + ":\r\n");
  104. sb.Append(errorDescription + "\r\n");
  105. sb.Append("\r\n");
  106. sb.Append("Referring Page:\r\n");
  107. sb.Append(context.Request.ServerVariables["HTTP_REFERER"] + "\r\n");
  108. sb.Append("\r\n");
  109. sb.Append("Date/Time:\r\n");
  110. sb.Append(DateTime.Now.ToString() + "\r\n");
  111. sb.Append("\r\n");
  112. sb.Append("Remote IP:\r\n");
  113. sb.Append(context.Request.ServerVariables["REMOTE_ADDR"] + "\r\n");
  114. sb.Append("\r\n");
  115. sb.Append("User Agent:\r\n");
  116. sb.Append(context.Request.ServerVariables["HTTP_USER_AGENT"] + "\r\n");
  117. sb.Append("\r\n");
  118. sb.Append("Crawler:\r\n");
  119. sb.Append(context.Request.Browser.Crawler.ToString() + "\r\n");
  120. sb.Append("\r\n");
  121. sb.Append("Admin User:\r\n");
  122. sb.Append(context.User.Identity.Name + "\r\n");
  123. sb.Append("\r\n");
  124. sb.Append("\r\n");
  125. Body = sb.ToString();
  126.  
  127. // If there's HTML to represent the error (usually from HttpUnhandledException),// then stuff the body text into the HTML (if possible).
  128. bool HtmlMessage = false;
  129.  
  130. if (errorHtml != "")
  131. {
  132. Regex r = new Regex("(?<thebodytext><body.*?>)",RegexOptions.IgnoreCase);
  133. if (r.IsMatch(errorHtml))
  134. {
  135. Body = Body.Replace("\r\n","<br>");
  136. Body = r.Replace(errorHtml,"${thebodytext}" + Body,1);
  137. HtmlMessage = true;
  138. }
  139. }
  140.  
  141. // Send an email to the TTI developers.
  142. MailMessage objMail;
  143. objMail = new MailMessage();
  144. objMail.From = new MailAddress("from-address");
  145. objMail.To.Add(new MailAddress("to-address"));
  146. objMail.CC.Add(new MailAddress("cc-address"));
  147. objMail.CC.Add(new MailAddress("another-cc-address"));
  148. if (HtmlMessage)
  149. objMail.IsBodyHtml = true;
  150. else
  151. objMail.IsBodyHtml = false;
  152. if (errorType == "404")
  153. objMail.Priority = MailPriority.Low;
  154. else
  155. objMail.Priority = MailPriority.High;
  156. objMail.Subject = Subject;
  157. objMail.Body = Body;
  158.  
  159. try
  160. {
  161. SmtpClient objSmtpClient = new SmtpClient();
  162. objSmtpClient.Send(objMail);
  163. }
  164. finally
  165. {
  166. // Do nothing.
  167. }
  168. }
  169. }

解决方法

我可以看到这是一个非常有创意的攻击的目标……你正在将用户控制的数据填充到你的消息体中……在这一点上,狡猾地使用二进制数据COULD会导致一个BODY在发送期间发送正确的数据用于格式化的SMTP会话JUST RIGHT …如果可以,我建议将正文转换为所有ASCII文本,或者在字符串构建期间,编写一个只允许RFC字符的字符串清理程序.(过滤URL,REFERRER,远程地址和UserAgent).那些是你更有可能的攻击点.

第二个想法可能是在代码中构造一个基本电子邮件,并将您构建的正文作为文本,HTML或PDF文件进行ATTACH.

请记住,SMTP ENVELOPE数据与消息数据不同….如果某人狡猾得足以发送导致在正文部分期间发送CRLFCRLF.CRLFCRLF的正确正文,则会终止发送,然后如果他们继续发送数据,他们可以发送整个MAIL FROM:RCPT TO:,DATA等…(当然,这是不太可能的情况……)……

我很乐意看到您收到的电子邮件的RAW源…(如实际SMTP事务的十六进制转储,而不是Outlook希望您看到的内容,或其他).

在发送消息之前,您也可以尝试使用QP或B64对身体进行编码….这可能会解决您的问题……

这是一个有趣的,我期待它的结果.

猜你在找的asp.Net相关文章