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

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

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

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

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

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

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

考慮下面的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本書吧。很多人知識結構不好而且不系統,因為在特定領域有一個足夠量的知識量+足夠良好的知識結構,系統化以后就足以應對大量未曾遇到過的問題。

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

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

《浪潮之巔》 吳軍 (作者)

近一百多年來,總有一些公司很幸運地、有意識或無意識地站在技術革命的浪尖之上。在長達十年甚至幾十年的時間里,它們代表著科技的浪潮,直到下一波浪潮的來臨。從19世紀末算起,AT&T公司、IBM公司、蘋果公司、英特爾公司、微軟公司、思科公司、雅虎公司和Google公司都先后被幸運地推到了浪尖。雖然,它們來自不同的領域,中間有些已經衰落或正在衰落,但是它們都極度輝煌過。吳軍的這本《浪潮之巔》系統地介紹了這些公司成功的本質原因及科技工業一百多年的發展。在這些公司興衰的背后,有著它必然的規律。《浪潮之巔》不僅講述科技工業的歷史,更重在揭示它的規律性。

更多計算機寶庫...

燃烧吧足球登陆