跳转至

Insecure Direct Object References(不安全的直接对象引用)

题介绍

本题显示了一个游客用户的个人资料(年龄、住址、邮箱等), 要求我们获得管理员个人资料的中保存的通关密钥信息

功能实现

  • 点击 刷新个人资料 按钮
    通过代理 抓到请求数据包:
POST /lessons/fdb94122d0f032821019c7edf09dc62ea21e25ca619ed9107bcc50e4a8dbc100

username=guest

后端响应代码在文件
src/main/java/servlets/module/lesson/DirectObjectLesson.java 具体实现比较简单,读取username值,如果是guest则返回guest相关信息,如果是admin则返回通过密钥

String userName = request.getParameter("username");
if(userName.equalsIgnoreCase("guest"))
{
    log.debug("Guest Profile Found");
    htmlOutput = htmlGuest(bundle);
}
else if(userName.equalsIgnoreCase("admin"))
{
    // Get key and add it to the output
    String userKey = Hash.generateUserSolution(levelResult, (String)ses.getAttribute("userName"));
    log.debug("Admin Profile Found");
    htmlOutput = htmlAdmin(bundle, userKey);
}

解题步骤

  • 使用代理工具,拦截请求
  • 修改username=guest为username=admin
  • 继续发送请求
  • 服务器返回通过密钥

总结

完全依赖客户端提交的数据进行操作 ,在日常的系统中比较多 安全开发:需要将核心功能,如权限管理相关功能的记录信息,保存到session中
正常流程

  • 用户登录后,将用户唯一标识如userid或username保存到session中
  • 当查询用户信息时,直接从session中读取
Back to top