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

 

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

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

相关文章

对python中切片详解

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 Python中什么可以切片 Python中符合序列的有序序列都支持切片(slice) 如:列表,字符,元祖 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视…

Python 自动化(十五)请求和响应

准备工作 将不同day下的代码分目录管理&#xff0c;方便后续复习查阅 (testenv) [rootlocalhost projects]# ls mysite1 (testenv) [rootlocalhost projects]# mkdir day01 day02 (testenv) [rootlocalhost projects]# cp -rf mysite1/ day01/ (testenv) [rootlocalhost proj…

Spring Cloud Config

Spring Cloud Config 服务端:一个集中化配置中心,可以是一个独立的服务,也可以注册到服务治理中心,它可以集中管理各个 微服务的配置; 作用原理是从某个地方读取(本地/云端)提供给其客户端作为配置; 客户端:作为一个服务端,通过读取Config的服务端来获取自己的配置文件; 服务…

计算机视觉中的数据预处理与模型训练技巧总结

计算机视觉主要问题有图像分类、目标检测和图像分割等。针对图像分类任务&#xff0c;提升准确率的方法路线有两条&#xff0c;一个是模型的修改&#xff0c;另一个是各种数据处理和训练的技巧(tricks)。图像分类中的各种技巧对于目标检测、图像分割等任务也有很好的作用&#…

【AGC】更新应用信息报未知错误解决方法

【问题描述】 最近有几个开发者遇到了一个问题&#xff0c;他们在AGC控制台配置好应用信息的图标和截图之后&#xff0c;点击保存按钮会弹出“未知错误&#xff0c;请稍后再试”的异常报错&#xff0c;导致无法正确保存应用配置信息。 出错页面如图所示。 ​​ 【解决方案】 …

debian、ubuntu打包deb包工具,图形界面deb打包工具mkdeb

debian、ubuntu打包deb包工具&#xff0c;图形界面deb打包工具mkdeb&#xff0c;目前版本1.0 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1QX6jXNMYRybI9Cx-1N_1xw?pwd8888 md5&#xff1a; b6c6658408226a8d1a92a7cf93834e66 mkdeb_1.0-1_all.deb

ES6之Set集合(通俗易懂,含实践)

Set是什么&#xff1f;它的方法有哪些&#xff1f;它在实例开发中有什么作用&#xff1f; 让我为大家介绍一下吧&#xff01; ES6提供了新的数据结构 Set(集合) 。它类似于数组&#xff0c;但成员的值是唯一的。 创建方法&#xff1a; let s new Set()console.log(s)它属于什…

一套成熟的ERP系统,应具备哪些能力?

随着制造业数字化、智能化的不断升级&#xff0c;企业的金字塔静态管理模式也在向扁平化动态管理模式转变&#xff0c;而企业管理系统则是推动这一趋势发展的重要载体。 为了更好地实现企业管理信息化&#xff0c;越来越多的企业在应用ERP系统。ERP对企业经营起着至关重要的辅…

计时的vue写法

<el-input type"text" id"timetext" value"00时00分00秒" readonly></el-input> <el-button type"button" click"start()">开始</el-button> <el-button type"button" click"st…

el-input无法输入的问题和表单验证失败问题(亲测有效)-开发bug总结4

大部分无法输入的问题&#xff1a;基本都是没有进行v-model双向数据绑定&#xff0c;这个很好解决。 本人项目中遇到的bug问题如下&#xff1a; 点击添加&#xff0c;表单内可输入用户名 和 用户姓名&#xff0c;但有时会偶发出现无法这两个input框里面无法输入内容。 原因&a…

常见排序算法之冒泡排序

冒泡排序&#xff0c;英文名Bubble Sort&#xff0c;是一种相对基础的 交换排序方法。这种排序算法的名字来源于它操作的过程&#xff0c;可以类比为数列中的每一个元素都可以像小气泡一样&#xff0c;根据自身的大小一点一点向数组的一侧移动。具体到冒泡排序的工作原理&#…

开启生成式AI的探索之旅,亚马逊云科技分享生成式AI热门案例

现今&#xff0c;生成式AI为企业争先讨论的热门话题&#xff0c;上云出海为企业转型的重中之重。无论你是行业新贵还是中小企业&#xff0c;探索新的模式、创新迭代业务都是不容忽视的重点&#xff0c;下面就来介绍几个亚马逊云科技帮助企业创新的案例。 开启生成式AI的探索之旅…

02333软件工程串讲

完整笔记在语雀 https://www.yuque.com/huangzhanqi/nrt1l4/zoa0g0osnrmog0xdhttps://www.yuque.com/huangzhanqi/nrt1l4/zoa0g0osnrmog0xd 《软件工程》串讲讲义 应考指导 一、课程介绍 1、课程性质 《软件工程》是全国高等教育自学考试计算机及应用&#xff08;独立本科…

曼哈顿距离

曼哈顿距离 以7*7为例 在d<n/2时&#xff1a;打印的图案为菱形 例题&#xff1a; 输入奇数n&#xff0c;显示n行星塔。若输入5&#xff0c;则显示 #include<stdio.h> #include<math.h> int main() {int n, i, j, x, y;scanf("%d", &n);x y n …

Kubernetes速成课程:掌握容器编排的精髓

微服务演进方向 • 面向分布式设计(Distribution):容器、微服务、API 驱动的开发; • 面向配置设计(Configuration):⼀个镜像&#xff0c;多个环境配置; • 面向韧性设计(Resistancy):故障容忍和自愈; • 面向弹性设计(Elasticity):弹性扩展和对环境变化(负载)做出响应; •…

rust学习——操作字符串、字符串转义、操作UTF8-字符串 (操作中文字符串)

文章目录 操作字符串追加 (Push)插入 (Insert)替换 (Replace)1、replace2、replacen3、replace_range 删除 (Delete)1、 pop —— 删除并返回字符串的最后一个字符2、 remove —— 删除并返回字符串中指定位置的字符3、truncate —— 删除字符串中从指定位置开始到结尾的全部字…

【尘缘赠书活动:01期】Python数据挖掘——入门进阶与实用案例分析

引言 本案例将根据已收集到的电力数据&#xff0c;深度挖掘各电力设备的电流、电压和功率等情况&#xff0c;分析各电力设备的实际用电量&#xff0c;进而为电力公司制定电能能源策略提供一定的参考依据。更多详细内容请参考**《Python数据挖掘&#xff1a;入门进阶与实用案例…

CSS设置超出范围滚动条和滚动条样式

CSS设置超出范围滚动条和滚动条样式 效果展示 当块级内容区域超出块级元素范围的时候&#xff0c;就会以滚动条的形式展示&#xff0c;你可以滚动里面的内容&#xff0c;里面的内容不会超出块级区域范围。 未设置超出隐藏&#xff0c;显示滚动条 超出隐藏&#xff0c;显示滚动…

财报解读:双轮驱动下,香飘飘究竟能打开多大的获利空间?

2023年以来&#xff0c;食品饮料行业稳中求进&#xff0c;消费市场情绪逐步上扬。 数据显示&#xff0c;2023年上半年&#xff0c;食品饮料行业实现营收5338.86亿元&#xff0c;同比增长9.65%&#xff1b;归母净利润1125.03亿元&#xff0c;同比增长14.93%&#xff0c;营收和归…

开源博客项目Blog .NET Core源码学习(4:生成验证码)

开源博客项目Blog中的后台管理登录界面中支持输入验证码&#xff08;如下图所示&#xff09;&#xff0c;本文学习并记录项目中验证码的生成及调用方式。   博客项目中调用VerifyCode类生成验证码&#xff0c;该类位于App.Framwork项目中&#xff0c;命名空间为App.Framwork…