PHP安全編程:暴力破解攻擊

頻繁發送猜測的登錄數據
服務器君一共花費了223.921 ms進行了7次數據庫查詢,努力地為您提供了這個頁面。
試試閱讀模式?希望聽取您的建議

暴力攻擊是一種不使用任何特殊手段而去窮盡各種可能性的攻擊方式。它的更正式的叫法是窮舉攻擊——窮舉各種可能性的攻擊。

對于訪問控制,典型的暴力攻擊表現為攻擊者通過大量的嘗試去試圖登錄系統。在多數情況下,用戶名是已知的,而只需要猜測密碼。

盡管暴力攻擊沒有技巧性可言,但詞典攻擊似乎有一定的技巧性。最大的區別是在進行猜測時的智能化。詞典攻擊只會最可能的情況列表中進行窮舉,而不像暴力攻擊一樣去窮舉所有的可能情況。

防止進行驗證嘗試或限制允許錯誤的次數還算是一個比較有效的安全手段,但是這樣做的兩難之處在于如何在不影響合法用戶使用的情況下識別與阻止攻擊者。

在這種情況下,對一致性的判定可以幫助你區分二者。這個方法與前面所述的防止會話劫持的做法很相似,但區別是你要確定的是一個攻擊者而不是一個合法用戶。

考慮下面的HTML表單:

<form action="http://example.org/login.php" method="POST">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>
<p><input type="submit" /></p>
</form>

攻擊者會察看這個表單并建立一段腳本來POST合法的數據給http://example.org/login.php:

<?php

$username = 'victim';
$password = 'guess';

$content = "username=$username&password=$password";
$content_length = strlen($content);

$http_request = '';
$http_response = '';

$http_request .= "POST /login.php HTTP/1.1\r\n";
$http_request .= "Host: example.org\r\n";
$http_request .= "Content-Type: application/x-www-form-urlencoded\r\n";
$http_request .= "Content-Length: $content_length\r\n";
$http_request .= "Connection: close\r\n";
$http_request .= "\r\n";
$http_request .= $content;

if ($handle = fsockopen('example.org', 80))
{
fputs($handle, $http_request);

while (!feof($handle))
{
  $http_response .= fgets($handle, 1024);
}

fclose($handle);

/* Check Response */
}
else
{
/* Error */
}
 
?>

使這段腳本,攻擊者還可以簡單地加入一個循環來繼續嘗試不同的密碼,并在每次嘗試后檢查$http_response變量。一旦$http_response變量有變化,就可以認為猜測到了正確的密碼。

你可以通過很多安全措施去防止此類攻擊。我們注意到,在暴力攻擊中每次的HTTP請求除了密碼是不同的,其他部分完全相同,這一點是很有價值的。

盡管在超過一定數量的失敗嘗試后臨時凍結帳號是一種有效的防范手段,但你可能會去考慮采用更確定的方式去凍結帳號,以使攻擊者更少地影響合法用戶對你的應用的正常使用。

還有一些流程也可以增大暴力攻擊的難度,使它不太可能成功。一個簡單的遏制機制就能有效地做到這一點:

<?php

/* mysql_connect() */
/* mysql_select_db() */

$clean = array();
$mysql = array();

$now = time();
$max = $now - 15;

$salt = 'SHIFLETT';

if (ctype_alnum($_POST['username']))
{
$clean['username'] = $_POST['username'];
}
else
{
/* ... */
}
$clean['password'] = md5($salt . md5($_POST['password'] . $salt));
$mysql['username'] = mysql_real_escape_string($clean['username']);

$sql = "SELECT last_failure, password
	  FROM   users
	  WHERE  username = '{$mysql['username']}'";

if ($result = mysql_query($sql))
{
if (mysql_num_rows($result))
{
  $record = mysql_fetch_assoc($result);

  if ($record['last_failure']> $max)
  {
	/* Less than 15 seconds since last failure */
  }
  elseif ($record['password'] == $clean['password'])
  {
	/* Successful Login */
  }
  else
  {
	/* Failed Login */

	$sql = "UPDATE users
			SET    last_failure = '$now'
			WHERE  username = '{$mysql['username']}'";

	mysql_query($sql);
  }
}
else
{
  /* Invalid Username */
}
}
else
{
/* Error */
}

?>

上例會限制在上次驗證失敗后對同一用戶再試嘗試的頻率。如果在一次嘗試失敗后的15秒內再次嘗試,不管密碼是否正確,驗證都會失敗。這就是這個方案的關鍵點。但簡單地在一次失敗嘗試后15秒內阻止訪問還是不夠的——在此時不管輸入是什么,輸出也會是一致的,只有在登錄成功后才會不同。否則,攻擊者只要簡單地檢查不一致的輸出即可確定登錄是否成功。

延伸閱讀

此文章所在專題列表如下:

  1. PHP安全編程:register_globals的安全性
  2. PHP安全編程:不要讓不相關的人看到報錯信息
  3. PHP安全編程:網站安全設計的一些原則
  4. PHP安全編程:可用性與數據跟蹤
  5. PHP安全編程:過濾用戶輸入
  6. PHP安全編程:對輸出要進行轉義
  7. PHP安全編程:表單與數據安全
  8. PHP安全編程:從URL的語義進行攻擊
  9. PHP安全編程:文件上傳攻擊的防御
  10. PHP安全編程:跨站腳本攻擊的防御
  11. PHP安全編程:跨站請求偽造CSRF的防御
  12. PHP安全編程:關于表單欺騙提交
  13. PHP安全編程:HTTP請求欺騙
  14. PHP安全編程:不要暴露數據庫訪問權限
  15. PHP安全編程:防止SQL注入
  16. PHP安全編程:cookie暴露導致session被劫持
  17. PHP安全編程:session固定獲取合法會話
  18. PHP安全編程:session劫持的防御
  19. PHP安全編程:防止源代碼的暴露
  20. PHP安全編程:留心后門URL
  21. PHP安全編程:阻止文件名被操縱
  22. PHP安全編程:文件包含的代碼注入攻擊
  23. PHP安全編程:文件目錄猜測漏洞
  24. PHP安全編程:打開遠程文件的風險
  25. PHP安全編程:shell命令注入
  26. PHP安全編程:暴力破解攻擊
  27. PHP安全編程:密碼嗅探與重播攻擊
  28. PHP安全編程:記住登錄狀態的安全做法
  29. PHP安全編程:共享主機的源碼安全
  30. PHP安全編程:更優的會話數據安全
  31. PHP安全編程:會話數據注入
  32. PHP安全編程:主機文件目錄瀏覽
  33. PHP安全編程:PHP的安全模式

本文地址:http://www.snpmgr.live/librarys/veda/detail/2074,歡迎訪問原出處。

不打個分嗎?

轉載隨意,但請帶上本文地址:

http://www.snpmgr.live/librarys/veda/detail/2074

如果你認為這篇文章值得更多人閱讀,歡迎使用下面的分享功能。
小提示:您可以按快捷鍵 Ctrl + D,或點此 加入收藏。

大家都在看

閱讀一百本計算機著作吧,少年

很多人覺得自己技術進步很慢,學習效率低,我覺得一個重要原因是看的書少了。多少是多呢?起碼得看3、4、5、6米吧。給個具體的數量,那就100本書吧。很多人知識結構不好而且不系統,因為在特定領域有一個足夠量的知識量+足夠良好的知識結構,系統化以后就足以應對大量未曾遇到過的問題。

奉勸自學者:構建特定領域的知識結構體系的路徑中再也沒有比學習該專業的專業課程更好的了。如果我的知識結構體系足以囊括面試官的大部分甚至吞并他的知識結構體系的話,讀到他言語中的一個詞我們就已經知道他要表達什么,我們可以讓他坐“上位”畢竟他是面試官,但是在知識結構體系以及心理上我們就居高臨下。

所以,閱讀一百本計算機著作吧,少年!

《軟件隨想錄:程序員部落酋長Joel談軟件》 Joel Spolsky (作者), 阮一峰 (譯者)

《軟件隨想錄:程序員部落酋長Joel談軟件》是一部關于軟件技術、人才、創業和企業管理的隨想文集,作者以詼諧幽默的筆觸將自己在軟件行業的親身感悟娓娓道來,觀點新穎獨特,內容簡潔實用。全書分為 36講,每一講都是一個獨立的專題?!盾浖S想錄:程序員部落酋長Joel談軟件》從不同側面滿足了軟件開發人員、設計人員、管理人員及從事軟件相關工作的人員的學習與工作需要。

更多計算機寶庫...

燃烧吧足球登陆 北京十一选五 pk10 北单比分计算器 基金配资价格 14场足球比分直播 南京股指期货配资 股票行情走势图 北京十一选五 广西快乐十分 奥迅球探网足球指数 广西快乐双彩 私募基金配资是什么意思 乌鲁木齐股指期货配资 理财平台最新排名 河北20选5 26选5