撞庫掃號攻擊已經是Top 10 Security Risks for 2014之一,不管你的網站密碼保存的額多好,但是面試已經泄露的賬號密碼,撞庫掃號防御還是一個相當重要的環節。之前一篇普及了掃號的基本防止防范和危害。
本篇講詳細解決面對技術同步在進步的黑色產品如何更好地防止撞庫掃號。由于涉及相關內部策略,也只是拋磚引玉。
撞庫掃號,無非是自動化或者腳本化執行用戶名密碼來進行登陸,通過頁面跳轉302狀態或者返回特征及包的大小,是否重新set-cookies來判斷是否登陸成功。 那么可以通過哪些方式來緩解惡意用戶的批量行為?
一般,傳統企業會在登陸頁面直接增加驗證碼,不過由于自動化驗證碼識別腳本早已出現,簡單的驗證碼識別已經不是什么問題。這種方式很難作為防止有針對性的惡意攻擊。
其次,一些考慮用戶體驗的企業會在用戶賬戶或者密碼輸入錯誤幾次后,跳出一個比較難腳本識別的驗證碼(當然用戶也不太好識別),由于維度較少,也比較容易繞過。
那么我們就需要更多的維度去做策略,來提高攻擊者的成本防止惡意撞庫掃號行為。
我們可以捕獲識別用戶的唯一參數來控制。
基本要求為:難偽造,易獲取,保留時間較長等。
當前帆布指紋識別炙手可熱,同一機器,相同瀏覽器Canvas都是一樣的,甚至是重裝。詳見http://security.tencent.com/index.php/blog/msg/59,具體是用就看各自需求。
相關測試代碼:
#!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的來進行溝通顯然是最好的選擇,因為在這兩種語言之間,除了語法上相近,從溝通上也有著完美的實現。下面我們來看看實現流程(如圖所示):
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獲取參數提交,則判斷請求是否含有該參數,比如是否有鼠標位置移動,鍵盤輸入,輸入等待等,給予合理的安全策略。
上面所說的策略也只是拋磚引玉,具體的還是要根據當前自己的日志從實際出發,慢慢進行策略調優,達到一個可接受點。
掃號風險會一直持續,之前剛剛公布某國外黑客有用12億人登陸密碼。互聯網賬戶安全事件頻發,更讓我們應該關注到掃號撞庫這個本非屬于漏洞的漏洞。