邏輯錯誤漏洞是指由於程序邏輯不嚴或邏輯太復雜,導致一些邏輯分支不能夠正常處理或處理錯誤,一般出現在任意密碼修改(沒有舊密碼驗證)、越權訪問、密碼找回、交易支付金額。
一般挖掘邏輯漏洞有兩個重點:業務流程和HTTP/HTTPS請求篡改。
繞過授權驗證:
- 水平越權:就是相同級別(權限)的用戶或者同一角色不同的用戶之間,可以越權訪問、修改或者刪除的非法操作。如果出現次漏洞,那么將可能會造成大批量數據泄露,嚴重的甚至會造成用戶信息被惡意篡改。
public String execute(){
int id = Interger.parseInt(request.getParameter("userId"));
String password = request.getParameter("password");
String password2 = request.getParameter("password2");
if (!("".equals(password) || ("".equals(password2))){
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的用戶權限。
在修改密碼這樣的問題,一樣加上舊密碼與修改密碼來防范。
垂直越權:垂直越權是不同級別之間或不同角色之間的越權;垂直越權又別分為向上越權與向下越權。比如,某些網站,像發布文章、刪除文章等操作屬於管理員該做的事情。假設一個匿名用戶也可以做相同的事情,這就叫做向上越權;向下越權是一個高級用戶可以訪問低級用戶信息(這也是不行的,這回暴漏用戶的隱私)。
解決向上越權是比較容易處理的事情,如果管理員表與普通用戶是同一張數據庫表,就必須要存在權限驗證字段,權限驗證字段用來區分是否為管理員。
如果不在同一張表,在過濾器中直接取出管理員信息即可。