gpt4 book ai didi

asp.net - ASP.NET 中的 SMTP header 注入(inject)?

转载 作者:行者123 更新时间:2023-12-04 08:30:50 25 4
gpt4 key购买 nike

我的 ASP.NET 网站有一个全局错误处理程序,当 Web 应用程序出现任何类型的错误时,它会向我(和另一个开发人员)发送电子邮件。我们最近收到一个错误,其中包含对我们从未听说过的电子邮件地址的抄送。可怕的是,错误电子邮件发送给的开发人员列表是硬编码在已编译的 ASP.NET 代码中的。我们看不到如何添加 CC。

我们也非常怀疑犯规行为,因为导致错误的请求是试图使用我们的一种形式发送垃圾邮件。发送请求的 IP 地址也列在 http://www.projecthoneypot.org/ 上。 .

我们现在最好的猜测是该请求以某种方式格式错误,它在电子邮件中注入(inject)了一个 CC header 。问题是我们无法弄清楚如何做到这一点。我们正在使用 System.Net.Mail 发送电子邮件,它似乎可以防止此类事情发生。 MailMessage 对象的主题只接受单行,因此您不会使用抄送行创建多行主题。在 MailMessage 中设置 to 和 cc 地址似乎相当健壮。而且我看不到您如何在邮件正文中添加 CC header 。我找不到有关此的任何信息,我很想知道这是否是一个真正的问题。

编辑:有人要求提供代码。它有点长,但这里是:

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

最佳答案

我可以看到这是一个非常有创意的攻击的目标......您正在将用户控制的数据填充到您的消息正文中......此时,巧妙地使用二进制数据可能会导致一个在发送期间发送正确数据的 BODY SMTP session 以将其格式化为正确... REFERRER、远程地址和 UserAgent)。这些是你更有可能的攻击点。

第二个想法可能是用代码构建一个基本的电子邮件,并将您构建的正文附加为文本、HTML 或 PDF 文件。

请记住,SMTP 信封数据与邮件数据不同......如果他们继续发送数据,他们可以发送整个 MAIL FROM: RCPT TO:, DATA, etc...(当然,这是不太可能的情况...)...

我很想看到你收到的电子邮件的原始来源......(如实际 SMTP 事务的十六进制转储中,不是 Outlook 希望你看到的,或其他)。

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

这是一个有趣的问题,我很期待它的结果。

关于asp.net - ASP.NET 中的 SMTP header 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/639217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com