在完成关键业务操作时,要求用户输入图形验证码是防范自动化攻击的一种措施。为安全起见,即使针对同一用户,在重新输入信息时也应该更新图形验证码。iFlow 业务安全加固平台可以加强这方面的处理。


某网站系统在登录时要求用户输入图形验证码。如果账号信息错误并得到系统提示后,用户重新输入账号信息时,仍可使用原来的图形验证码。我们看看如何利用 iFlow 使得图形验证码每次都得到更新。

一、原始网站

1.1 正常用户访问

用户在登录时输入了正确的图形验证码字符,如果提交的账号信息有误,系统提示登录错误。

用户仍使用原来的图形验证码字符,提交了正确的账号信息后,系统提示登录成功。

HTTP 交互流程如下:

sequenceDiagram
participant 正常用户
participant 浏览器
participant Web服务器
正常用户->>浏览器: 账号、错误的密码、验证码
浏览器->>Web服务器: 请求:登录
Web服务器->>浏览器: 返回:登录失败
浏览器->>正常用户: 显示:登录失败
正常用户->>浏览器: 账号、正确的密码、原来的验证码
浏览器->>Web服务器: 请求:登录
Web服务器->>浏览器: 返回:登录成功
浏览器->>正常用户: 显示:登录成功

1.2 攻击者访问

用户登录失败,网站没有主动更新图形验证码,而是一段时间内仍接受这个验证码。这个特性具有用户友好性,但增加了安全风险。

这样,攻击者即使没有使用图形验证码识别工具,也可以在人工识别出验证码后,在验证码过期时间之内,使用工具进行多次的撞库请求,并记录下成功登录的账号密码组合。

HTTP 交互流程如下:

sequenceDiagram
participant 攻击者
participant 浏览器
participant 攻击工具
participant Web服务器
攻击者->>浏览器: 账号、错误的密码、验证码
浏览器->>Web服务器: 请求:登录
Web服务器->>浏览器: 返回:登录失败
浏览器->>攻击者: 显示:登录失败
loop 验证码超时时间内
rect rgb(250, 128, 128)
攻击者->>攻击工具: 不同的账号/密码对
end
攻击工具->>Web服务器: 请求:登录
Web服务器->>攻击工具: 返回:登录结果
rect rgb(250, 128, 128)
攻击工具->>攻击者: 记录登录成功的账号/密码对
end
end

二、iFlow虚拟补丁后的网站

我们在 Web 服务器前部署 iFlow 业务安全加固平台,它有能力拦截、计算和修改双向 HTTP 报文并具备存储能力,成为 Web 应用的虚拟补丁。在本例中,iFlow 记录所有出现过的验证码,不允许用户重复使用这些验证码。

2.1 正常用户访问

iFlow 不允许使用重复的验证码。正常用户登录失败后,需要刷新页面或刷新验证码再进行登录。用户如果使用相同的验证码,iFlow 会自动刷新页面并产生新的验证码,用户需要输入新的验证码进行登录。

正常用户的 HTTP 交互流程如下:

sequenceDiagram
participant 正常用户
participant 浏览器
participant iFlow
participant Web服务器
正常用户->>浏览器: 账号、错误的密码、验证码
浏览器->>iFlow: 请求:登录
Note over iFlow: 验证码不在used_vcode中
Note over iFlow: 将验证码加入到used_vcode中
iFlow->>Web服务器: 请求:登录
Web服务器->>浏览器: 返回:登录失败
浏览器->>正常用户: 显示:登录失败
正常用户->>浏览器: 账号、正确的密码、旧的验证码
浏览器->>iFlow: 请求:登录
Note over iFlow: 验证码在used_vcode中
iFlow->>浏览器: 返回:重定向页面
浏览器->>Web服务器: 请求:新登录页面
Web服务器->>浏览器: 返回:新验证码的登录页面
浏览器->>正常用户: 显示:新验证码的登录页面
正常用户->>浏览器: 账号、正确的密码、新的验证码
浏览器->>iFlow: 请求:登录
Note over iFlow: 验证码不在used_vcode中
Note over iFlow: 将验证码加入到used_vcode中
iFlow->>Web服务器: 请求:登录
Web服务器->>浏览器: 返回:登录成功
浏览器->>正常用户: 显示:登录成功

2.2 攻击者访问

如前所示,攻击者首次人工识别出验证码后,用攻击工具连续发出相同验证码的不同账号/密码组合去尝试登录。iFlow 拦截这些请求,发现验证码已使用过,则返回 302 重定向响应。鉴别过程并未在 Web 服务器上进行,攻击者得不到鉴别结果。

攻击者的 HTTP 协议交互过程如下:

sequenceDiagram
participant 攻击者
participant 浏览器
participant 攻击工具
participant iFlow
participant Web服务器
攻击者->>浏览器: 账号、错误的密码、验证码
浏览器->>iFlow: 请求:登录
Note over iFlow: 验证码不在used_vcode中
Note over iFlow: 将验证码加入到used_vcode中
iFlow->>Web服务器: 请求:登录
Web服务器->>浏览器: 返回:登录失败
浏览器->>攻击者: 显示:登录失败
loop 验证码超时时间内
rect rgb(250, 128, 128)
攻击者->>攻击工具: 不同的账号/密码对
end
攻击工具->>iFlow: 请求:登录
Note over iFlow: 验证码在used_vcode中
iFlow->>攻击工具: 返回:重定向页面
rect rgb(250, 128, 128)
攻击工具->>攻击者: 得不到登录是否成功的信息
end
end

2.3 代码

iFlow 内置的 W2 语言是一种专门用于实现 Web 应用安全加固的类编程语言。它介于配置和通用语言之间,具备编程的基本要素和针对 HTTP 协议的特有扩展,能为业务系统编写涉及复杂判断和动态修改的逻辑。

考虑到安全产品的使用者通常为非程序员,他们习惯面对配置文件而非一段代码。因此,W2 语言虽包含语言要素,仍以规则文件方式呈现,并采用可以体现层次结构和方便词法校验的 JSON 格式。

用 W2 语言实现上述虚拟补丁的代码如下:

{
"if": [
"streq(REQUEST_FILENAME, '/shopx/index.php')",
"streq(@ARGS.s, '/index/user/login.html')"
],
"then": {
"if": "contain(SESSION.used_vcode, @ARGS.verify)",
"then": {
"verdict": {
"action": "redirect",
"param": "/shopx/index.php?s=/index/user/logininfo.html",
"log": "user ${SESSION.user} reuse verify code."
}
},
"else": "SESSION.used_vcode@600 = SESSION.used_vcode .. ',' .. @ARGS.verify"
}
}

示例代码只有一条规则,它使用存储变量 used_vcode 记录所有已使用的验证码。当有登录请求时,规则判断验证码请求参数 verify 是否在本会话 (SESSION) 的存储变量 used_vcode 中存在:

  1. 如果存在:表明此请求重用了验证码,直接返回重定向到登录页面的响应。
  2. 如果不存在:表明此请求使用新的验证码,将验证码加入到本会话 (SESSION) 的存储变量 used_vcode 中,继续进行实际的登录鉴别过程。

注意:上述会话中的 used_vcode 是保存在服务器端的 iFlow 存储中的,攻击者在浏览器端是看不到数据更无法进行修改的。

三、总结

iFlow 使用一条规则就可以在不改动后端程序的情形下,避免用户使用重复的验证码。

需要说明的是,文中的解决方案仅是一个示例,其一定程度上影响了人机交互的流畅性。而 iFlow 是一种灵活的类编程语言,使用它应该能写出更完善的处理流程。(张戈 | 天存信息)

WEB安全新玩法 [6] 防范图形验证码重复使用的更多相关文章

  1. WEB安全新玩法 [2] 防范前端验证绕过

    用户登录,几乎是所有 Web 应用所必须的环节.Web 应用通常会加入一些验证手段,以防止攻击者使用机器人自动登录,如要求用户输入图形验证码.拖动滑动条等.但是,如果验证的逻辑仅仅在前端执行,是很容易 ...

  2. WEB安全新玩法 [5] 防范水平越权之查看他人订单信息

    水平越权是指系统中的用户在未经授权的情况下,查看到另一个同级别用户所拥有的资源.水平越权会导致信息泄露,其产生原因是软件业务设计或编码上的缺陷.iFlow 业务安全加固平台可以缓解部分场景下的水平越权 ...

  3. WEB安全新玩法 [10] 防范竞争条件支付漏洞

    服务器端业务逻辑,特别是涉及数据库读写时,存在着关键步骤的时序问题,如果设计或代码编写不当就可能存在竞争条件漏洞.攻击者可以利用多线程并发技术,在数据库的余额字段更新之前,同时发起多次兑换积分或购买商 ...

  4. WEB安全新玩法 [1] 业务安全动态加固平台

    近年来,信息安全体系建设趋于完善,以注入攻击.跨站攻击等为代表的传统 Web 应用层攻击很大程度上得到了缓解.但是,Web 应用的业务功能日益丰富.在线交易活动愈加频繁,新的安全问题也随之呈现:基于 ...

  5. WEB安全新玩法 [4] 防护邮箱密码重置漏洞

    大部分具有账号系统的应用都会提供重置用户登录密码的功能,常见方式之一是:用户输入自己的邮箱地址或手机号,应用向这个邮箱或手机号发送验证码,用户将收到的验证码输入应用中即可完成密码重置.这一过程容易因设 ...

  6. WEB安全新玩法 [9] 重置密码之验证流程防绕过

    一般来说,业务流程中出现多个操作环节时,是需要顺序完成的.程序设计者往往按照正常用户的操作顺序实现功能,而忽略了攻击者能够绕过中途环节,直接在后续环节上进行非法操作.iFlow 业务安全加固平台能够在 ...

  7. WEB安全新玩法 [3] 防护交易数据篡改

    在任何涉及交易的系统中,客户与商家之间的交易数据具有核心作用,如购买商品的价格.数量.型号和优惠券等.在客户挑选商品的过程中,这些交易数据逐渐形成:待客户提交订单时,交易数据被商家接收,形成双方认可的 ...

  8. WEB安全新玩法 [8] 阻止订单重复提交

    交易订单的重复提交虽然通常不会直接影响现金流和商品流,但依然会给网站运营方带来损害,如消耗系统资源.影响正常用户订单生成.制造恶意用户发起纠纷的机会等.倘若订单对象是虚拟商品,也有可能造成实际损失.订 ...

  9. 自定义 checkbox 新玩法 ?

    自定义 checkbox 新玩法 ? 第一步:selector 编写 drawable/selector_checkbox_voice.xml <?xml version="1.0&q ...

随机推荐

  1. 【敏杰开发】Beta阶段事后分析

    [敏杰开发]Beta阶段事后分析 设想和目标 Q 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们达到目标了么(原计划的功能做到了几个? 按照原计划交付时间交付 ...

  2. opencv实战——图像矫正算法深入探讨

    摘要 在机器视觉中,对于图像的处理有时候因为放置的原因导致ROI区域倾斜,这个时候我们会想办法把它纠正为正确的角度视角来,方便下一步的布局分析与文字识别,这个时候通过透视变换就可以取得比较好的裁剪效果 ...

  3. Git 系列教程(12)- 分支的新建与合并

    实际工作场景 可能会遇到的工作流 开发某个网站 为实现某个新的用户需求,创建一个分支 在这个分支上开展新工作 正在此时,你突然接到一个电话说有个很严重的问题需要紧急修补,你将按照如下方式来处理: 切换 ...

  4. jmeter自动停止监听--AutoStop Listener

    如下图:

  5. [c++] 开发问题

    语言中的很多细节都是为了应对实际开发中会遇到的问题 当编写程序时,我们使用的定义多数不是自己写的,如sqrt(),是很多年前别人写的,我们只是使用它们 在C++中,对于"别处"定义 ...

  6. 每天一个linux命令(49):at命令   atrm删除作业,由作业号标识。

    atq命令 例如:从现在起三天后的下午四点运行作业at 4pm + 3 days:在July 31上午十点运行作业at 10am July 31:明天上午一点运行作业at 1am tomorrow. ...

  7. X Sever —— Xorg

    X Sever -- Xorg  发表于 2020-03-20 分类于 系统服务 , Xorg 阅读次数:39 阅读次数:48 本文字数: 7k 阅读时长 ≈ 6 分钟 Xorg:基于X11协议的服务 ...

  8. window 共享打印机

    https://www.zhihu.com/question/20653708 https://h30471.www3.hp.com/t5/da-yin-ji-yu-sao-miao-yi-de-an ...

  9. touch -d 同时修改atime与mtime

    1.touch命令 touch命令用于创建空白文件或设置文件的时间,格式为"touch [选项] [文件]". 在创建空白的文本文件方面,这个touch命令相当简捷,简捷到没有必要 ...

  10. /usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "process_linux.go:245: running exec setns .....

    docker创建容器时报错如下: containerd: start container" error="oci runtime error: container_linux.go ...