利用身份驗證漏洞的常見攻擊

當(dāng)黑客發(fā)現(xiàn)網(wǎng)站身份驗證系統(tǒng)中存在漏洞時,他們會嘗試?yán)迷撀┒床@取敏感數(shù)據(jù)。但是,黑客在利用漏洞時究竟會做什么呢?以下是黑客利用被破壞的身份驗證漏洞的三種不同類型的攻擊。 

1. 暴力攻擊和字典攻擊

暴力攻擊是最簡單的攻擊類型。這是一種反復(fù)試驗的方法,黑客會嘗試猜測目標(biāo)用戶的憑據(jù)。攻擊者可以使用多種技術(shù)來實現(xiàn)這一點(diǎn)。 

另一方面,字典攻擊是最常用的方法,它只是一種使用單詞表來猜測用戶密碼的反復(fù)試驗的方法。 

2. 密碼噴灑

密碼噴灑是最常見的攻擊方法之一。它通常與機(jī)器人一起使用。這種攻擊涉及反復(fù)嘗試使用用戶名和密碼組合登錄服務(wù)器或網(wǎng)站。 

密碼噴灑比暴力攻擊的優(yōu)勢在于它通常能夠成功。這是因為它利用了許多用戶使用的通用密碼。  

3. 響應(yīng)操控

響應(yīng)操縱利用了服務(wù)器(或任何其他主機(jī))與客戶端之間的通信通道中的漏洞。當(dāng)應(yīng)用程序依賴服務(wù)器的成功響應(yīng)(僅布爾值)來驗證用戶時,就會發(fā)生這種情況。此外,攻擊者可以使用代理和繞過身份驗證輕松操縱傳入的響應(yīng)。 

現(xiàn)在我們已經(jīng)對破壞身份驗證漏洞有了總體了解,接下來讓我們了解一下特定于 Java 的漏洞。 

理解 Java 中失效的身份驗證

在本節(jié)中,我們將研究三個不同的代碼片段(Java Spring Boot),了解破壞的身份驗證漏洞以及如何預(yù)防它們。 

讓我們開始吧。 

代碼片段 #1

@RequestMapping("/register")
public void Register(@RequestBody UserInfo user){
try{
database.openConnection();
database.saveUser(User.email, user.password);
}
catch(Exception ex){
throw ex;
}
finally{
database.closeConnection();
}
}

在上面的代碼片段中,我們有一個 /register 端點(diǎn),它從請求主體接收電子郵件地址和密碼。此代碼片段中的安全風(fēng)險是: 

  1. 弱密碼策略——沒有檢查密碼的長度,甚至沒有檢查密碼是否足夠強(qiáng)。
  2. 敏感數(shù)據(jù)的明文存儲——密碼直接存儲在數(shù)據(jù)庫中,無需對密碼進(jìn)行散列加鹽處理。

為了防止上述問題,我們建議您使用輔助函數(shù)來檢查密碼是否強(qiáng),并在將密碼存儲在數(shù)據(jù)庫之前對其進(jìn)行加鹽。 

@RequestMapping("/register")
public void Register(@RequestBody UserInfo user){
try{
database.openConnection();
if(isPasswordStrong(password))
password = saltPassword(password);
database.saveUser(User.email, user.password);
}
catch(Exception ex){
throw ex;
}
finally{
database.closeConnection();
}
}

代碼片段 #2

@RequestMapping("/changePassword")
protectedvoidchangePassword(
@RequestParam("currentPassword") String currentPassword,
@RequestParam("newPassword") String newPassword,
HttpServletResponse response) throws Exception
{
PrintWriter writer = response.getWriter();
try
{
handler.handleChangePassword(currentPassword, newPassword);
}
catch (Exception ex)
{
writer.println( ex.getMessage() );
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return;
}
writer.println(HttpServletResponse.SC_OK);
}

在上面的代碼中,我們有一個 /changePassword 路由,該路由以 currentPassword 和 newPassword 作為輸入,并通過在DB中更新來更改用戶密碼。此代碼存在不適當(dāng)?shù)臅捁芾砺┒矗瑢?dǎo)致用戶更改密碼后會話不會過期。?

為了防止出現(xiàn)此問題,應(yīng)用程序應(yīng)從所有其他活動會話中注銷用戶。 

@RequestMapping("/changePassword")
protectedvoidchangePassword(
@RequestParam("currentPassword") String currentPassword,
@RequestParam("newPassword") String newPassword,
HttpServletRequest request,
HttpServletResponse response) throws Exception
{
PrintWriter writer = response.getWriter();
try
{
handler.handleChangePassword(currentPassword, newPassword);

HttpSession session = request.getSession(false);
if(session != null)
session.invalidate();
}
catch (Exception ex)
{
writer.println( ex.getMessage() );
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return;
}
writer.println(HttpServletResponse.SC_OK);
}

代碼片段 #3

@Controller
public class AdminController {

@RequestMapping(value = "/admin/user/data", method = RequestMethod.GET)
@ResponseBody
public List<String> getUserDetails(Authentication authentication) {
if(authentication.isAuthenticated()){
return userDao.getDetailsFromDb();
}
}
}

在上面的代碼中,我們有一個管理員路由 /admin/user/data,負(fù)責(zé)檢索用戶的所有數(shù)據(jù)。此代碼中的安全風(fēng)險涉及缺少 API 身份驗證來檢查用戶的真實性并驗證經(jīng)過身份驗證的用戶是否是管理員。 

為了防止上述問題,我們建議您添加身份驗證檢查和適當(dāng)?shù)氖跈?quán)檢查(如果用戶是管理員),以避免數(shù)據(jù)泄露。 

@Controller
public class AdminController {
@RequestMapping(value = "/admin/user/data", method = RequestMethod.GET)
@ResponseBody
public List<String> getUserDetails(Authentication authentication) {
if (authentication instanceof AdminAuthenticationToken){
return userDao.getDetailsFromDb();
}
}
}

現(xiàn)在我們已經(jīng)徹底了解了該漏洞,讓我們來看看一些常見的最佳做法來避免此類風(fēng)險。 

避免身份驗證漏洞的最佳實踐

破壞的身份驗證漏洞對于所有應(yīng)用程序(包括移動應(yīng)用程序、Web 應(yīng)用程序和 iOS 應(yīng)用程序)來說都是一個巨大的問題。

此外,帳戶接管攻擊是造成 Web 應(yīng)用程序損害的主要原因,并且通常涉及破壞身份驗證漏洞。 

以下是一些最佳實踐,可幫助您避免應(yīng)用程序中的身份驗證漏洞。 

  1. 執(zhí)行嚴(yán)格的密碼策略。最重要的是,創(chuàng)建更長更強(qiáng)的密碼是避免身份驗證漏洞的第一步。要執(zhí)行嚴(yán)格的密碼策略,您需要使用LDAPActive Directory來管理您的身份驗證憑據(jù),或者使用密碼管理工具,如LastPassDashLane1Password
  2. 要求多因素身份驗證多因素身份驗證是防止未經(jīng)授權(quán)訪問系統(tǒng)的一種非常有效的方法。對于訪問敏感數(shù)據(jù)的系統(tǒng),強(qiáng)烈建議使用此方法與用戶名/密碼對結(jié)合使用。
  3. 使用速率限制。避免身份驗證攻擊的最佳方法之一是對所有經(jīng)過身份驗證的相關(guān)端點(diǎn)(如登錄)使用速率限制,這可以防止暴力攻擊。現(xiàn)代應(yīng)用程序使用兩種不同的方式來實現(xiàn)速率限制。首先,它們可以在用戶嘗試使用錯誤密碼登錄多次后阻止其帳戶(稱為帳戶鎖定)。其次,它們可以使用CAPTCHA圖像質(zhì)詢阻止攻擊。雖然這些 CAPTCHA 質(zhì)詢在過去很煩人且難以破譯,但如今,隨著計算機(jī)視覺、OCR 等技術(shù)的進(jìn)步,這種方法變得不那么有效了。

結(jié)論

身份驗證漏洞是系統(tǒng)安全的主要威脅。例如,它可能導(dǎo)致機(jī)密信息丟失、聲譽(yù)受損和財務(wù)損失。此外,這種漏洞的嚴(yán)重性通常非常高,因為未經(jīng)授權(quán)的用戶可以訪問系統(tǒng)及其資源。因此,這可能導(dǎo)致組織的數(shù)據(jù)和敏感信息被盜。 

在這篇文章中,我們深入討論了身份驗證漏洞,并了解了黑客如何利用它。此外,我們還了解了一些可以采取的預(yù)防措施,以保護(hù)您的應(yīng)用程序免受此類攻擊。  

文章來源:Java Broken Authentication Guide:Examples and Prevention

上一篇:

前端技術(shù)選型:Ember.js和React.js的優(yōu)缺點(diǎn)及最佳實踐

下一篇:

Spring 過度數(shù)據(jù)暴露:示例與預(yù)防
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費(fèi)

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費(fèi)