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

查看这个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这种唯一键值尽量不要存放在前端,............

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 在LeGO-LOAM中,为了减小纵向的退化,可以对代码进行一些修改,主要包括以下两个方面: 1. 修改特征点的提取方式:在原始的代码中,特征点提取是基于线特征的,因此在车辆行驶方向上的点密度较大,而在垂直方向上的点密度较小,容易造成纵向退化。为了解决这个问题,可以考虑使用体素栅格化的方式来提取特征点,这样可以保证在各个方向上的点密度均匀。 2. 修改地图更新的方式:在原始的代码中,地图更新是基于插值的,即对激光雷达扫描到的每个点都进行插值,得到一个平面地图。这种方式容易造成地图的纵向退化。为了解决这个问题,可以考虑使用体素栅格化的方式来更新地图,这样可以保证在各个方向上的地图精度均匀。 具体的代码修改可以参考以下链接:https://github.com/RobustFieldAutonomyLab/LeGO-LOAM/issues/144 。 注意,代码修改需要仔细测试和验证,以确保修改后的代码能够正常运行,并且能够减小纵向的退化。 ### 回答2: LeGO-LOAM是一个用于3D点云扫描的SLAM算法,通常用于建立机器人在未知环境中的精确定位和地图构建。它采用多传感器融合,包括激光雷达和惯性测量单元(IMU)等传感器。 LeGO-LOAM中的纵向退化主要指的是当机器人在垂直方向移动时,激光雷达的点云数据发生变化,造成定位和地图构建的不准确性。为了减小纵向退化,可以通过以下几种方式实现: 1. 增加IMU的数据融合:IMU能够提供机器人在加速度和角速度方面的信息,通过与激光雷达数据进行融合,可以更准确地估计机器人的位姿。 2. 优化扫描过程中的位姿估计:在扫描点云的过程中,可以采用非线性优化算法对机器人的位姿进行估计和优化,从而减小纵向退化带来的影响。 3. 修正偏移误差:由于激光雷达扫描时存在偏移误差,可以通过对点云进行修正来减小纵向退化。可以采用校正算法,比如ICP(Iterative Closest Point)算法,来寻找最佳的匹配点对,从而减少点云之间的偏差。 4. 使用更先进的激光雷达:研究人员可以使用更先进的激光雷达,如自旋激光雷达,它具有更高的扫描频率和较低的动态误差,可以减小激光雷达对纵向退化的敏感性。 综上所述,要减小LeGO-LOAM中纵向退化,可以通过增加IMU数据融合、优化位姿估计、修正偏移误差和使用更先进的激光雷达等方法,提高定位和地图构建的准确性。 ### 回答3: 在LeGO-LOAM中减小纵向退化的关键是减小纵向动态畸变。在代码实现中可以采取以下措施: 1. 运动补偿:利用激光Odometry前后帧之间的运动信息,对当前帧进行位姿调整,以减小运动引起的畸变。可以使用运动补偿算法,如图像配准或里程计估计等方法来获得准确的运动信息,然后根据运动信息对当前帧进行对齐。 2. 激光扫描插值:激光传感器的扫描频率有限,这会导致在运动过程中,激光点云的纵向分辨率下降。为了减小这种退化,可以对激光的扫描进行插值处理。可以对每个点进行插值或对激光束进行插值,以增加纵向分辨率,从而减小纵向退化。 3. 基于重力校正:地面或地物通常具有明显的水平分布特征。可以通过重力校正来减小纵向退化。利用重力方向的信息,可以将激光点云在纵向方向上进行校正,从而减小非地面点云的影响,提高地面点云的精度。 4. 运动速率控制:在移动载体高速运动或加速过程中,纵向动态畸变会进一步加剧。通过对移动载体的运动速率进行控制,使其在较小范围内稳定运动,以减小纵向动态畸变的影响。 综上所述,在LeGO-LOAM中减小纵向退化的代码实现中,可以采取上述措施来提高纵向分辨率和准确性,从而减小纵向退化的影响,提高定位和建图的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昵称还在想呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值