堵上NFine的SubmitForm漏洞

Posted ZGJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堵上NFine的SubmitForm漏洞相关的知识,希望对你有一定的参考价值。

NFine有一个隐藏的漏洞,就是任何登录的用户都可以进行权限修改操作,
比如所有模块的SumbitForm或者其它弹出窗口上的按钮,本身只有登录权限验证,只要是登录用户就可以直接通过模拟Post,Get请求直接进行修改操作。

为了解决这个问题,本文实现一个权限管理办法,防止直接绕过验证,以ItemsData为例,下面上代码。

[HttpPost]
        [HandlerAjaxOnly]
        [HandlerAuthorize(true, @"/SystemManage/ItemsData/Form")]
        [ValidateAntiForgeryToken]
        public ActionResult SubmitForm(ItemsDetailEntity itemsDetailEntity, string keyValue)
        {
            itemsDetailApp.SubmitForm(itemsDetailEntity, keyValue);
            return Success("操作成功。");

注意HandlerAuthorize与原有的有什么不同,可能有人会问,为什么要使用/SystemManage/ItemsData/Form,因为这个模块的修改按钮权限就是这个,为了保持一致性。

public bool Ignore { get; set; }
        public string AuthorizeAction { get; set; }
        public HandlerAuthorizeAttribute(bool ignore = true,string authorizeAction="")
        {
            Ignore = ignore;
            AuthorizeAction = authorizeAction;
        }

  原有的moduleId使用的cookie,根本就是防君子不防小人,而且影响判断,所以去掉。

private bool ActionAuthorize(ActionExecutingContext filterContext)
        {
            var operatorProvider = OperatorProvider.Provider.GetCurrent();
            var roleId = operatorProvider.RoleId;
            var moduleId = "";
            var action = HttpContext.Current.Request.ServerVariables["SCRIPT_NAME"].ToString();
            if (!string.IsNullOrEmpty( AuthorizeAction))//指定需要某Action权限
            {
                action = AuthorizeAction;
            }
            return new RoleAuthorizeApp().ActionValidate(roleId, moduleId, action);
        }
 
public bool ActionValidate(string roleId, string moduleId, string action)
        {

            ....

           else
            {
                authorizeurldata = cachedata;
            }
            //authorizeurldata = authorizeurldata.FindAll(t => t.F_Id.Equals(moduleId));
            foreach (var item in authorizeurldata)
            {
                if (!string.IsNullOrEmpty(item.F_UrlAddress))
                {
                    string[] url = item.F_UrlAddress.Split(‘?‘);
                    //if (item.F_Id == moduleId && url[0] == action)
                    if (url[0] == action)
                    {
                        return true;
                    }
                }
            }
            return false;

  

以上是关于堵上NFine的SubmitForm漏洞的主要内容,如果未能解决你的问题,请参考以下文章

Code-NFine:NFine介绍

Code-NFine:NFine权限控制

NFine常见错误

NFine中权限判断出错的问题

nfine框架怎么集成oracle

安全测试 web安全测试 常规安全漏洞 可能存在SQL和JS注入漏洞场景分析。为什么自己没有找到漏洞,哪么可能存在漏洞场景是?SQL注入漏洞修复 JS注入漏洞修复 漏洞存在场景分析和修复示例(代码片段