当前位置: 首页 > news >正文

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

 

相关文章:

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

查看这个cms系统后台管理员 添加用户的页面 点击添加管理员 这个模块只有管理员拥有&#xff0c;普通用户没有这个模块。 打开源码分析是否存在越权漏洞。 ------------------------------------------------------------------------------------------------------------ …...

【PG】PostgreSQL逻辑备份(pg_dump)

目录 命令格式 连接选项 参数选项 使用举例 pg_dump是用于备份一种PostgreSQL数据库的工具。即使数据库正在被并发使用&#xff0c;它也能创建一致的备份。pg_dump不阻塞其他用户访问数据库&#xff08;读取或写入&#xff09;。 pg_dump只备份单个数据库。要备份一个集簇…...

JVM、JRE、JDK

JVM JVM&#xff08;Java Virtual Machine&#xff09;是Java虚拟机的缩写&#xff0c;他是Java编程语言运行时环境&#xff0c;负责执行Java字节码。另外作为JVM虚拟机&#xff0c;它在各种操作系统上提供统一的平台&#xff0c;这帮助Java应用程序可以独立于操作系统底层运行…...

Latex 插入矢量图

引用宏包 \usepackage{svg} \begin{figure}[h] \includesvg{filename} \end{figure} 如果插入的 svg 图片文字超出了图形&#xff0c;使用&#xff1a; \usepackage[inkscapelatexfalse]{svg}...

git:删除上一次 commit 中的某个文件,并重新提交

1. 首先&#xff0c;使用以下命令删除要移除的文件&#xff1a; git rm 文件路径将 “文件路径” 替换为要删除的文件的实际路径。这将从 Git 仓库中删除该文件&#xff0c;并将其放入暂存区。git rm 相当于 linux rm git add 命令。 2. 使用以下命令修改上一次的提交&#…...

proxy解决跨域问题

在使用vite工具创建的项目中解决跨域问题&#xff1a; 在vue.config.js中配置如下代码&#xff1a; const { defineConfig } require(‘vue/cli-service’) module.exports defineConfig({ transpileDependencies: true, server:{ proxy:{ ‘/path’:{ target:‘https://i.…...

Ubuntu源码编译samba

概述 本人最近研究samba的源码&#xff0c;但是在源码编译的时候&#xff0c;本以为直接config,make,make install。没想到编译过程中碰到很多麻烦&#xff0c;主要是各种依赖问题。 基于此&#xff0c;本文把samba编译的详细过程记录下来&#xff0c;以供再次研究借鉴。 软件…...

conda虚拟环境配置

命令行输入&#xff0c;conda -V 确定conda版本 创建自己的conda虚拟环境 activate 回车 conda create -n 名字 python版本号 执行命令 确认执行命令 输入y 创建完成 激活环境 conda activate 名字 进入python环境 python 退出 exit() conda deactive...

如何制作自己的数字人

如何制作自己的数字人呢&#xff1f;不用担心平台的使用授权&#xff0c;也不用担心哪一天自己自媒体被号被无故封杀&#xff0c;那么SadTalker将是你的首选&#xff0c;他是完全开源的数字人软件&#xff0c;现已达到Apache2的授权&#xff0c;完全自由的开源软件。作者自己试…...

JAVA毕业设计103—基于Java+Springboot+vue的药店管理系统(源码+数据库)

基于JavaSpringbootvue的药店管理系统(源码数据库) 一、系统介绍 本系统前后端分离 -功能: 登录、药库药品管理、统计查询、药房管理、物资管理、挂号管理、账号管理、角色管理、权限管理、登录日志管理、药品管理、药品类型管理、客人类型管理 二、所用技术 后端技术栈&a…...

LeetCode66——加一

LeetCode66——加一 题目描述&#xff1a; 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例…...

CV计算机视觉每日开源代码Paper with code速览-2023.10.23

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【目标检测】Zone Evaluation: Revealing Spatial Bias i…...

C语言 sizeof 函数内部进行计算

直接看代码 #include <stdio.h> int main() {int i 2;int j;j sizeof(i i);printf("i %d, j %d", i ,j);return 0; }执行结果&#xff1a; 可以看到 i的值一直是没有变的&#xff0c; j 是int类型下 sizeof占用的大小为 4个字节&#xff0c;不是i的 22…...

导致爬虫无法使用的原因有哪些?

随着互联网的普及和发展&#xff0c;爬虫技术也越来越多地被应用到各个领域。然而&#xff0c;在实际使用中&#xff0c;爬虫可能会遇到各种问题导致无法正常工作。本文将探讨导致爬虫无法使用的原因&#xff0c;并给出相应的解决方法。 一、目标网站反爬虫机制 许多网站为了…...

paddlepaddle使用实践过程中的问题记录

环境背景 python&#xff1a;3.10.11 系统&#xff1a;macOS Big Sur 11.7.10 cpu&#xff1a;Intel Core i7 2.6GHz 内存&#xff1a;16G paddle版本问题 初始安装的是的MacOS cpu 2.5.1版本&#xff0c;在python解释器中执行import paddle时报错&#xff1a; ImportError:…...

MySQL数据库 #3

文章目录 一、创建表的完整语法二、约束条件1.unsigned &#xff08;无符号&#xff09;2. zerofill &#xff08;0填充&#xff09;3. default &#xff08;默认值&#xff09;4. not null&#xff08;非空&#xff09;5. unique&#xff08;唯一&#xff09;6. primary key &…...

XQ350441.0、XQ350641.0、XQ350441.1、XQ350641.1、XQ350441.2、XQ350641.2三位五通电磁气动阀

XQ230440、XQ230640、XQ230840、XQ231040、XQ231540二位三通气动电磁阀&#xff1b;XQ250440、XQ250640、XQ250840、XQ251040、XQ251540二位五通电磁气动阀&#xff1b;XQ240440二位四通电磁气动阀&#xff1b;XQ230441、XQ230641、XQ230841、XQ231041、XQ231541二位三通电磁气…...

降本增效神器?Share Creators 智能数字资产管理系统真香!

降本增效似乎是一个持续又永久的话题。尤其在今年&#xff0c; 显得格外的重要~ 在各行各业都受到了疫情所带来巨大冲击的背景下&#xff0c;降本增效对很多企业来说不再是锦上添花&#xff0c;而可能是一条唯一的出路。 随着市场的收缩和竞争的加剧&#xff0c;在更“卷”的…...

2023年中国汽车差速器需求量、竞争现状及行业市场规模分析[图]

差速器是汽车驱动系统的主要部件&#xff0c;它的作用就是在向两边半轴传递动力的同时&#xff0c;允许两边半轴以不同的转速旋转&#xff0c;满足两边车轮尽可能以纯滚动的形式作不等距行驶&#xff0c;减少轮胎与地面的摩擦。汽车差速器是驱动车轮差速转弯或复杂路面强力通过…...

【ceph】ceph集群的节点机器重启,导致磁盘的lvm消失,如何恢复呢~~满满的都是干货

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...