逻辑错误漏洞是指因为程序逻辑不严或逻辑太复杂,致使一些逻辑分支不可以正常处理或处理错误,通常出如今任意密码修改(没有旧密码验证)、越权访问、密码找回、交易支付金额。数据库
通常挖掘逻辑漏洞有两个重点:业务流程和HTTP/HTTPS请求篡改。网站
绕过受权验证:spa
public String execute(){对象
int id = Interger.parseInt(request.getParameter("userId"));get
String password = request.getParameter("password");date
String password2 = request.getParameter("password2");权限
if (!("".equals(password) || ("".equals(password2))){request
return ERROR;请求
}程序
if (!password.equals(password2)){
return ERROR;
}
User u = new UserBiz().findUserById(id);
u.setPassword(password);
boolean flag = new UserBiz().saveOrUpdate(u); // 更新对象
if (flag){
return SUCCESS;
}
else{
return ERROR;
}
}
经过上面代码分析,没有任何错误,可是在逻辑上却存在严重的漏洞,假设有两个用户,一个用户名Admin,UserId是1,另外一个用户名是Guest,UserId为2,Guest进行密码修改时,拦截HTTP请求,而后将UserId修改成1,若是存在水平越权操做,那么Admin的密码就会被修改成Guest修改的密码。这样就能够获取Admin的用户权限。
在修改密码这样的问题,同样加上旧密码与修改密码来防范。
垂直越权:垂直越权是不一样级别之间或不一样角色之间的越权;垂直越权又别分为向上越权与向下越权。好比,某些网站,像发布文章、删除文章等操做属于管理员该作的事情。假设一个匿名用户也能够作相同的事情,这就叫作向上越权;向下越权是一个高级用户能够访问低级用户信息(这也是不行的,这回暴漏用户的隐私)。
解决向上越权是比较容易处理的事情,若是管理员表与普通用户是同一张数据库表,就必需要存在权限验证字段,权限验证字段用来区分是否为管理员。
若是不在同一张表,在过滤器中直接取出管理员信息便可。