【问题标题】:Removing /protecting the id in the url from tampering删除/保护 url 中的 id 不被篡改
【发布时间】:2020-05-18 16:12:46
【问题描述】:

我正在努力解决一些应用程序漏洞。我有一个带有 url http://localhost:12997/Manning_HQ/Edit/1274 的编辑页面,问题是用户能够更改 id 并能够访问不应该访问的其他请求。

我搜索了URLEncoding,但发现它只能确保所有浏览器都能正确传输 URL 字符串中的文本。我的问题是有办法防止这种情况发生吗?

我的编辑功能:

// GET: Manning_HQ/Edit/5
        [CustomAuthorize(Roles = AccessRoleHelper.Add_Manning_Plan_HQ)]
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            var test1 = (from c in db.TBL_Manning_HQ
                         join e in db.TBL_User_Dep_Access
                         on c.Inserted_By equals e.UserID
                         join t in db.TBL_Department
                         on c.Department_ID equals t.Department_ID
                         join p in db.TBL_Location
                         on c.Location_ID equals p.Location_ID
                         join n in db.TBL_Titles_HQ
                        on c.TitleHQ_ID equals n.TitleHQ_ID

                         where (e.Dep_ID == c.Department_ID)
                         where c.Manning_HQ_ID == id
                         select new Manning_HQ_VM
                         {
                             Manning_HQ_ID = c.Manning_HQ_ID,

                         }).ToList();
          
            TBL_Manning_HQ tBL_Manning_HQ = db.TBL_Manning_HQ.Find(id);
            int userid = Convert.ToInt32(Request.ServerVariables["LOGON_USER"].ToString().Split('\\')[1].ToString().Remove(0, 2));

            if (tBL_Manning_HQ == null)
            {
                return HttpNotFound();
            }
            var departments = (from d in db.TBL_Department
                               join ud in db.TBL_User_Dep_Access
                               on d.Department_ID equals ud.Dep_ID
                               join m in db.TBL_Manning_HQ
                               on d.Department_ID equals m.Department_ID
                               where ud.UserID == userid && ud.IsActive == true
                               where m.Manning_HQ_ID == id
                               select new KeyValuePairsViewModel
                               {
                                   Id = d.Department_ID,
                                   Value = d.Department_Name
                               }).ToList();

            ViewBag.Department_ID = new SelectList(departments, "Id", "Value");
            ViewBag.Location_ID = new SelectList(db.TBL_Location, "Location_ID", "Location_Name", tBL_Manning_HQ.Location_ID);
            ViewBag.TitleHQ_ID = new SelectList(db.TBL_Titles_HQ, "TitleHQ_ID", "Title_Name", tBL_Manning_HQ.TitleHQ_ID);


            if (test1.Count != 0)
            {

                return View(tBL_Manning_HQ);

            }
            else
            {
                return View();

            }
        }


        [HttpPost]
        [CustomAuthorize(Roles = AccessRoleHelper.Add_Manning_Plan_HQ)]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(TBL_Manning_HQ _HQ)
        {
            
            var chk_ID = db.TBL_Manning_HQ.Any(x => x.Manning_HQ_ID == _HQ.Manning_HQ_ID);
            var Chk_Dep = db.TBL_Manning_HQ.Where(x=>x.Manning_HQ_ID == _HQ.Manning_HQ_ID).Any(x => x.Department_ID == _HQ.Department_ID);

            if (chk_ID && Chk_Dep)
            {
                _HQ.Update_By = Convert.ToInt32(Request.ServerVariables["LOGON_USER"].ToString().Split('\\')[1].ToString().Remove(0, 2));
                _HQ.Update_In = DateTime.Now;

                db.SaveChanges();

                TempData["success"] = "Data updated successfully !";
            }

            return RedirectToAction("Index");
        }

自定义授权:

 public class CustomAuthorize : AuthorizeAttribute
    {
        Staff_RequisitionEntities_1 db = new Staff_RequisitionEntities_1();

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            if (filterContext.HttpContext.User == null)
            {
                throw new ArgumentNullException("filterContext.HttpContext.User");
            }

            string username = filterContext.HttpContext.User.Identity.Name.ClientName();
            int xceedId = Convert.ToInt32(username.Substring(2));
           
            var user = db.TBL_UserPermissions.FirstOrDefault(us => us.UserID== xceedId && us.IsActive == true);

            {
                filterContext.HttpContext.User = new CustomPrincipal((WindowsIdentity)filterContext.HttpContext.User.Identity,user, true , Convert.ToString(xceedId));
                base.OnAuthorization(filterContext);

            }
        }
    }

访问角色助手:

 public class AccessRoleHelper
    {
        public const string Manning_Plan = "Add Manning Plan";    
        public const string View_Manning_Plan = "View Manning Plan";    
        public const string Add_New_Request = "Add New Request";    
        public const string View_Requestes = "View Requestes";    
        public const string Add_Fulfillment_Rate = "Add Fulfillment Rate";    
        public const string View_Fulfillment_Rate = "View Fulfillment Rate";
        public const string Add_Manning_Plan_HQ = "Add Manning Plan HQ";
        public const string View_Manning_Plan_HQ = "View Manning Plan HQ";
        public const string View_Manning_Plan_HQ_CombCEO = "View Manning Plan HQ Manager"; 
        public const string View_Manning_Plan_CEO = "View Manning Plan CEO";
        public const string Add_Issue_staff_requisition = "Add Issue staff requisition"; 
        public const string Training_Action = "Training Action";
        public const string Admin = "Admin";
        public const string Rec_Action = "Recruitment Actions";
    }

自定义主体:

public CustomPrincipal(WindowsIdentity source, TBL_UserPermissions baseUser ,bool inDb, string ID) :
            base(source)
        {
            
            UserPermission = baseUser;

           
            HttpContext.Current.Session["USERID"] = ID;
        }

        public override bool IsInRole(string role)
        {
           
            bool hasPermission = false;
            if (UserPermission != null && (UserPermission.UserID != null))
            {
               
                hasPermission = db.TBL_UserPermissions.Any(up => up.TBL_Permissions.PermissionName == role && up.IsActive == true && up.UserID == UserPermission.UserID);
            }
         
         return (base.IsInRole(role) || (hasPermission));
        }

        public TBL_UserPermissions UserPermission { get; protected set; }

【问题讨论】:

  • 永远不要相信用户输入,句号!您需要在您的 HttpPost 方法中验证他们是否可以访问服务器端的页面。如果他们无权访问,请将他们重定向到其他页面。
  • 你已经有一个动作过滤器; [CustomAuthorize(Roles = AccessRoleHelper.Add_Manning_Plan_HQ)]。 Mannig_HQ 是属于单个用户还是属于该操作过滤器未处理的单个实体?
  • 嗨@JerdineSabio,我猜是个人用户。我将编辑帖子以分享它的代码。

标签: c# entity-framework asp.net-authorization penetration-testing web-application-security


【解决方案1】:

您需要使用某种验证,一种简单的方法是在末尾添加另一个数字进行验证,并在您尝试访问页面时将其丢弃。

例如你和使用数字的总和:

对于网址 http://localhost:12997/Manning_HQ/Edit/1274

总和 = 1+2+7+4 =>14 -> 1+4 => 5

新的网址将是 http://localhost:12997/Manning_HQ/Edit/12745

【讨论】:

  • 这样的校验位通常适用于您在用户输入数字序列时帮助防止错误的情况,而不是保护机制。这不能替代验证当前用户是否有权访问该行并对检测到的篡改进行操作。
【解决方案2】:

服务器端、控制器/API 代码永远不能信任来自客户端的数据。对于控制器方法,您将拥有与会话关联的经过身份验证的用户。对于每个请求,您都应该断言提供的 ID 可以由会话用户修改。 API 方法将包括身份验证令牌来断言和识别用户,以确定他们是否正在访问适当的记录。

如果您检测到当前用户无权访问的 ID 进入,则会立即向管理员发送有关违规的事件日志通知(用户 ID、记录 ID、日期/时间、IP 地址等。 ) 并终止用户的会话。 (一脚登录)系统应跟踪针对用户的这些违规行为,如果用户的帐户遭到入侵,重复尝试应锁定用户的帐户。 (通常它只是一个好奇的乡巴佬想知道某事是否开放/可能)

更新请求返回的任何数据也是如此。一切都需要验证,并且只有您允许更新的字段应该被保留。这是我建议您永远不要在客户端和服务器之间传递 EF 实体的 #1 原因。请求的负载可能被篡改,因此执行附加 + 修改或更新方法的代码容易受到数据篡改。

【讨论】:

  • 用户 ID 有自定义授权。我编辑了帖子以添加代码。但我想它没有解决问题。我应该添加 if else 并且如果用户未授权我将它们转移到错误页面?
  • 如果用户访问他们未经授权的内容,我建议终止会话并通知管理员。这会将用户踢出身份验证/登录页面。无论 RowID 是通过 URL 还是数据传递,都无法主动防止篡改。您可以尝试对其进行混淆,但最终如果检测到篡改,它应该将会话视为已泄露并结束它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
相关资源
最近更新 更多