• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

学习笔记-.net安全越权

武飞扬头像
C-haidragon
帮助1

0x00 ASP.NET安全认证

1.在web.config中有四种验证模式:

方式 描述
window IIS验证,在内联网环境中非常有用
Passport 微软集中式身份验证,一次登录便可访问所有成员站点,需要收费
Form 窗体验证,验证帐号/密码,Web编程最佳最流行的验证方式
None 表示ASP.NET自己根本不执行身份验证,完全依赖IIS身份验证

其中FORM窗体验证的流程图:

学新通

开启form窗体验证的同时还需要配置web.config,不然就会出现问题,一般来说还需要配置最基本的页面访问权限,比如禁止匿名用户访问。

  1.  
    <system.web>
  2.  
    <authorization>
  3.  
    <deny users="?"/>
  4.  
    </authorization>
  5.  
    </system.web>

当然还可以设置一些管理页面允许某某用户访问等等,在这套程序中开启了form然后在程序里面验证的cookies,而且并没有设置所有页面的authorization

2.除去web.config的配置通常还有两种写法来验证是否登陆。

第一种:在每个页面判断Session["UserName"]是否等于null

第二种:类似php的include的继承,这也是本套程序使用的方法。

首先他定义了一个purchase.Master 母版页 在里面写上了权限验证的代码。

学新通

然后次母版页头文件会引入MasterPageFile="~/purchase/purchase.Master"调用之前都会先调用母版页的Page_Load函数来验证是否登陆。当然你也可能遇到没有使用母版页的程序,那么他可能是先定义一个onepage类继承page,然后其他页面继承onepage类,与此相同。

0x01 寻找越权

例1:

比如没有任何验证的,也没有继承验证类的,无需登陆访问

学新通

例2:

这套程序验证权限的地方比较少,只是简单的判断了是否登陆,登陆后基本可以访问大多数管理页面这里。

学新通

例3:

学新通

MyProfile.aspx文件中 直接获取表单数据进行update,并没有验证权限,导致低权限账号也可以update admin但是这里是参数化查询,所以不存在注入。修改admin的账号密码为1234567

学新通

例4:

前面说到这套程序里面验证的cookies,而且并没有设置所有页面的authorization权限,所以我们能不能伪造cookie呢。

学新通

23-26行判断this.uid的值来进行跳转,在16行定义了他的值,跟进UserHelper.GetUserId

  1.  
    public static int GetUserId
  2.  
    {
  3.  
    get
  4.  
    {
  5.  
    if (Helper.IsUseAd && HttpContext.Current.Request.Cookies["userinfo"] == null)
  6.  
    {
  7.  
    UsersHelper.LoginAd(UserHelper.GetSamaccountName());
  8.  
    }
  9.  
    if (HttpContext.Current.Request.Cookies["userinfo"] != null)
  10.  
    {
  11.  
    return int.Parse(HttpContext.Current.Request.Cookies["userinfo"]["userid"]);
  12.  
    }
  13.  
    return -1;
  14.  
    }
  15.  
    }
学新通

this.uid等于cookies中获取的userinfo的值,这一步可以伪造,接着我们看到30-33这里他设置了管理员的布尔值,跟进RoleHelper.IsAdmin

  1.  
    public static bool IsAdmin
  2.  
    {
  3.  
    get
  4.  
    {
  5.  
    string name = "IsAdmin";
  6.  
    string admin = RoleHelper.Admin;
  7.  
    bool? flag = HttpContext.Current.Session[name] as bool?;
  8.  
    if (flag == null)
  9.  
    {
  10.  
    flag = new bool?(UserHelper.IsInAnyRoles(admin));
  11.  
    HttpContext.Current.Session[name] = flag;
  12.  
    }
  13.  
    return flag.Value;
  14.  
    }
  15.  
    }
学新通

前面从session中获取,如果flagnull则从UserHelper.IsInAnyRoles(admin)获取。

跟进IsInAnyRoles

学新通

可以看到只要我们传入的cookiesroles的等于传入的数组值就返回true其中 public static string Admin = "administrators";,所以构造cookies:userinfo=userid=1&roles=administrators;学新通

学新通

github haidragon

https://github.com/haidragon

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfjbeje
系列文章
更多 icon
同类精品
更多 icon
继续加载