跳转至

Poor Data Validation(失效的数据验证)

题介绍

本题需要在输入框中输入一个负数,并且提交到服务端,才能获得通关密钥

功能实现

在输入框中输入1,点击 提交数字
使用代理 抓到请求包

POST /lessons/4d8d50a458ca5f1f7e2506dd5557ae1f7da21282795d0ed86c55fefe41eb874f

userdata=1

根据web.xml配置,知道服务端对应的代码servlets.module.lesson.PoorValidationLesson,即src/main/java/servlets/module/lesson/PoorValidationLesson.java

web.xml 
<servlet>
        <servlet-name>/lessons/4d8d50a458ca5f1f7e2506dd5557ae1f7da21282795d0ed86c55fefe41eb874f</servlet-name>
        <servlet-class>servlets.module.lesson.PoorValidationLesson</servlet-class>
    </servlet>
对应实现代码:
String userData = request.getParameter("userdata");
log.debug("User Submitted - " + userData);
String htmlOutput = new String();
int userNumber = Integer.parseInt(userData);
if(userNumber < 0)
{ //通关
}

如果传入的变量userdata为负数,则可以通关

但直接在页面输入框输入-1,点击提交按钮 发现返回 "产生一个错误:无效数字: 数字必须大于 0",发现是在前端javascript进行了校验

src/main/webapp/lessons/4d8d50a458ca5f1f7e2506dd5557ae1f7da21282795d0ed86c55fefe41eb874f.jsp line:127~139 进行了客户端校验,如果提交数据小于0,则拒绝提交

counter = counter + 1;
console.log("Counter: " + counter);
var number = $("#numberBox").val();
var theError = "";
if(number.length == 0)
{
    console.log("No Number Submitted");
    theError = "<%= bundle.getString("error.noNumber") %>";     
}
else if (number < 0) 
{
    console.log("Invalid Number Submitted");
    theError = "<%= bundle.getString("error.badNumber") %>";
}

解题步骤

  • 使用代理工具,拦截请求
  • 修改userdata=1 为 userdata=-1
  • 继续发送请求
  • 服务器返回通关密钥

总结

对请求参数进行合法性校验,一定要在服务端进行校验,否则通过代理抓包是可以篡改前端校验

前端校验的收益,仅仅是在异常输入时,减少客户端请求,对安全性没有提高

Back to top