发新话题
打印

[讨论]关于.Net或服务器端IDS对跨站字符的过滤

[讨论]关于.Net或服务器端IDS对跨站字符的过滤

议题提交:玄猫
议题来源:邪恶八进制信息安全团队

今天在测试一个电信本地门户的论坛的时候,跨站发现下面的问题:
无论我在任何地方写入跨站字符的时候,总是返回如下服务器的错误信息。
复制内容到剪贴板
代码:
“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------

从客户端(txtLink="[url]http://<script>alert[/url]("Hey")...")中检测到有潜在危险的 Request.Form 值。
说明: 请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止。该值可能指示危及应用程序安全的尝试,如跨站点的脚本攻击。通过在 Page 指令或 配置节中设置 validateRequest=false 可以禁用请求验证。但是,在这种情况下,强烈建议应用程序显式检查所有输入。

异常详细信息: System.Web.HttpRequestValidationException: 从客户端(txtLink="[url]http://<script>alert[/url]("Hey")...")中检测到有潜在危险的 Request.Form 值。

源错误:

执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。  

堆栈跟踪:


[HttpRequestValidationException (0x80004005): 从客户端(txtLink="[url]http://<script>alert[/url]("Hey")...")中检测到有潜在危险的 Request.Form 值。]
  System.Web.HttpRequest.ValidateString(String s, String valueName, String collectionName) +240
  System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, String collectionName) +99
  System.Web.HttpRequest.get_Form() +121
  System.Web.UI.Page.GetCollectionBasedOnMethod() +70
  System.Web.UI.Page.DeterminePostBackMode() +128
  System.Web.UI.Page.ProcessRequestMain() +2112
  System.Web.UI.Page.ProcessRequest() +217
  System.Web.UI.Page.ProcessRequest(HttpContext context) +18
  System.Web.CallHandlerExecutionStep.System.Web.HttpApplication+IExecutionStep.Execute() +179
  System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +87
本人分析:
既然是服务器出错类型,那么应该不是用程序过滤的……是不是IIS的ScanUrl插件呢?
那个插件我没用过,但是觉得不是这么限制的吧……
请问:
是不是服务器安装了什么IDS软件呢?
是不是无法绕过呢?
那些好像永远都不会停的雪。那一季永远不结束的冬天。

TOP

<%@page Language="VB" Debug="true" trace="false" validateRequest=false %>
validateRequest默认是true
QQ:838468959

TOP

感谢。
附:MSDN资料

在 Web 应用程序中防止脚本利用
大多数脚本利用发生在用户可以将可执行代码(脚本)插入您的应用程序时。默认情况下,ASP.NET 提供请求验证。不管窗体发送包含什么样的 HTML,该验证都会引发错误。

您可以使用下列方法防止脚本利用:

在接受或显示字符串之前,将 HTML 编码应用于它们,以便字符串不包括任何可执行元素。
如果您的应用程序需要接受某些 HTML,则禁用请求验证并创建您自己的 HTML 筛选器。
本主题中的过程说明如何执行这些任务。

应用 HTML 编码
HTML 编码使用 HTML 保留字符转换 HTML 元素,以便显示它们而不是执行它们。

应用 HTML 编码

在显示字符串之前,调用 Server 对象的 HtmlEncode 方法。HTML 元素会转换为浏览器将显示(而不解释为 HTML)的字符串表示形式。
以下示例说明 HTML 编码。在一个实例中,在显示用户输入之前对其进行编码。在第二个实例中,在显示数据库中的数据之前对其进行编码。

注意  只有通过向 @ Page 指令中添加 alidateRequest="false" 来在页中禁用请求验证时,此示例才将起作用。决不禁用请求验证而不添加您自己的检查或筛选器。
&#39; Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _
    As System.EventArgs) Handles Button1.Click
  Label1.Text = Server.HtmlEncode(TextBox1.Text)
  Label2.Text = _
     Server.HtmlEncode(dsCustomers.Customers(0).CompanyName)
End Sub

// C#
private void Button1_Click(object sender, System.EventArgs e)
{
   Label1.Text = Server.HtmlEncode(TextBox1.Text);
   Label2.Text =
      Server.HtmlEncode(dsCustomers1.Customers[0].CompanyName);
}
筛选 HTML 元素
默认情况下,Web 窗体页检测发送到服务器的信息中的任何 HTML 元素和保留字符。这样,将防止用户试图将脚本嵌入您的应用程序。当页检测到 HTML 时,它会引发一个错误。您可以使用 Page_Error 或 Application_Error 处理程序捕捉此错误。有关详细信息,请参见显示安全的错误信息。

但是,如果您的应用程序需要接受某些 HTML 元素,可关闭请求验证,并创建一个只允许使用要接受的 HTML 元素的筛选器。

注意  不要创建试图只筛选出不可接受元素的筛选器,因为预料每个可能的错误输入十分困难。相反,如果您创建筛选器,则创建一个定义可接受输入的筛选器。
筛选 HTML 元素

通过将属性 ValidateRequest="false" 添加到 @ Page 指令中禁用请求验证。
安全说明  决不要禁用自动请求验证而不添加您自己的检查或筛选器。
使用 HtmlEncode 方法对字符串进行编码。
调用 String.Replace 方法,将要接受的已编码 HTML 标记转换回它们的 HTML 形式。
提示  如果您熟悉正则表达式,则可以使用一个正则表达式来高效地执行筛选。有关详细信息,请参见 .NET Framework 正则表达式。
以下示例说明一个简单的筛选器,它接受加粗元素和带下划线的元素(<b>、</b>、<u>、</u>)。在显示所有其他用户输入之前都对其进行编码。

安全说明  许多 HTML 标记都允许在其属性中使用脚本。例如,标记 <img src="javascript:alert(&#39;hi&#39;)"> 是合法的。如果您希望接受比简单的格式设置标记更复杂的 HTML 标记,则必须确保恶意用户无法假借允许的 HTML 标记将脚本传递到您的应用程序。
&#39; Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim userinput As String = TextBox1.Text
  userinput = Server.HtmlEncode(userinput)
  &#39; Accepts <b>, </b>, <u>, </u>, case-insensitive
  userinput = userinput.Replace("<b>", "<b>")
  userinput = userinput.Replace("</b>", "</b>")
  userinput = userinput.Replace("<B>", "<B>")
  userinput = userinput.Replace("</B>", "</B>")
  userinput = userinput.Replace("<u>", "<u>")
  userinput = userinput.Replace("</u>", "</u>")
  userinput = userinput.Replace("<U>", "<U>")
  userinput = userinput.Replace("</U>", "</U>")
  Label1.Text = userinput
End Sub

// C#
private void Button1_Click(object sender, System.EventArgs e)
{
   String userinput = TextBox1.Text;
   userinput = Server.HtmlEncode(userinput);
   // Accepts <b>, </b>, <u>, </u>, case-insensitive
   userinput = userinput.Replace("<b>", "<b>");
   userinput = userinput.Replace("</b>", "</b>");
   userinput = userinput.Replace("<B>", "<B>");
   userinput = userinput.Replace("</B>", "</B>");
   userinput = userinput.Replace("<u>", "<u>");
   userinput = userinput.Replace("</u>", "</u>");
   userinput = userinput.Replace("<U>", "<U>");
   userinput = userinput.Replace("</U>", "</U>");
   Label1.Text = userinput;
}
那些好像永远都不会停的雪。那一季永远不结束的冬天。

TOP

发新话题