WEB安全新玩法 [11] 防範批量註冊

網站的攻擊者經過批量註冊用戶,可以實施大規模非法操做,如搶優惠券、惡意刷單等。這給服務商形成了直接的經濟損失,而大量的垃圾用戶也會佔用系統資源,增長系統運行壓力。防範批量註冊須要針對系統特色,多管齊下綜合應對,iFlow 業務安全加固平臺能夠提供各類防範批量註冊的技術實現方式。php


以某電商網站爲例,其用戶註冊功能存在被攻擊者利用的可能。在此將模擬攻擊者批量註冊的行爲,並利用 iFlow 使用多種手段來防範攻擊。html

攻擊示例

攻擊者編寫 RegistTest.py 腳本進行攻擊,腳本使用 WebDriver 驅動瀏覽器模擬正經常使用戶的註冊操做。前端

pic1

攻擊者事先準備好待註冊的用戶/口令文件。腳本執行時循環進行以下操做:逐行讀取用戶/口令文件中的信息→訪問註冊頁面→使用第三方軟件識別驗證碼→將用戶信息註冊提交。web

pic2

腳本運行完畢後,能夠看到大量用戶被註冊,均來自於攻擊者準備的用戶文件。json

pic3

手段一 頻度限制

使用 iFlow 能夠簡便地實如今規定時間內限制同一訪問主體 (IP 或設備) 的用戶註冊次數,也能夠在規定時間內限制網站總體的用戶註冊次數。瀏覽器

代碼實現如下條件:安全

  • 同一設備在 30 分鐘內用戶註冊超過 3 次,則阻止此設備訪問 10 分鐘;
  • 同一 IP 在 60 分鐘內用戶註冊超過 10 次,則阻止此 IP 訪問 20 分鐘;
  • 網站總體在 120 分鐘內用戶註冊超過 100 次,則暫停整個系統註冊操做 30 分鐘。
{
	"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

  • 提交註冊 (reg.html) 以前 120 秒內必須訪問過註冊頁面 (reginfo.html)
  • 訪問註冊頁面 (reginfo.html) 後,必須超過 5 秒才能提交註冊 (reg.html)
[
	{
		"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 在響應中主動插入和運行前端代碼來獲取客戶端的特徵。工具

代碼實現如下條件:

  • 訪問註冊頁面 (reginfo.html) 時,iFlow 在響應報文中加入 js 代碼段,這段代碼判斷客戶端是否爲 WebDriver,並將結果發送到 iFlow 檢查點 (checker.dummy)
  • 訪問 iFlow 檢查點 (checker.dummy) 時,iFlow 得到判斷結果,若是是 WebDriver 則阻止該 IP 的訪問 10 小時。
[
	{
		"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 能夠給流程加入一次性限時令牌。具體到本例中,訪問註冊頁面時用戶得到一個一次性令牌,提交註冊時這個令牌被消費掉,缺乏令牌則不能進行提交註冊。這一手段能夠防範重放攻擊。

pic4

代碼實現如下條件:

  • 訪問註冊頁面 (reginfo.html) 時,iFlow 在響應報文中加入 js 代碼段,在參數中加入一次性令牌;
  • 提交註冊 (reg.html) 時,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 應用的虛擬補丁。(張戈 | 天存信息)

相關文章
相關標籤/搜索