撞庫掃號防範

wyzsk發表於2020-08-19
作者: 小胖胖要減肥 · 2014/08/16 18:58

0x00 背景


撞庫掃號攻擊已經是Top 10 Security Risks for 2014之一,不管你的網站密碼儲存的額多好,但是面試已經洩露的賬號密碼,撞庫掃號防禦還是一個相當重要的環節。之前一篇普及了掃號的基本防止防範和危害。

本篇講詳細解決面對技術同步在進步的黑色產品如何更好地防止撞庫掃號。由於涉及相關內部策略,也只是拋磚引玉。

撞庫掃號,無非是自動化或者指令碼化執行使用者名稱密碼來進行登陸,透過頁面跳轉302狀態或者返回特徵及包的大小,是否重新set-cookies來判斷是否登陸成功。 那麼可以透過哪些方式來緩解惡意使用者的批次行為?

0x01 細節


一般,傳統企業會在登陸頁面直接增加驗證碼,不過由於自動化驗證碼識別指令碼早已出現,簡單的驗證碼識別已經不是什麼問題。這種方式很難作為防止有針對性的惡意攻擊。

其次,一些考慮使用者體驗的企業會在使用者賬戶或者密碼輸入錯誤幾次後,跳出一個比較難指令碼識別的驗證碼(當然使用者也不太好識別),由於維度較少,也比較容易繞過。

那麼我們就需要更多的維度去做策略,來提高攻擊者的成本防止惡意撞庫掃號行為。

我們可以捕獲識別使用者的唯一引數來控制。

基本要求為:難偽造,易獲取,保留時間較長等。

當前帆布指紋識別炙手可熱,同一機器,相同瀏覽器Canvas都是一樣的,甚至是重灌。詳見http://security.tencent.com/index.php/blog/msg/59,具體是用就看各自需求。

enter image description here

相關測試程式碼:

#!html
<html>
<head>
<script type="text/javascript">
function bin2hex(s) {
  //  discuss at: http://phpjs.org/functions/bin2hex/
  // original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // bugfixed by: Onno Marsman
  // bugfixed by: Linuxworld
  // improved by: ntoniazzi (http://phpjs.org/functions/bin2hex:361#comment_177616)
  //   example 1: bin2hex('Kev');
  //   returns 1: '4b6576'
  //   example 2: bin2hex(String.fromCharCode(0x00));
  //   returns 2: '00'

  var i, l, o = '',
    n;

  s += '';

  for (i = 0, l = s.length; i < l; i++) {
    n = s.charCodeAt(i)
      .toString(16);
    o += n.length < 2 ? '0' + n : n;
  }

  return o;
}

var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
var txt = 'http://security.tencent.com/';
ctx.textBaseline = "top";
ctx.font = "14px 'Arial'";
ctx.textBaseline = "tencent";
ctx.fillStyle = "#f60";
ctx.fillRect(125,1,62,20);
ctx.fillStyle = "#069";
ctx.fillText(txt, 2, 15);
ctx.fillStyle = "rgba(102, 204, 0, 0.7)";
ctx.fillText(txt, 4, 17);
var b64 = canvas.toDataURL().replace("data:image/png;base64,","");
var bin = atob(b64);
var crc = bin2hex(bin.slice(-16,-12));
console.log(crc);
document.write(crc)
</script>

</head>
<body>
</body>

Flash cookies是很多防止撞庫掃號經常是用的一個方式,但有一個缺點,safari不支援flash。不過可以作為一個重要的維度之一。

Cookies的話不用多說,最多是用的一個方式,且有多種玩法,如是否含有cookies,對cookies的某個值進行驗證等。

(1) Flash Cookies和Cookies有什麼區別?

1、儲存大小不同 cookies僅允許儲存4KB,而flash cookies則儲存100KB—這只是預設的,還可以調整大小。
2、儲存時長不同 一般來說,cookies是有消亡期的,它會在一段時間後自動消失;而flash cookies並不,如果你沒有刪除它,它就永遠保留在你的電腦上。
3、儲存位置不同 普通cookies的位置人們並不需要知道,因為他們可以透過許多軟體進行刪除,甚至瀏覽器本身都內建了這一功能。而flash cookies則是儲存在C:\Documents and Settings\使用者名稱\Application Data\Macromedia\Flash Player資料夾下。其中#sharedobjects資料夾用於儲存flash cookies,macromedia.com儲存flash cookies的全域性設定。

(2) 要實現Flash Cookie永遠儲存的功能,顯然,首先要實現Flash Cookie與Http Cookie的互通,所以,在技術上使用JavaScript與ActionScript的來進行溝通顯然是最好的選擇,因為在這兩種語言之間,除了語法上相近,從溝通上也有著完美的實現。下面我們來看看實現流程(如圖所示):

enter image description here

ActionScript實現實現參考:http://www.biaodianfu.com/flash-cookies.html

最後還有一些js獲取使用者相關資料的方法,如使用者行為軌跡,使用者點選事件等來判斷人機行為。

這塊可以根據不同需要使用js相關keydown,keyup,mousedown,mouseup等事件記錄即可。

當然,有了那麼多維度引數的同時還有一個引數不可忘記,就是ip,雖然對於現在的使用者,這個限制已經是亡羊補牢,但是運用的好也會有出奇的效果。

下面我就對撞庫掃號規則的制定稍微涉及下,具體還需要大家以自己的實際業務,透過資料分析,去制定符合自己業務的策略。

不過我們要了解攻防是2個不斷持續,不斷改進的過程,策略也是要應勢而變,不斷最佳化。

1 針對使用者輸入密碼錯誤,輸入賬號不存在制定相關策略,以不同層級出現不同等級驗證碼,和進行相應阻斷。
2 針對同一個ip的請求數和時間維度,,以不同層級出現不同等級驗證碼,和進行相應阻斷。
3 如使用帆布指紋識,則判斷請求是否提交該引數,如沒有考慮相應不同安全措施。(此項在未成熟應用情況下只是維度之一)
4 使用flash cookies,則判斷請求提交是否含有該引數,並且統計單一flash cookies請求量給予合理的安全策略。
5 使用cookies,則判斷請求是否含有cookies,或者cookies某個值,並統計單一cookies或cookies某值請求量,給予合理的安全策略。
6 使用js獲取引數提交,則判斷請求是否含有該引數,比如是否有滑鼠位置移動,鍵盤輸入,輸入等待等,給予合理的安全策略。

0x02 總結


上面所說的策略也只是拋磚引玉,具體的還是要根據當前自己的日誌從實際出發,慢慢進行策略調優,達到一個可接受點。

掃號風險會一直持續,之前剛剛公佈某國外駭客有用12億人登陸密碼。網際網路賬戶安全事件頻發,更讓我們應該關注到掃號撞庫這個本非屬於漏洞的漏洞。

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章