使用全宽unicode字符跨站点脚本问题

时间:2016-02-22 18:43:09

标签: xss unicode-normalization antixsslibrary

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

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

%uff1c =< %uff1e =>

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

2 个答案:

答案 0 :(得分: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文档。

希望这会有所帮助,加油!

答案 1 :(得分:0)

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

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