犀渠玉剑良家子,白马金羁侠少年。这篇文章主要讲述WEB安全新玩法 [11] 防范批量注册相关的知识,希望能为你提供帮助。
网站的恶意访问者通过批量注册用户,能够实施大规模非法操作,如抢优惠券、恶意刷单等。这给服务商造成了直接的经济损失,而大量的垃圾用户也会占用系统资源,增加系统运行压力。防范批量注册需要针对系统特点,多管齐下综合应对,iFlow 业务安全加固平台可以提供各种防范批量注册的技术实现方式。
以某电商网站为例,其用户注册功能存在被恶意利用的可能。在此将模拟恶意批量注册的行为,并利用 iFlow 使用多种手段来防范这类行为。
恶意操作行为示例批量注册者编写 RegistTest.py 脚本进行操作,脚本使用 WebDriver 驱动浏览器模拟正常用户的注册操作。
文章图片
【WEB安全新玩法 [11] 防范批量注册】恶意访问者事先准备好待注册的用户/口令文件。脚本执行时循环进行如下操作:逐行读取用户/口令文件中的信息→访问注册页面→使用第三方软件识别验证码→将用户信息注册提交。
文章图片
脚本运行完毕后,可以看到大量用户被注册,均来自于提前准备好用于批量注册的用户文件。
文章图片
手段一 频度限制使用 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 可以有效判断这种差异,进而区分正常用户和自动化脚本。
代码实现以下条件:
- 提交注册 (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 可以给流程加入一次性限时令牌。具体到本例中,访问注册页面时用户获得一个一次性令牌,提交注册时这个令牌被消费掉,缺少令牌则不能进行提交注册。这一手段可以防范重放操作。
文章图片
代码实现以下条件:
- 访问注册页面 (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 应用的虚拟补丁。(张戈 | 天存信息)
推荐阅读
- 靶机DC-1
- 测试开发之系统篇-Docker常用操作
- 如何在Django中从HTML创建PDF
- 使用jQuery Plugin Multiselect使用复选框实现可过滤的多选
- 如何在Windows上安装Ruby并建立基本的Hello World
- 用jQuery实现并排多重选择元素
- 如何使用jQuery自动使所有高度相同的div列
- 如何使用jQuery将base64图像转换为图像文件并以异步形式上传
- 如何使用(WebKit)CSS自定义浏览器滚动条