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


    查看这个cms系统后台管理员 添加用户的页面

    点击添加管理员

     

    这个模块只有管理员拥有,普通用户没有这个模块。

    打开源码分析是否存在越权漏洞。

    ------------------------------------------------------------------------------------------------------------

    表单代码

    1. <form name="adminForm" id="adminForm">
    2. <input type="hidden" name="item" value="${item}" />
    3. <table border="0" cellpadding="0" cellspacing="0" class="table_c1">
    4. <tr>
    5. <td class="label_c" width="15%"><label><fmt:message key="username" bundle="${messagesBundle}"/>label>td>
    6. <td width="85%">
    7. <c:if test="${item==null}">
    8. <input type="text" value="${admin.username}" name="username" id="username" class="wid_80"/>
    9. c:if>
    10. <c:if test="${item!=null}">
    11. <input type="text" readonly value="${admin.username}" name="username" id="username" class="wid_80"/>
    12. c:if>
    13. td>
    14. tr>
    15. <tr>
    16. <td class="label_c"><label>姓名:label>td>
    17. <td>
    18. <input type="text" value="${admin.adminName}" name="name" id="name" class="wid_80"/>
    19. td>
    20. tr>
    21. <tr>
    22. <td class="label_c"><label><fmt:message key="sex" bundle="${messagesBundle}"/>label>td>
    23. <td>
    24. <select name="sex" id="sex">
    25. <option value="">--请选择--option>
    26. <option value="男">option>
    27. <option value="女">option>
    28. select>
    29. td>
    30. tr>
    31. <tr>
    32. <td class="label_c"><label><fmt:message key="role" bundle="${messagesBundle}"/>label>td>
    33. <td>
    34. <select name="role" id="role">
    35. <option value="">--请选择--option>
    36. <c:forEach items="${roleList}" var="role" varStatus="status">
    37. <option value="${role.id }">${role.name}option>
    38. c:forEach>
    39. select>
    40. td>
    41. tr>
    42. <tr>
    43. <td class="label_c"><label><fmt:message key="qq" bundle="${messagesBundle}"/>label>td>
    44. <td>
    45. <input type="text" name="qq" id="qq" value="${admin.qq}" class="wid_80"/>
    46. td>
    47. tr>
    48. table>
    49. form>
    50. <div class="right_bottom_btnlist">
    51. <ul>
    52. <li>
    53. <input type="submit" value="submit" bundle="${messagesBundle}"/>" class="button-2 vcenter" onclick="add()"/>
    54. li>
    55. ul>
    56. div>

    查看触发post请求js代码

    根据提交的接口定位到<%=basePath%>admin/addAdmin 后端源码

    1. @WebServlet(
    2. displayName = "添加管理员",
    3. name = "AddAdmin",
    4. urlPatterns = {"/admin/addAdmin"}
    5. )
    6. /*这是一个Java Servlet的注解(Annotation),用于将Java类声明为一个Web应用程序的Servlet。该注解中包含了多个参数:
    7. displayName:Servlet的显示名称,可以在Web应用程序管理界面中使用;
    8. name:Servlet的名称,必须是唯一标识符,在Web应用程序中引用时会用到;
    9. urlPatterns:Servlet映射的URL模式,可以是一个字符串数组,每个字符串对应一个URL模式。
    10. 在这个例子中,该Servlet被映射到了URL模式/admin/addAdmin,也就是说当用户请求这个URL时,容器会将该请求交给AddAdmin Servlet来处理*/
    11. public class AddAdmin extends HttpServlet {
    12. public AddAdmin() {
    13. }
    14. public void destroy() {
    15. super.destroy();
    16. }
    17. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    18. }
    19. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    20. response.setContentType("text/html;charset=UTF-8");
    21. PrintWriter out = response.getWriter();
    22. AdminService as = new AdminService();
    23. //AdminService 是一个自定义的类controller,它可能是用于处理与管理员相关的业务逻辑或提供相应的服务。通过创建 AdminService 对象,我们可以使用该对象中的方法来执行特定的操作,例如管理管理员账户、处理管理员权限等。
    24. HttpSession session = request.getSession(true);
    25. Object user = session.getAttribute("user");
    26. /*这段代码用于获取当前请求所关联的HTTP Session,并从中获取属性名为"user"的属性值。
    27. 首先,request.getSession(true)方法用于获取当前请求所对应的Session对象。如果Session对象不存在,则会创建一个新的Session对象并返回。如果传入的参数为false,则表示只会查找已经存在的Session对象,如果不存在,则返回null。
    28. 然后,session.getAttribute("user")方法用于获取当前Session中名称为"user"的属性值。如果该属性不存在,则返回null。注意,Session是一种保存在服务器端的数据对象,在Session中保存的数据在整个会话期间都可以被访问和修改。*/
    29. String json = "";
    30. String id = request.getParameter("item");//
    31. String admin_username = request.getParameter("username");
    32. String admin_passbak = "123456";
    33. String admin_pass = Md5Util.getMD5Str(admin_passbak);
    34. String admin_name = request.getParameter("name");
    35. String admin_sex = request.getParameter("sex");
    36. String admin_role = request.getParameter("role");
    37. String qq = request.getParameter("qq");
    38. Locale loc = new Locale("zh", "CN");
    39. ResourceBundle rb = ResourceBundle.getBundle("messages", loc);
    40. String adminTip = rb.getString("adminTip");
    41. String flag = "";
    42. if (user == null) {
    43. RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/login.jsp");
    44. request.setAttribute("tip", adminTip);
    45. rd.forward(request, response);
    46. } else {
    47. boolean f = false;
    48. if (id != null && !id.equals("") && !id.equals("undefined")) {
    49. if (!admin_username.trim().equals("")) {
    50. flag = as.updateAdmin(id, admin_role, admin_name, admin_sex, qq);
    51. //控制器controller执行了updateAdmin 其中id 可控 可能为唯一键值 ,造成了越权漏洞
    52. if (flag.equals("ok")) {
    53. json = "{\"tip\":\"" + rb.getString("modify") + rb.getString("success") + "\"}";
    54. } else {
    55. json = "{\"tip\":\"" + rb.getString("modify") + rb.getString("failure") + "\"}";
    56. }
    57. } else {
    58. json = "{\"tip\":\"" + rb.getString("name") + rb.getString("not") + rb.getString("empty") + "\"}";
    59. }
    60. } else if (!admin_username.trim().equals("")) {
    61. try {
    62. f = as.geyUser(admin_username);
    63. } catch (SQLException var22) {
    64. var22.printStackTrace();
    65. }
    66. if (f) {
    67. flag = as.saveAdmin(admin_username, admin_pass, admin_passbak, admin_role, admin_name, admin_sex, qq);
    68. if (flag.equals("ok")) {
    69. json = "{\"tip\":\"" + rb.getString("add") + rb.getString("success") + "," + rb.getString("default") + rb.getString("password") + ":123456\"}";
    70. } else {
    71. json = "{\"tip\":\"" + rb.getString("add") + rb.getString("failure") + "\"}";
    72. }
    73. } else {
    74. json = "{\"tip\":\"" + rb.getString("username") + rb.getString("already") + rb.getString("there") + "\"}";
    75. }
    76. } else {
    77. json = "{\"tip\":\"" + rb.getString("name") + rb.getString("not") + rb.getString("empty") + "\"}";
    78. }
    79. out.print(json);
    80. }
    81. }
    82. public void init() throws ServletException {
    83. }
    84. }

    urlPatterns:Servlet映射的URL模式,URL模式/admin/addAdmin,映射到了此Servlet类。

    AdminService 是一个自定义的类controller,它可能是用于处理与管理员相关的业务逻辑或提供相应的服务。通过创建 AdminService 对象,我们可以使用该对象中的方法来执行特定的操作,例如管理管理员账户、处理管理员权限等。

    控制器controller执行了updateAdmin 其中id 可控 可能为唯一键值 ,造成了越权漏洞。

    执行updateAdmin 没有对用户的身份权限信息(管理员)做任何验证处理。只要当前session存在user,即使是普通账户也可以执行updateAdmin,而传入的参数都为我们用户可控,由此引发越权漏洞。

    利用方式
            伪造这个接口的http请求头,将cookie信息设置成我们普通用户的cookie,输入我们想要的请求体(增加新的管理员信息),发送。

    总结
            无论是纵向越权还是横向越权,我们都需要对用户信息做再次的验证,对于一些敏感信息像id这种唯一键值尽量不要存放在前端,............

     

  • 相关阅读:
    Linux常用命令:htop(交互式进程查看器)【后台运行及查看状态命令】【top命令的升级版】
    前端渲染后端返回的HTML格式的数据
    土巴兔上市再折戟,互联网家装没故事
    idea快捷键 | 代码整体左移或右移(PyCharm)
    双十二投影仪推荐 三分钟告诉你怎么挑选到称心如意的投影仪
    记录keras库中导入函数找不到的问题
    实验十五:摇杆传感器实验
    在线渲染3d怎么用?3d快速渲染步骤设置
    华为云14天鸿蒙设备开发-Day7WIFI功能开发
    假期get新技能?低代码模型应用工具HuggingFists
  • 原文地址:https://blog.csdn.net/shelter1234567/article/details/134024394