网站地图    收藏   

主页 > 后端 > 网站安全 >

科普 asp.net ValidateRequest filter rule - 网站安全 - 自

来源:自学PHP网    时间:2015-04-17 14:47 作者: 阅读:

[导读] 提取了.net4.0 检验源代码如下: /// 这里伪入口 /// /summary /// param name=s/param /// returns/returns private static bool IsDangerousString(string s) { //先去除\0 s ......

 

 

提取了.net4.0 检验源代码如下:

 

 

 

        /// 这里伪入口

 

        /// </summary>

 

        /// <param name="s"></param>

 

        /// <returns></returns>

 

        private static bool IsDangerousString(string s)

 

        {

 

           //先去除\0

 

            s = RemoveNullCharacters(s);

 

            int macount = 0;

 

            return IsDangerousString(s, out macount);

 

        }

 

 

 

      /// <summary>

 

        /// 去除字符截断

 

        /// </summary>

 

        /// <param name="s"></param>

 

        /// <returns></returns>

 

       private static string RemoveNullCharacters(string s)

 

        {

 

            if (s == null)

 

            {

 

                return null;

 

            }

 

            if (s.IndexOf('\0') > -1)

 

            {

 

                return s.Replace("\0", string.Empty);

 

            }

 

            return s;

 

        }

 

 

 

 

 

       static char[]startingChars = new char[] { '<', '&' };

 

 

 

        private static bool IsAtoZ(char c)

 

        {

 

            return (((c >='a') && (c <='z')) || ((c >='A') && (c <= 'Z')));

 

        }

 

 

 

        /// <summary>

 

        /// 1.没有< 和& 一定可以

 

        /// 2. < 后面是字母或! / ? 都不可以

 

        /// 3. & 后面# 不可以

 

        /// </summary>

 

        /// <param name="s"></param>

 

        /// <param name="matchIndex"></param>

 

        /// <returns></returns>

 

        internal static bool IsDangerousString(string s, out int matchIndex)

 

        {

 

            matchIndex = 0;

 

            int startIndex = 0;

 

            while (true)

 

            {

 

                int num2 = s.IndexOfAny(startingChars, startIndex);

 

                if (num2 < 0)

 

                {

 

                    return false;

 

                }

 

                if (num2 == (s.Length - 1))

 

                {

 

                    return false;

 

                }

 

                matchIndex = num2;

 

                char ch = s[num2];

 

                if (ch !='&')

 

                {

 

                    if ((ch == '<') && ((IsAtoZ(s[num2 + 1]) || (s[num2 + 1] == '!')) || ((s[num2 + 1] == '/') || (s[num2 + 1] == '?'))))

 

                    {

 

                        return true;

 

                    }

 

                }

 

                else if (s[num2 + 1] == '#')

 

                {

 

                    return true;

 

                }

 

                startIndex = num2 + 1;

 

            }

 

        }

 

 

 

总结

 

1. 不出现< 和& 一定是安全的

 

2. 只出现< 或& 单字符是安全的

 

3. < 后出现a-Z , / , ! ,?  是不安全的

 

4. & 后出现# 是不安全的

 

5. 上述未匹配的全部是安全的

 

 

 

结合过滤规则和ie特性,就能找出一些bypass的方法,如ie6 下

 

 

 

<~/XSS/*-*/STYLE=xss:e/**/xpression(alert('XSS'))>

 

 

 

参考

 

http://www.procheckup.com/vulnerability_manager/documents/document_1258758664/bypassing-dot-NET-ValidateRequest.pdf

from:hi.baidu.com/cnqing

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论