【问题标题】:cross site scripting issues with Fullwidth unicode characters全角 unicode 字符的跨站点脚本问题
【发布时间】:2016-06-04 08:03:15
【问题描述】:

我在 Asp.net mvc 5 中开发了一个应用程序。我正面临全角 unicode 字符的跨站点脚本问题。

攻击值:-%uff1cinput/onclick=alert(1)%uff1e

%uff1c =

我知道 Antixss 库可以用来解决这个问题。但是任何人都可以展示如何实现 Antixss 以进行输入过滤和输出编码的示例代码 请为此提出解决方案。

【问题讨论】:

  • Anti XSS and Classic ASP的可能重复
  • 奥利弗我的问题是不同的。如何保护网站免受全角字符 xss 的影响。

标签: xss unicode-normalization antixsslibrary


【解决方案1】:

我遇到了同样的问题,终于找到了解决方法。希望这会帮助遇到同样问题的其他人。

基本上,您需要扩展作为 System.Web.Util 一部分的 RequestValidator 基类。这是我的类,它将过滤掉 unicode 值和小于和大于符号的实际全宽:

using System.Web;
using System.Web.Util;

namespace Common.Extensions
{
    public class RequestValidatorExtension : RequestValidator
    {
        private const string UNICODE_LESS_THAN = "%uff1c";
        private const string UNICODE_GREATER_THAN = "%uff1e";

        public RequestValidatorExtension() { }

        protected override bool IsValidRequestString(
        HttpContext context,
        string value,
        RequestValidationSource requestValidationSource,
        string collectionKey,
        out int validationFailureIndex
        )
        {
            validationFailureIndex = -1;

            if (value.Contains(UNICODE_LESS_THAN))
                value = value.ReplaceWith(UNICODE_LESS_THAN, "<");
            else if (value.Contains("<"))
                value = value.ReplaceWith("<", "<");

            if (value.Contains(UNICODE_GREATER_THAN))
                value = value.ReplaceWith(UNICODE_GREATER_THAN, ">");
            else if (value.Contains(">"))
                value = value.ReplaceWith(">", ">");

            return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
        }
    }
}

在我的例子中,当“恶意”代码添加到文本框中时,它将作为 unicode 值传入。但是,当查询字符串被 Fiddler 拦截并修改时,该值将是全角符号。这就是为什么两者都要检查的原因。

您还必须在 web.config 或 global.asax 页面中注册这个新的 RequestValidationType。以下是两者的示例:

// Web.config
<httpRuntime requestValidationMode="2.0" requestValidationType="namespace.class" />

// Global.asax.cs
protected void Application_Start(object sender, EventArgs e)
{
    RequestValidator.Current = new RequestValidatorExtension();
}

另外,here's a link 向 MS 文档了解如何利用和扩展该类。

希望这会有所帮助,干杯!

【讨论】:

  • 感谢您的指点。这里只是一些cmets。验证器将为每个请求输入执行,因此最好使其更高效。例如value = value.Replace("<", "");
  • @Hainan.Z 是的,这很好。回想起来,我可能应该那样做。但是我没有注意到原始代码有任何性能问题。感谢您的提示!
【解决方案2】:

根据下面的文章,问题的发生是因为如果您的数据库列不支持 nvarchar 或 nchar,SQL 服务器将尝试将 Unicode <> 转换为 Ascii 版本的 。结果,当从数据库中查询到相同的时,就变成了XSS注入。 所以基本上有两种方法可以解决这个问题。 第一个作为@Alec Zorn 的答案,您可以在输入时阻止它们。这是一种简单有效的方法。 第二种方法是您可以将 DB 列更改为使用 nvarchar 或 nchar。但是这种方法将需要您更改很多列。

https://www.gosecure.net/blog/2016/03/22/xss-for-asp-net-developers/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-07
    • 2015-10-22
    • 1970-01-01
    • 2017-03-31
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    相关资源
    最近更新 更多