網站的攻擊者經過批量註冊用戶,可以實施大規模非法操做,如搶優惠券、惡意刷單等。這給服務商形成了直接的經濟損失,而大量的垃圾用戶也會佔用系統資源,增長系統運行壓力。防範批量註冊須要針對系統特色,多管齊下綜合應對,iFlow 業務安全加固平臺能夠提供各類防範批量註冊的技術實現方式。php
以某電商網站爲例,其用戶註冊功能存在被攻擊者利用的可能。在此將模擬攻擊者批量註冊的行爲,並利用 iFlow 使用多種手段來防範攻擊。html
攻擊者編寫 RegistTest.py 腳本進行攻擊,腳本使用 WebDriver 驅動瀏覽器模擬正經常使用戶的註冊操做。前端
攻擊者事先準備好待註冊的用戶/口令文件。腳本執行時循環進行以下操做:逐行讀取用戶/口令文件中的信息→訪問註冊頁面→使用第三方軟件識別驗證碼→將用戶信息註冊提交。web
腳本運行完畢後,能夠看到大量用戶被註冊,均來自於攻擊者準備的用戶文件。json
使用 iFlow 能夠簡便地實如今規定時間內限制同一訪問主體 (IP 或設備) 的用戶註冊次數,也能夠在規定時間內限制網站總體的用戶註冊次數。瀏覽器
代碼實現如下條件:安全
{ "if": [ "REQUEST_FILENAME == '/shop/index.php'", "@ARGS.s == '/index/user/reg.html'" ], "then": [ "DEVICE.reg_num@1800=DEVICE.reg_num+1", "REAL_IP.reg_num@3600=REAL_IP.reg_num+1", "GLOBAL.reg_num@7200=GLOBAL.reg_num+1", { "if": "DEVICE.reg_num>3", "then": [ "DEVICE.reg_num=null", "block('DEVICE',10*60,'deny')" ] }, { "if": "REAL_IP.reg_num>10", "then": [ "REAL_IP.reg_num=null", "block('REAL_IP',20*60,'deny')" ] }, { "if": "GLOBAL.reg_num>100", "then": [ "GLOBAL.reg_num=null", "GLOBAL.reg_blocking@1800=true" ] }, { "if": "GLOBAL.reg_blocking", "then": "verdict('deny')" } ] }
正經常使用戶填寫註冊信息是須要花費一段時間的,而自動化攻擊獲取註冊頁面和提交註冊信息的時間每每很短。使用 iFlow 能夠有效判斷這種差別,進而區分正經常使用戶和自動化腳本。服務器
代碼實現如下條件:dom
[ { "if": [ "REQUEST_FILENAME == '/shop/index.php'", "@ARGS.s == '/index/user/reginfo.html'" ], "then": [ "SESSION.had_access_reginfo_page_flag@120=1", "SESSION.time_between_reginfo_and_reg@5=1" ] }, { "if": [ "REQUEST_FILENAME == '/shop/index.php'", "@ARGS.s == '/index/user/reg.html'" ], "then": { "if": "!SESSION.had_access_reginfo_page_flag", "then": { "action": "deny", "log": "reginfo.html must access firstly!" }, "else": { "if": "!SESSION.time_between_reginfo_and_reg", "then": "SESSION.had_access_reginfo_page_flag=null", "else": { "action": "deny", "log": "The time between reginfo.html and reg.html is too short!" } } } } ]
正經常使用戶使用瀏覽器訪問網站,攻擊者則使用工具模擬瀏覽器或驅動瀏覽器引擎來訪問網站。咱們使用 iFlow 在響應中主動插入和運行前端代碼來獲取客戶端的特徵。工具
代碼實現如下條件:
[ { "if": [ "REQUEST_FILENAME == '/shop/index.php'", "@ARGS.s == '/index/user/reginfo.html'" ], "then": { "directive": "alterResponseBody", "op": "string", "target": "var __user_id__ = 0;", "substitute": "var __user_id__ = 0; var httpRequest = new XMLHttpRequest(); httpRequest.open('GET', '/iflow/checker.dummy?ret='+window.navigator.webdriver); httpRequest.send(); " } }, { "if": [ "REQUEST_FILENAME == '/iflow/checker.dummy'", "@ARGS.ret != 'false'" ], "then": [ "verdict('deny', 'Client is webdriver!')", "block('REAL_IP', 3600*10, 'deny', REAL_IP.__id..' in blocking')" ] } ]
利用 iFlow 能夠給流程加入一次性限時令牌。具體到本例中,訪問註冊頁面時用戶得到一個一次性令牌,提交註冊時這個令牌被消費掉,缺乏令牌則不能進行提交註冊。這一手段能夠防範重放攻擊。
代碼實現如下條件:
[ { "if": [ "REQUEST_FILENAME == '/shop/index.php'", "@ARGS.s == '/index/user/reginfo.html'" ], "then": [ "TX.tmp_ulh=md5(random())", "SESSION.reginfo_ulh@300=SESSION.reginfo_ulh..','.. TX.tmp_ulh", { "directive": "alterResponseBody", "op": "string", "target": "/index/user/reg.html", "substitute": "/index/user/reg.html&ulh=${TX.tmp_ulh}" } ] }, { "if": [ "REQUEST_METHOD == 'POST'", "REQUEST_FILENAME == '/shopxo-1.6.0/index.php'", "@ARGS.s == '/index/user/reg.html'" ], "then": { "if": "notNull(SESSION.reginfo_ulh)", "then": [ "SESSION.reginfo_ulh = null", { "if": "!contain(SESSION.reginfo_ulh, @ARGS.ulh)", "then": { "action": "deny", "log": "${SESSION.reginfo_ulh} not contain ${@ARGS.ulh}!" }, "else": { "directive": "alterArgGet", "op": "unset", "name": "ulh" } } ], "else": { "action": "deny", "log": "${SESSION.reginfo_ulh} is not exist!" } } } ]
針對目標電商網站的批量註冊漏洞,咱們使用了頻度限制、頁面關聯、客戶端識別、一次性令牌這四種手段進行防禦。事實上,使用 iFlow 還能夠寫出其餘防禦手段,如參數聚合、動態混淆等。經過上述手段,使用者可以很大程度緩解攻擊者的批量註冊行爲。
咱們在上述例子中看到:在 Web 服務器前部署 iFlow 業務安全加固平臺,它有能力攔截、計算和修改雙向 HTTP 報文並具有存儲能力,能夠成爲 Web 應用的虛擬補丁。(張戈 | 天存信息)