Java代码审计-因酷网校在线教育系统-越权漏洞分析

news2025/1/12 4:01:29

登录个人账号后,点击基本资料。有更新资料的功能。

2bad4101b46b41f38906a7bf559a0f27.png

查看这个页面的html源码,进行代码审计。(这点怎么通过源码怎么找到的就不提了,写上实在啰嗦了。)

代码jsp页面源码如下,查看这个表单信息

注意:hidden 属性---这是一会越权的伏笔

  <div class="u-account-box">
      <form method="post" id="updateForm">
         <input type="hidden" name="user.userId" value="${user.userId}" />
         <ol class="u-account-li"> 
            <li>
               <label class="u-a-title">
                  <span class="fsize16 c-999">邮 箱</span>
               </label>
               <input type="text" class="u-a-inpt" name="${user.email}" value="${user.email}" placeholder="" readonly="readonly" disabled="disabled">
               <!-- <span class="u-a-error"><em class="u-a-zq icon16">&nbsp;</em></span> -->
            </li>
            <li>
               <label class="u-a-title">
                  <span class="fsize16 c-999">手机号</span>
               </label>
               <input type="text" class="u-a-inpt" name="user.mobile" value="${user.mobile }" placeholder="" readonly="readonly" disabled="disabled">
               <!-- <span class="u-a-error"><em class="u-a-zq icon16">&nbsp;</em></span> -->
            </li>
            <li>
               <label class="u-a-title">
                  <span class="fsize16 c-999">姓 名</span>
               </label>
               <input type="text" class="u-a-inpt" name="user.userName" value="${user.userName }" placeholder="" >
               <!-- <span class="u-a-error"><em class="u-a-cw icon16">&nbsp;</em>请输入正确的账 号</span> -->
            </li>
            <li>
               <label class="u-a-title">
                  <span class="fsize16 c-999">昵 称</span>
               </label>
               <input type="text" class="u-a-inpt" name="user.showName" value="${user.showName}" placeholder="">
               <!-- <span class="u-a-error"><em class="u-a-cw icon16">&nbsp;</em>请输入正确的昵称</span> -->
            </li>
            <li>
               <label class="u-a-title">
                  <span class="fsize16 c-999">性 别</span>
               </label>
               <input type="radio" name="user.sex" <c:if test="${user.sex==1}">checked="checked"</c:if> value="1"/><span class="vam fsize14 c-666">男</span>
               <input type="radio" name="user.sex" <c:if test="${user.sex==2}">checked="checked"</c:if> value="2"/><span class="vam fsize14 c-666">女</span>
               <!-- <span class="u-a-error"><em class="u-a-zq icon16">&nbsp;</em></span> -->
            </li>
            <li>
               <label class="u-a-title">
                  <span class="fsize16 c-999">年 龄</span>
               </label>
               <select name="user.age">
                     <option value="0">0岁</option>
                     <c:forEach var="age" begin="1" end="110">
                        <option <c:if test="${user.age==age}">selected</c:if> value="${age}">${age}岁</option>
                     </c:forEach>
               </select>
               <!-- <span class="u-a-error"><em class="u-a-cw icon16">&nbsp;</em></span> -->
            </li>
         </ol>
      </form>
      <div class="ml50 mt50 pl50">
         <a href="javascript:void(0)" title="" class="comm-btn c-btn-7" onclick="updateUserInfo()">提 交</a>
      </div>
   </div>

找到提交触发的js代码

user.js

/**
 * 修改用户信息
 * @param userId 用户ID
 */
function updateUserInfo(userId){
   var params='';
   $("#updateForm input,#updateForm select").each(function(){
      params+=$(this).serialize()+"&";
    });
   $.ajax({
      url:baselocation+'/uc/updateUser',
      type:'post',
      dataType:'json',
      data:params,
      success:function(result){
         if(result.success==true){
            showUserInfo();
            dialog('提示信息',result.message,0);
         }else{
            dialog('提示信息',result.message,1);
         }
      }
   });
}

这段代码是使用 jQuery 来收集表单中的输入字段(input)和选择字段(select),并将其序列化为 URL 参数字符串的示例。

具体来说,代码首先声明了一个变量 params,用于存储最终生成的参数字符串。然后使用 jQuery 的 .each() 方法遍历了 #updateForm input#updateForm select 两个选择器选中的元素。

在遍历过程中,对于每个选中的元素,调用了 .serialize() 方法来序列化该元素,将其转换为 URL 编码的参数字符串。然后将得到的参数字符串添加到 params 变量中,通过字符串拼接的方式进行累加。最后,在每个字段之间添加了 & 字符串作为分隔符。

通过这段代码的执行,你可以得到一个类似于 param1=value1&param2=value2&param3=value3 的参数字符串。它包含了表单中所有输入字段和选择字段的名称和值的对应关系。

这段代码使用了 jQuery 的 $.ajax() 方法来向服务器发送一个 AJAX 请求,并处理服务器返回的结果。

具体来说,代码中的 $.ajax() 方法包含了一个对象参数,其中包括以下属性:

  • url: baselocation+'/uc/updateUser':指定了请求的 URL 地址,这里的 baselocation 是一个变量或常量,表示基本的请求地址。

  • type: 'post':指定了请求的 HTTP 方法为 POST。

  • dataType: 'json':指定了期望的服务器响应数据类型为 JSON,这样 jQuery 会自动解析响应结果并将其转换为 JavaScript 对象。

  • data: params:指定了请求的数据内容,这里的 params 是之前生成的参数字符串。

  • success: function(result) { ... }:指定了当请求成功完成后的回调函数。其中,result 是服务器返回的响应数据。

success 回调函数中,首先判断 result.success 是否为真(即 true)。若为真,则调用 showUserInfo() 函数展示用户信息,并通过 dialog() 函数显示一个提示信息框,其中 result.message 是成功消息内容。若 result.success 不为真,则同样通过 dialog() 函数显示一个提示信息框,其中 result.message 是失败消息内容。

整个代码的作用是向 baselocation+'/uc/updateUser' 发送一个带有参数的 POST 请求,然后根据服务器返回的结果动态更新页面上的内容和显示提示信息。

请注意,在运行此代码之前,确保引入了 jQuery 库,并在页面加载完毕后执行代码,或将代码放置在合适的事件处理程序中。

如果你需要进一步的帮助,请提供更多上下文或相关代码。

根据post提交的接口,/uc/updateUser,/uc 为指定的拦截器 ,

站点spring-mvc.xml文件

<mvc:interceptor>
    <mvc:mapping path="/uc/*"/>
    <mvc:mapping path="/uc/**/*"/>
    <mvc:exclude-mapping path="/uc/tologin"/>
    <mvc:exclude-mapping path="/uc/getloginUser"/>
    <mvc:exclude-mapping path="/uc/register"/>
    <mvc:exclude-mapping path="/uc/createuser"/>
    <mvc:exclude-mapping path="/uc/login"/>
    <mvc:exclude-mapping path="/uc/passwordRecovery"/>
    <mvc:exclude-mapping path="/uc/sendEmail"/>
    <bean class="com.inxedu.os.common.intercepter.IntercepterWebLogin">
    </bean>
</mvc:interceptor>

IntercepterWebLogin继承HandlerInterceptorAdapter类

class IntercepterWebLogin extends HandlerInterceptorAdapter

具体来说,HandlerInterceptorAdapter 类可以实现以下功能:

  1. preHandle 方法:在请求处理之前执行的方法。可以用来进行登录状态验证、权限检查、日志记录等操作。如果该方法返回 true,则表示允许进入下一步的处理(比如调用控制器方法),如果返回 false,则表示拦截该请求。

  2. postHandle 方法:在请求处理之后、视图渲染之前执行的方法。可以用来修改请求的响应或处理其他后续操作。

  3. afterCompletion 方法:在整个请求完成后执行的方法。可用于进行一些资源清理或处理善后工作。

/updateUser 就为我们响应的方法了,一定位于某个controller中。底层用反射机制实现的方法调用。

定位的到响应的RequestMapping,也可以全局搜索updateUser定位到该方法。

/**
    * 修改用户信息
    */
   @RequestMapping("/updateUser")
   @ResponseBody
   public Map<String,Object> updateUserInfo(HttpServletRequest request){
      Map<String,Object> json = new HashMap<String,Object>();
      try{
         String userName=request.getParameter("userName");//姓名
         if(userName==null||userName.trim().equals("")){
            json=this.setJson(false, "姓名不能为空", null);
            return json;
         }
         String showName=request.getParameter("showName");//昵称
         if(showName==null||showName.trim().equals("")){
            json=this.setJson(false, "昵称不能为空", null);
            return json;
         }
         String sex=request.getParameter("sex");//性别 1男 2女
         if(sex==null||sex.trim().equals("")){
            json=this.setJson(false, "性别不能为空", null);
            return json;
         }
         String age=request.getParameter("age");//年龄
         if(age==null||age.trim().equals("")){
            json=this.setJson(false, "年龄不能为空", null);
            return json;
         }
         String userId=request.getParameter("userId");//用户Id
         if(userId==null||userId.trim().equals("")){
            json=this.setJson(false, "用户Id不能为空", null);
            return json;
         }
         User user=new User();
         user.setUserId(Integer.parseInt(userId));//用户Id
         user.setUserName(userName);//姓名
         user.setShowName(showName);//昵称
         user.setSex(Integer.parseInt(sex));//性别
         user.setAge(Integer.parseInt(age));//年龄
         userService.updateUser(user);//修改基本信息
         json = this.setJson(true, "修改成功", user);
      }catch (Exception e) {
         json=this.setJson(false, "异常", null);
         logger.error("updateUserInfo()---error",e);
      }
      return json;
   }
}

@ResponseBody 不用管,这是底层为维护方法返回的json数据所增加的注解。

这段代码是一个用于更新用户信息的方法。具体功能如下:

  1. 通过 HttpServletRequest 对象获取请求参数,包括 userName(姓名)、showName(昵称)、sex(性别)、age(年龄)和 userId(用户Id)等信息。

  2. 对每个参数进行非空判断,如果有任何一个参数为空或空字符串,则返回一个包含错误信息的 json 对象。

  3. 如果所有参数都不为空,则根据获取的参数创建一个 User 对象,并设置相应的属性值。

  4. 调用 userService.updateUser(user) 方法来更新用户的基本信息。

  5. 如果更新成功,返回一个包含成功信息和更新后的 user 对象的 json 对象;如果出现异常,则返回一个包含异常信息的 json 对象。

user对象没有对用户输入的数据做验证,平且所有的数据字段我们都可以控制。直接set传进来的参数,执行updateUser,这就非常像越权漏洞了。

正确的做法应该是,登录的用户只能修改自己的相关信息,用户Id(唯一键值)应该是固定自己的。

这里就没有必要往下看了,因为之后在updateUser中做本用户的验证几率不大。

如果不放心可以追进这个方法里,看看有没有对输入的数据做验证!是不是按照流程将指定的user参数进行更新。

........

 

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

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

相关文章

【Mysql】Mysql中的B+树索引

概述 从上一章节我们了解到InnoDB 的数据页都是由7个部分组成&#xff0c;然后各个数据页之间可以组成一个双向链表 &#xff0c;而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表 &#xff0c;每个数据页都会为存储在它里边儿的记录生成一个页目录 &#xff…

【AIGC核心技术剖析】大型语言和视觉助手——LLaVA(论文+源码)

🔥 [新!LLaVA-1.5 在 11 个基准测试上实现了 SoTA,只需对原始 LLaVA 进行简单的修改,利用所有公共数据,在单个 1-A8 节点上在 ~100 天内完成训练,并超越使用数十亿级数据的方法。 LLaVA代表了一种新颖的端到端训练大型多模态模型,结合了视觉编码器和骆马 对于通用的视…

微信小程序开发的OA会议之会议个人中心的页面搭建及模板,自定义组件的学习

目录 一.自定义组件及会议效果编写 效果显示 二.个人中心布局 编写结果 ​编辑 一.自定义组件及会议效果编写 在页面中创建一个以components命名的项目来存放组件 再在components文件夹中创建一个组件&#xff0c;名为 :tabs &#xff0c;创建操作如图所示 刚刚创建好会报…

Android中级——MVVM

MVVM MVVM是什么&#xff1f;MVVM实现前提ModelViewModelView MVVM是什么&#xff1f; Model-View-ViewMode架构&#xff0c;可看作MVP改进版&#xff0c;将此前Presenter的逻辑操作交给ViewMode中的Binder去处理 Mode&#xff1a;封装数据存储及相关操作逻辑&#xff0c;与MV…

LeetCode 799. 香槟塔【数组,模拟,简单线性DP】1855

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

Py之tiktoken:tiktoken的简介、安装、使用方法之详细攻略

Py之tiktoken&#xff1a;tiktoken的简介、安装、使用方法之详细攻略 目录 tiktoken的简介 1、性能&#xff1a;tiktoken比一个类似的开源分词器快3到6倍 tiktoken的安装 tiktoken的使用方法 1、基础用法 (1)、用于OpenAI模型的快速BPE标记器 (2)、帮助可视化BPE过程的代…

【SA8295P 源码分析 (三)】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析

【SA8295P 源码分析】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析 一、QNX AIS Server 框架分析二、QNX Hypervisor / Android GVM 方案介绍三、Camera APP 调用流程分析四、QCarCam 状态转换过程介绍五、Camera 加串-解串 硬件链路分析六、摄像头初始化检测过程介绍…

观察者模式-对象间的联动

有个商城小程序&#xff0c;用户希望当有新品上市的时候能通知他们。这样用户就可以不要时刻盯着小程序了。在这个场景中&#xff0c;用户向小程序订阅了一个服务——发送新品短信。小程序在有新品上线时负责向订阅客户发出这个消息。 这就是发布-订阅模式&#xff0c;也称观察…

YOLOv5-调用官方权重进行检验(目标检测)

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客 &#x1f366; 参考文章&#xff1a;365天深度学习训练营-第7周&#xff1a;咖啡豆识别&#xff08;训练营内部成员可读&#xff09; &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制](https…

运放的单电源供电设计

文章目录 运放单电源供电同向比例单电源放大电路设计反向比例单电源放大电路设计 运放单电源供电 同向比例单电源放大电路设计 不放大直流&#xff0c;对直流来说是一个电压跟随器&#xff0c;对交流来说是同向比例 反向比例单电源放大电路设计 注&#xff1a;仪表放大器不能直…

Redis内存回收机制-内存淘汰策略和过期策略

Redis是基于内存操作的非关系型数据库&#xff0c;在内存空间不足的时候&#xff0c;为了保证程序的运行和命中率&#xff0c;就会淘汰一部分数据。如何淘汰数据&#xff1f;这就是Redis的内存回收策略。 Redis中的内存回收策略主要有两个方面&#xff1a; Redis过期策略&#…

nodejs+vue云旅青城系统-旅游网站

用户可以实现首页、个人中心、订票信息管理、路线制定管理等。不仅使服务管理难度变低了&#xff0c;还提升了管理的灵活性。目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 …

【四:Spring整合Junit】

目录 相同点不同点1、导入依赖增加2、编写的位置不同。。路径一定要与实现类一致 相同点 前面都一样和Spring整合mybatis&#xff08;基于注解形式&#xff09;一样Spring整合Mybatis 不同点 1、导入依赖增加 <!-- 单元测试 --><dependency><groupId>junit&…

【MySql】8- 实践篇(六)

文章目录 1. MySql保证主备一致1.1 MySQL 主备的基本原理1.2 binlog 的三种格式对比1.3 循环复制问题 2. MySql保证高可用2.1 主备延迟2.2 主备延迟的来源2.3 可靠性优先策略2.4 可用性优先策略 3. 备库为何会延迟很久-备库并行复制能力3.1 MySQL 5.6 版本的并行复制策略3.2 Ma…

Unity之ShaderGraph如何实现马赛克效果

前言 今天我们来实现一个马赛克的效果 如下所示&#xff1a; 关键节点 Posterize&#xff1a;色调分离节点 图像的色调分离或色调分离需要将色调的连续渐变转换为色调较少的几个区域&#xff0c;并从一种色调突然改变为另一种色调。 原理 原理就是通过色调分离节点&…

华纳云:linux怎么搭建node.js开发环境

搭建Node.js开发环境在Linux系统上非常简单&#xff0c;以下是一些基本步骤&#xff0c;以帮助您开始&#xff1a; 1. 安装Node.js&#xff1a; 您可以通过包管理器来安装Node.js。不同的Linux发行版使用不同的包管理器。以下是一些常见的Linux发行版和它们的包管理器&#xff…

虚拟音频设备软件 Loopback mac中文版软件介绍

创建虚拟音频设备以从应用程序和音频输入设备获取声音&#xff0c;然后将其发送到音频处理应用程序&#xff0c;它就是—Loopback for Mac&#xff0c;Loopback mac为您提供高端工作室混音板的强大功能&#xff0c;有了它在Mac上传递音频会变得很容易。 Loopback for mac中文版…

Paper Reading:《Consistent-Teacher: 减少半监督目标检测中不一致的伪目标》

#pic_center 550x200 目录 简介工作重点方法ASA, adaptive anchor assignmentFAM-3D, 3D feature alignment moduleGMM, Gaussian Mixture Model实施细节 实验与SOTA的比较消融实验 总结 简介 题目&#xff1a;《Consistent-Teacher: Towards Reducing Inconsistent Pseudo-ta…

Flutter开发GridView控件详解

GridView跟ListView很类似&#xff0c;Listview主要以列表形式显示数据&#xff0c;GridView则是以网格形式显示数据&#xff0c;掌握ListView使用方法后&#xff0c;会很轻松的掌握GridView的使用方法。 在某种界面设计中&#xff0c;如果需要很多个类似的控件整齐的排列&…

AI绘画的魅力与未来:人工智能如何重塑艺术创作

随着人工智能&#xff08;AI&#xff09;技术的不断进步&#xff0c;AI绘画已经成为艺术与技术交汇的新领域。通过深度学习、神经网络等先进技术&#xff0c;AI不仅能理解和模拟人类艺术家的创作风格&#xff0c;还能生成令人惊叹的原创艺术作品。本文旨在探讨AI绘画的现状、挑…