建立个人网站代码,园林绿化东莞网站建设,广州软件开发培训机构,邢台有什么网站查看这个cms系统后台管理员 添加用户的页面 点击添加管理员 这个模块只有管理员拥有#xff0c;普通用户没有这个模块。
打开源码分析是否存在越权漏洞。
------------------------------------------------------------------------------------------------------------
…查看这个cms系统后台管理员 添加用户的页面 点击添加管理员 这个模块只有管理员拥有普通用户没有这个模块。
打开源码分析是否存在越权漏洞。
------------------------------------------------------------------------------------------------------------
表单代码
form nameadminForm idadminForminput typehidden nameitem value${item} /table border0 cellpadding0 cellspacing0 classtable_c1trtd classlabel_c width15%labelfmt:message keyusername bundle${messagesBundle}//label/tdtd width85%c:if test${itemnull}input typetext value${admin.username} nameusername idusername classwid_80//c:ifc:if test${item!null}input typetext readonly value${admin.username} nameusername idusername classwid_80//c:if/td
/tr
trtd classlabel_clabel姓名/label/tdtdinput typetext value${admin.adminName} namename idname classwid_80//td
/tr
trtd classlabel_clabelfmt:message keysex bundle${messagesBundle}//label/tdtdselect namesex idsexoption value--请选择--/optionoption value男男/optionoption value女女/option/select/td
/trtrtd classlabel_clabelfmt:message keyrole bundle${messagesBundle}//label/tdtdselect namerole idroleoption value--请选择--/optionc:forEach items${roleList} varrole varStatusstatusoption value${role.id }${role.name}/option/c:forEach/select/td
/trtrtd classlabel_clabelfmt:message keyqq bundle${messagesBundle}//label/tdtdinput typetext nameqq idqq value${admin.qq} classwid_80//td
/tr/table/form!--表单悬浮层提交 --div classright_bottom_btnlistulliinput typesubmit valuefmt:message keysubmit bundle${messagesBundle}/ classbutton-2 vcenter onclickadd()//li/ul /div
查看触发post请求的js代码
scriptfunction add(){var usernamerequree_name(username) requree_length(username,6,20);var namerequree_name(name) requree_length(name,2,20);var roledocument.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||rolenull){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。该注解中包含了多个参数displayNameServlet的显示名称可以在Web应用程序管理界面中使用nameServlet的名称必须是唯一标识符在Web应用程序中引用时会用到urlPatternsServlet映射的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;charsetUTF-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 {}
}
urlPatternsServlet映射的URL模式URL模式/admin/addAdmin映射到了此Servlet类。
AdminService 是一个自定义的类controller它可能是用于处理与管理员相关的业务逻辑或提供相应的服务。通过创建 AdminService 对象我们可以使用该对象中的方法来执行特定的操作例如管理管理员账户、处理管理员权限等。
控制器controller执行了updateAdmin 其中id 可控 可能为唯一键值 造成了越权漏洞。
执行updateAdmin 没有对用户的身份权限信息(管理员)做任何验证处理。只要当前session存在user即使是普通账户也可以执行updateAdmin而传入的参数都为我们用户可控由此引发越权漏洞。
利用方式 伪造这个接口的http请求头将cookie信息设置成我们普通用户的cookie输入我们想要的请求体(增加新的管理员信息)发送。
总结 无论是纵向越权还是横向越权我们都需要对用户信息做再次的验证对于一些敏感信息像id这种唯一键值尽量不要存放在前端............