• 学习笔记-.net安全越权


    0x00 ASP.NET安全认证

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

    方式描述
    windowIIS验证,在内联网环境中非常有用
    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

  • 相关阅读:
    Nginx代理中使用斜杠的区别
    【Spring】Spring源码中占位符解析器PropertyPlaceholderHelper的使用
    纽禄美卡Neuromeka亮相美国FABTECH,展示用于焊接的3D视觉协作机器人
    LQ0240 括号问题【程序填空】
    2024年浙江财经大学MBA招生简章发布:有哪些看点?
    浅尝Flutter
    GDB调试ROS功能包
    搭建ELK+Filebead+zookeeper+kafka实验
    Intellij IDEA 提效小技巧
    [激光原理与应用-30]:典型激光器 -2- 气体激光器 (连续激光器)
  • 原文地址:https://blog.csdn.net/sinat_35360663/article/details/127729782