.NET MVC 安全漏洞系列

发布时间 2023-09-17 20:32:57作者: 流氓大菠萝

一、XSS漏洞定义

  XSS攻击全称跨站脚本攻击,它允许恶意web用户将代码(如:html代码)植入到页面上,当访问到该页面时,嵌入到页面的html代码会自动执行,从而达到恶意攻击的目的。

二、解决方案

  1.新建立一个XSSHelper帮助类

public static class XSSHelper
    {
        /// <summary>
        /// XSS过滤
        /// </summary>
        /// <param name="html">html代码</param>
        /// <returns>过滤结果</returns>
        public static string XssFilter(string html)
        {
            string str = HtmlFilter(html);
            return str;
        }

        /// <summary>
        /// 过滤HTML标记
        /// </summary>
        /// <param name="Htmlstring"></param>
        /// <returns></returns>
        public static string HtmlFilter(string Htmlstring)
        {
            string result = System.Web.HttpUtility.HtmlEncode(Htmlstring);
            return result;
        }
    }

2.再建立一个XSSFilterAttribute过滤类

/// <summary>
    /// XSS 过滤器
    /// </summary>
    public class XSSFilterAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// OnActionExecuting
        /// </summary>
        /// <param name="context"></param>
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            //获取参数集合
            var ps = context.ActionDescriptor.GetParameters();
            if (ps.Count() == 0)
            {
                return;
            }
            //遍历参数集合
            foreach (var p in ps)
            {
                if (context.ActionParameters[p.ParameterName] != null)
                {
                    //当参数是str
                    if (p.ParameterType.Equals(typeof(string)))
                    {
                        context.ActionParameters[p.ParameterName] = XSSHelper.XssFilter(context.ActionParameters[p.ParameterName].ToString());
                    }
                    else if (p.ParameterType.Equals(typeof(Int64)))
                    {

                    }
                    else if (p.ParameterType.Equals(typeof(Int32)))
                    {

                    }

                    else if (p.ParameterType.IsClass)//当参数是一个实体
                    {
                        PostModelFieldFilter(p.ParameterType, context.ActionParameters[p.ParameterName]);
                    }
                }

            }
        }
        /// <summary>
        /// 遍历实体的字符串属性
        /// </summary>
        /// <param name="type">数据类型</param>
        /// <param name="obj">对象</param>
        /// <returns></returns>
        private object PostModelFieldFilter(Type type, object obj)
        {
            if (obj != null)
            {
                foreach (var item in type.GetProperties())
                {
                    if (item.GetValue(obj) != null)
                    {
                        //当参数是str
                        if (item.PropertyType.Equals(typeof(string)))
                        {
                            string value = item.GetValue(obj).ToString();
                            item.SetValue(obj, XSSHelper.XssFilter(value));
                        }
                        else if (item.PropertyType.Equals(typeof(Int64)))
                        {

                        }
                        else if (item.PropertyType.Equals(typeof(Int32)))
                        {

                        }
                        else if (item.PropertyType.Equals(typeof(Int16)))
                        {

                        }
                        else if (item.PropertyType.IsClass)//当参数是一个实体
                        {
                            //   item.SetValue(obj, PostModelFieldFilter(item.PropertyType, item.GetValue(obj)));
                        }
                    }

                }
            }
            return obj;
        }
    }

3.在控制器上加上该属性,就可对传递过来的参数数值进行过滤(记得要引入对应的命名空间)

 

说明:为什么要加入[ValidateInput(false)],因为用户如果加入类似<script>的话,直接就报错了,界面不友好,所以就修改为后台对输入的内容进行过滤处理。如果压根不希望用户输入类似的字符,需要也在前端进行一下验证就可以了。

 

站点信息侦测(C# MVC)

概述:站点信息侦测漏洞会检测到用的版本信息等,然后借此进行一些攻击。

 

解决方案

一、隐藏MVC版本信息(节点:X-AspNetMvc-Version:)

  1.在Global.asax.cs文件中添加如下代码:

//隐藏MVC版本信息(节点:X-AspNetMvc-Version:)
 MvcHandler.DisableMvcResponseHeader = true;

 再次运行,就不显示节点:X-AspNetMvc-Version了

 

 

二、隐藏asp.net 版本信息(节点:X-AspNet-Version)

  1.在配置文件中找到节点httpRuntime,添加属性enableVersionHeader="false"

<httpRuntime targetFramework="4.5.2" enableVersionHeader="false"  />

再次运行,就不显示节点X-AspNet-Version了

 

三、隐藏X-Powered-By节点

  1.配置文件中找到节点httpRuntime,添加如下代码:(如有就修改,没有就新增)

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>

 再次运行,就不显示节点X-AspNet-Version了

 

四、隐藏Server信息

  在在Global.asax.cs文件中添加如下代码:

/// <summary>
        /// 隐藏/修改 Response Header 中的Server节点(IIS版本信息)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
        {
            HttpApplication application = sender as HttpApplication;
            if (application != null && application.Context != null)
            {
                //移除Server
                application.Context.Response.Headers.Remove("Server");
                //修改Server的显示信息
                //application.Context.Response.Headers.Set("Server", "MyServer");

                //移除X-AspNet-Version,和上面效果相同
                //application.Context.Response.Headers.Remove("X-AspNet-Version");
                //移除X-AspNetMvc-Version,和上面效果相同
                //application.Context.Response.Headers.Remove("X-AspNetMvc-Version");
            }

        }

再次运行,就不显示节点Server了