JAVA代码审计-纵向越权漏洞分析

news2024/9/26 5:18:07

查看这个cms系统后台管理员 添加用户的页面

点击添加管理员

 

这个模块只有管理员拥有,普通用户没有这个模块。

打开源码分析是否存在越权漏洞。

------------------------------------------------------------------------------------------------------------

表单代码

<form name="adminForm" id="adminForm">
      <input type="hidden" name="item" value="${item}" />
     <table border="0" cellpadding="0" cellspacing="0" class="table_c1">
       <tr>
   <td class="label_c" width="15%"><label><fmt:message key="username" bundle="${messagesBundle}"/>:</label></td>
   <td width="85%">
      <c:if test="${item==null}">
               <input type="text"  value="${admin.username}" name="username" id="username" class="wid_80"/>
           </c:if>
           <c:if test="${item!=null}">
               <input type="text" readonly value="${admin.username}" name="username" id="username" class="wid_80"/>
           </c:if>
   </td>
</tr>
<tr>
   <td class="label_c"><label>姓名:</label></td>
   <td>
           <input type="text" value="${admin.adminName}" name="name" id="name" class="wid_80"/>
   </td>
</tr>
<tr>
   <td class="label_c"><label><fmt:message key="sex" bundle="${messagesBundle}"/>:</label></td>
   <td>
           <select name="sex" id="sex">
               <option value="">--请选择--</option>
               <option value="男">男</option>
            <option value="女">女</option>
            </select>
   </td>
</tr>
   <tr>
   <td class="label_c"><label><fmt:message key="role" bundle="${messagesBundle}"/>:</label></td>
   <td>
           <select name="role" id="role">
               <option value="">--请选择--</option>
               <c:forEach items="${roleList}" var="role" varStatus="status">
                  <option value="${role.id }">${role.name}</option>
            </c:forEach>
            </select>
   </td>
</tr>
             <tr>
   <td class="label_c"><label><fmt:message key="qq" bundle="${messagesBundle}"/>:</label></td>
   <td>
           <input type="text" name="qq" id="qq"  value="${admin.qq}" class="wid_80"/>
   </td>
</tr>
     </table>
  
  </form>
	<!--表单悬浮层提交 -->
		<div class="right_bottom_btnlist">
			<ul>
				<li>
					<input type="submit" value="<fmt:message key="submit" bundle="${messagesBundle}"/>" class="button-2 vcenter" onclick="add()"/>
				</li>
			</ul>	
		</div>

查看触发post请求的js代码

<script>
   function add(){
       var username=requree_name("username") && requree_length("username",6,20);
       var name=requree_name("name") && requree_length("name",2,20);
       var role=document.getElementById("role").value;
//requree_name函数可能用于验证username字段是否符合指定规则,而requree_length函数可能用于验证username字段的长度是否在指定范围内
            if(!username){
               layer.alert("用户名为必填项,限制6~20位");
            }else if(!name){
               layer.alert("请输入姓名,限制2~20位");
            }else if(role==""||role==null){
               layer.alert("请设置所属角色!");
            }else{
               var params= $('#adminForm').serialize();
          $.ajax({
             url:"<%=basePath%>admin/addAdmin", //后台处理程序
             type:'post',         //数据发送方式
             dataType:'json',
             data:params,         //要传递的数据
             success:function(data){
                alert(data.tip);
                parent.window.location.reload();
             }
         }); 
            }
       
   }
   document.getElementById("role").value="${admin.role}";
   document.getElementById("sex").value="${admin.adminSex}";
   var height = $(window).height();
   $(".middle_cnt_c2").height(height-80);
   $(window).resize(function () {          //当浏览器大小变化时
      var height = $(window).height();
      $(".middle_cnt_c2").height(height-80);
   });
</script>

根据提交的接口定位到<%=basePath%>admin/addAdmin 后端源码

@WebServlet(
    displayName = "添加管理员",
    name = "AddAdmin",
    urlPatterns = {"/admin/addAdmin"}
)
/*这是一个Java Servlet的注解(Annotation),用于将Java类声明为一个Web应用程序的Servlet。该注解中包含了多个参数:
	displayName:Servlet的显示名称,可以在Web应用程序管理界面中使用;
	name:Servlet的名称,必须是唯一标识符,在Web应用程序中引用时会用到;
	urlPatterns:Servlet映射的URL模式,可以是一个字符串数组,每个字符串对应一个URL模式。
在这个例子中,该Servlet被映射到了URL模式/admin/addAdmin,也就是说当用户请求这个URL时,容器会将该请求交给AddAdmin Servlet来处理*/
public class AddAdmin extends HttpServlet {
    public AddAdmin() {
    }

    public void destroy() {
        super.destroy();
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        AdminService as = new AdminService();
//AdminService 是一个自定义的类controller,它可能是用于处理与管理员相关的业务逻辑或提供相应的服务。通过创建 AdminService 对象,我们可以使用该对象中的方法来执行特定的操作,例如管理管理员账户、处理管理员权限等。
        HttpSession session = request.getSession(true);
        Object user = session.getAttribute("user");
/*这段代码用于获取当前请求所关联的HTTP Session,并从中获取属性名为"user"的属性值。

首先,request.getSession(true)方法用于获取当前请求所对应的Session对象。如果Session对象不存在,则会创建一个新的Session对象并返回。如果传入的参数为false,则表示只会查找已经存在的Session对象,如果不存在,则返回null。

然后,session.getAttribute("user")方法用于获取当前Session中名称为"user"的属性值。如果该属性不存在,则返回null。注意,Session是一种保存在服务器端的数据对象,在Session中保存的数据在整个会话期间都可以被访问和修改。*/
        String json = "";
        String id = request.getParameter("item");//
        String admin_username = request.getParameter("username");
        String admin_passbak = "123456";
        String admin_pass = Md5Util.getMD5Str(admin_passbak);
        String admin_name = request.getParameter("name");
        String admin_sex = request.getParameter("sex");
        String admin_role = request.getParameter("role");
        String qq = request.getParameter("qq");
        Locale loc = new Locale("zh", "CN");
        ResourceBundle rb = ResourceBundle.getBundle("messages", loc);
        String adminTip = rb.getString("adminTip");
        
        String flag = "";
        if (user == null) {
            RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/login.jsp");
            request.setAttribute("tip", adminTip);
            rd.forward(request, response);
        } else {
            boolean f = false;
            if (id != null && !id.equals("") && !id.equals("undefined")) {
                if (!admin_username.trim().equals("")) {
                    flag = as.updateAdmin(id, admin_role, admin_name, admin_sex, qq);
//控制器controller执行了updateAdmin 其中id 可控 可能为唯一键值 ,造成了越权漏洞
                    
                    if (flag.equals("ok")) {
                        json = "{\"tip\":\"" + rb.getString("modify") + rb.getString("success") + "\"}";
                    } else {
                        json = "{\"tip\":\"" + rb.getString("modify") + rb.getString("failure") + "\"}";
                    }
                } else {
                    json = "{\"tip\":\"" + rb.getString("name") + rb.getString("not") + rb.getString("empty") + "\"}";
                }
            } else if (!admin_username.trim().equals("")) {
                try {
                    f = as.geyUser(admin_username);
                } catch (SQLException var22) {
                    var22.printStackTrace();
                }

                if (f) {
                    flag = as.saveAdmin(admin_username, admin_pass, admin_passbak, admin_role, admin_name, admin_sex, qq);
                    if (flag.equals("ok")) {
                        json = "{\"tip\":\"" + rb.getString("add") + rb.getString("success") + "," + rb.getString("default") + rb.getString("password") + ":123456\"}";
                    } else {
                        json = "{\"tip\":\"" + rb.getString("add") + rb.getString("failure") + "\"}";
                    }
                } else {
                    json = "{\"tip\":\"" + rb.getString("username") + rb.getString("already") + rb.getString("there") + "\"}";
                }
            } else {
                json = "{\"tip\":\"" + rb.getString("name") + rb.getString("not") + rb.getString("empty") + "\"}";
            }

            out.print(json);
        }

    }

    public void init() throws ServletException {
    }
}

urlPatterns:Servlet映射的URL模式,URL模式/admin/addAdmin,映射到了此Servlet类。

AdminService 是一个自定义的类controller,它可能是用于处理与管理员相关的业务逻辑或提供相应的服务。通过创建 AdminService 对象,我们可以使用该对象中的方法来执行特定的操作,例如管理管理员账户、处理管理员权限等。

控制器controller执行了updateAdmin 其中id 可控 可能为唯一键值 ,造成了越权漏洞。

执行updateAdmin 没有对用户的身份权限信息(管理员)做任何验证处理。只要当前session存在user,即使是普通账户也可以执行updateAdmin,而传入的参数都为我们用户可控,由此引发越权漏洞。

利用方式
        伪造这个接口的http请求头,将cookie信息设置成我们普通用户的cookie,输入我们想要的请求体(增加新的管理员信息),发送。

总结
        无论是纵向越权还是横向越权,我们都需要对用户信息做再次的验证,对于一些敏感信息像id这种唯一键值尽量不要存放在前端,............

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1130793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

引领位置服务驱动:腾讯地图 WebService 服务端 API 实用指南

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

SQL server中:常见问题汇总(如:修改表时不允许修改表结构、将截断字符串或二进制数据等)

SQL server中&#xff1a;常见问题汇总 1.修改表时提示&#xff1a;不允许修改表结构步骤图例注意 2.将截断字符串或二进制数据。3.在将 varchar 值 null 转换成数据类型 int 时失败。4.插入insert 、更新update、删除drop数据失败&#xff0c;主外键FOREIGN KEY 冲突5.列不允许…

华为昇腾NPU卡 大模型LLM ChatGLM2模型推理使用

参考&#xff1a;https://gitee.com/mindspore/mindformers/blob/dev/docs/model_cards/glm2.md#chatglm2-6b 1、安装环境&#xff1a; 昇腾NPU卡对应英伟达GPU卡&#xff0c;CANN对应CUDA底层&#xff1b; mindspore对应pytorch&#xff1b;mindformers对应transformers 本…

C语言程序设计——题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

题目&#xff1a;一个整数&#xff0c;它加上100后是一个完全平方数&#xff0c;再加上168又是一个完全平方数&#xff0c;请问该数是多少&#xff1f; 程序分析&#xff1a; 假设该数为 x。 1、则&#xff1a;x 100 n2, x 100 168 m2 2、计算等式&#xff1a;m2 - n2…

Spring Cloud Alibaba nacos配置中心

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…

所求和问题

&#xff08; 1 2 3 ) 2 1 2 2 2 3 2 2 ∗ ( 1 ∗ 2 1 ∗ 3 2 ∗ 3 ) &#xff08;123)^21^22^23^22*(1*21*32*3) &#xff08;123)21222322∗(1∗21∗32∗3) n input() a list(map(int,input().split())) s1 sum(a) ** 2 s2 0 for i in a:s2 i ** 2 ans (s1 …

STM32F4 磁链观测器+PLL 无感无刷电机位置驱动

在前面几节我们介绍了基于stm32f1的定点运算的滑膜观测器反正切以及stm32f4的浮点运算滑膜PLL的案例&#xff0c;大家反馈的还挺好&#xff0c;在做售后的过程中有小伙伴咨询了磁链观测器和隆伯格观测器&#xff0c;针对磁链观测器咨询的较多&#xff0c;我们调试了磁链的程序&…

C语言每日一题(18)数组匹配

牛客网 BC156 牛牛的数组匹配 题目描述 描述 牛牛刚学会数组不久&#xff0c;他拿到两个数组 a 和 b&#xff0c;询问 b 的哪一段连续子数组之和与数组 a 之和最接近。 如果有多个子数组之和同样接近&#xff0c;输出起始点最靠左的数组。 输入描述&#xff1a; 第一行输…

SpringAOP源码解析之基础设施注册(一)

写在最前 AspectJ和Spring AOP是两种实现AOP&#xff08;面向切面编程&#xff09;的不同方式&#xff0c;它们在实现机制和使用方式上存在一些区别。 AspectJ是一种独立的AOP框架&#xff0c;它提供了比Spring AOP更强大和更灵活的功能。AspectJ可以在编译时或者运行时织入切…

ICMP权限许可和访问控制漏洞处理(CVE-1999-0524)

一、问题描述 某次例行安全扫描&#xff0c;发现&#xff1a;ICMP权限许可和访问控制漏洞&#xff0c;编号&#xff1a;CVE-1999-0524&#xff0c;危险级别&#xff1a;低风险。利用该漏洞&#xff0c;远程主机会回复ICMP_TIMESTAMP查询并返回它们系统的当前时间&#xff0c;I…

浅谈安科瑞ASJ继电器在马尔代夫环岛水上排屋的应用

摘要&#xff1a;对电气线路进行接地故障保护&#xff0c;方式接地故障电流引起的设备和电气火灾事故越来越成为日常所需。针对用户侧主要的用能节点&#xff0c;设计安装剩余电流继电器&#xff0c;实时监控各用能回路的剩余电流状态。通过实时监控用能以及相关电力参数、提高…

asp.net乡村旅游管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net乡村旅游管理系统是一套完善的web设计管理系统系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c# 语言开发 asp.net乡村旅游管理系统 二、…

2018年亚太杯APMCM数学建模大赛B题人才与城市发展求解全过程文档及程序

2018年亚太杯APMCM数学建模大赛 B题 人才与城市发展 原题再现 招贤纳士是过去几年来许多城市的亮点之一。北京、上海、武汉、成都、西安、深圳&#xff0c;实际上都在用各种吸引人的政策来争夺人才。人才代表着城市创新发展的动力&#xff0c;因为他们能够在更短的时间内学习…

Linux国产系统无法连接身份证读卡器USB权限解决办法

​ 如上图&#xff1a;连接身份证读卡器失败 接入读卡器后&#xff0c;运行output&#xff0c;读卡报错&#xff1a;libusb open device with pid vid: Resource temporarily unavailable&#xff0c;连接读卡器失败&#xff0c;t_nRe -1 &#xff0c;这是由于未接入读卡器或…

JavaEE 网络原理——TCP的工作机制(末篇 其余TCP特点)

文章目录 一、滑动窗口二、流量控制三、拥堵控制四、延时应答五、捎带应答六、面向字节流七、异常情况八、总结 其余相关文章&#xff1a; JavaEE 网络原理——TCP的工作机制(中篇 三次握手和四次挥手) 本篇文章衔接的是前面两篇文章的内容&#xff0c;在这里继续解释 TCP 的内…

GO语言代码示例

首先&#xff0c;我们需要安装 rod 库&#xff0c;这是一个用于构建网络爬虫的 Go 语言库。 使用 go get 命令安装 rod 库&#xff1a;go get -u github.com/gofiber/rod 创建一个新的 Go 程序文件&#xff0c;例如&#xff1a;main.go 在 main.go 文件中&#xff0c;导入 r…

(免费领源码)java#Springboot#mysql 大学生兼职平台94598-计算机毕业设计项目选题推荐

摘 要 当今人类社会已经进入信息全球化和全球信息化、网络化的高速发展阶段。丰富的网络信息已经成为人们工作、生活、学习中不可缺少的一部分。人们正在逐步适应和习惯于网上贸易、网上购物、网上支付、网上服务和网上娱乐等活动&#xff0c;人类的许多社会活动正在向网络化发…

认识环境变量和进程替换,实现一个简易的shell

文章目录 一、环境变量1.什么是环境变量2.环境变量的分类3.查看环境变量4.设置环境变量5.获取环境变量 二、进程控制1.进程终止2.进程等待3.进程替换 三、实现一个简单的shell 一、环境变量 1.什么是环境变量 首先&#xff0c;在百度百科中&#xff0c;环境变量的解释是这样的…

第1篇 目标检测概述 —(3)目标检测评价指标

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。目标检测评价指标是用来衡量目标检测算法性能的指标&#xff0c;主要包括几个指标&#xff1a;精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、交并比&#xff08;IoU&#xff09;、平均…