WEB安全新玩法 [5] 防范水平越权之查看他人订单信息
水平越权是指系统中的用户在未经授权的情况下,查看到另一个同级别用户所拥有的资源。水平越权会导致信息泄露,其产生原因是软件业务设计或编码上的缺陷。iFlow 业务安全加固平台可以缓解部分场景下的水平越权问题。
以某电商网站为例,其查看订单功能存在漏洞:仅依靠修改 URL 参数,任意登录用户不仅可以查看自己的订单信息,也可以查看到其他用户的订单信息。我们看看在网站自身存在缺陷的情况下,如何利用 iFlow 阻止水平越权的订单信息访问。
一、原始网站
1.1 正常用户访问
正常用户登录成功之后,进入个人中心的订单管理页面显示自己的订单列表。

从订单列表中点击其中一个订单的订单详情,则可以看到订单的具体信息。

HTTP 交互流程如下:
participant 正常用户
participant 浏览器
participant Web服务器
正常用户->>浏览器: 点击【订单管理】
浏览器->>Web服务器: 请求:订单管理
Web服务器->>浏览器: 返回:订单列表
浏览器->>正常用户: 显示:订单列表页面
正常用户->>浏览器: 点击其中一项【订单详情】
浏览器->>Web服务器: 请求:订单详情
Web服务器->>浏览器: 返回:订单详情
浏览器->>正常用户: 显示:订单详情页面
1.2 攻击者访问
电商网站在处理订单详情业务时有个漏洞:它使用提交参数中的订单 ID 在数据库中获取到了订单信息,但没有去检查订单所有者是否与已登录用户为同一用户,而是直接将订单信息返回给了浏览器。
这样,攻击者与正常用户经过同样的操作 (即在订单列表查看自己的订单详情) 后,可以手工修改 URL 中的订单 ID 从而获取到任意用户的订单信息。这个过程可以连续地进行。
下图中,攻击者访问了 ID 为 8 的订单详情,而这个订单本应属于「test01」用户。

HTTP 交互流程如下:
participant 攻击者
participant 浏览器
participant Web服务器
攻击者->>浏览器: 点击【订单管理】
浏览器->>Web服务器: 请求:订单管理
Web服务器->>浏览器: 返回:订单列表
浏览器->>攻击者: 显示:订单列表页面
攻击者->>浏览器: 点击其中一项【订单详情】
浏览器->>Web服务器: 请求:订单详情
Web服务器->>浏览器: 返回:订单详情
浏览器->>攻击者: 显示:自己的订单详情页面
rect rgb(250, 128, 128)
攻击者->>浏览器: 请求参数id修改为任意值
end
浏览器->>Web服务器: 请求:订单详情
Web服务器->>浏览器: 返回:订单详情
rect rgb(250, 128, 128)
浏览器->>攻击者: 显示:他人的订单详情页面
end
二、iFlow虚拟补丁后的网站
我们在 Web 服务器前部署 iFlow 业务安全加固平台,它有能力拦截、计算和修改双向 HTTP 报文并具备存储能力,成为 Web 应用的虚拟补丁。在本例中,iFlow 记录订单列表中的所有订单 ID,在用户访问订单详情时进行检查。
2.1 正常用户访问
服务器在返回用户订单列表时,iFlow 解析出每一订单项目的订单 ID 形成用户的 合法id记录。用户在访问订单详情时,iFlow 检查要访问的订单 ID 是否包含在 合法id记录 中。
正常用户的 HTTP 交互流程如下:
participant 正常用户
participant 浏览器
participant iFlow
participant Web服务器
正常用户->>浏览器: 点击【订单管理】
浏览器->>Web服务器: 请求:订单管理
Web服务器->>iFlow: 返回:订单列表
rect rgb(160, 250, 160)
Note over iFlow: 所有订单id形成合法id记录
end
iFlow->>浏览器: 返回:订单列表
浏览器->>正常用户: 显示:订单列表页面
正常用户->>浏览器: 点击其中一项【订单详情】
浏览器->>iFlow: 请求:订单详情
rect rgb(160, 250, 160)
Note over iFlow: 订单id在合法id记录中
end
iFlow->>Web服务器: 请求:订单详情
Web服务器->>浏览器: 返回:订单详情
浏览器->>正常用户: 显示:订单详情页面
2.2 攻击者访问
如前所示,攻击者自行修改订单 ID 发出请求,iFlow 拦截此请求,发现请求的 ID 不在 合法id记录 中,即终止此过程。
攻击者的 HTTP 协议交互过程如下:
participant 攻击者
participant 浏览器
participant iFlow
participant Web服务器
攻击者->>浏览器: 点击【订单管理】
浏览器->>Web服务器: 请求:订单管理
Web服务器->>iFlow: 返回:订单列表
rect rgb(160, 250, 160)
Note over iFlow: 所有订单id形成合法id记录
end
iFlow->>浏览器: 返回:订单列表
浏览器->>攻击者: 显示:订单列表页面
攻击者->>浏览器: 点击其中一项【订单详情】
浏览器->>iFlow: 请求:订单详情
rect rgb(160, 250, 160)
Note over iFlow: 订单id在合法id记录中
end
iFlow->>Web服务器: 请求:订单详情
Web服务器->>浏览器: 返回:订单详情
浏览器->>攻击者: 显示:订单详情页面
rect rgb(250, 128, 128)
攻击者->>浏览器: 请求参数id修改为任意值
end
浏览器->>iFlow: 请求:订单详情
rect rgb(160, 250, 160)
Note over iFlow: 订单id不在合法id记录中
end
iFlow->>浏览器: 返回:终止访问
rect rgb(250, 128, 128)
浏览器->>攻击者: 终止访问
end
2.3 代码
iFlow 内置的 W2 语言是一种专门用于实现 Web 应用安全加固的类编程语言。它介于配置和通用语言之间,具备编程的基本要素和针对 HTTP 协议的特有扩展,能为业务系统编写涉及复杂判断和动态修改的逻辑。
考虑到安全产品的使用者通常为非程序员,他们习惯面对配置文件而非一段代码。因此,W2 语言虽包含语言要素,仍以规则文件方式呈现,并采用可以体现层次结构和方便词法校验的 JSON 格式。
用 W2 语言实现上述虚拟补丁的代码如下:
[
{
"if": [
"streq(REQUEST_FILENAME, '/shopx/index.php')",
"streq(@ARGS.s, '/index/order/index.html')"
],
"then": {
"execution": {
"directive": "setVariable",
"variable": "SESSION.valid_ids",
"value": "rxMatch(RESPONSE_BODY, '<a[^>]+href=\"[^\"].*(/index/order/detail/id.*)\" target=.*\"[^>]*>', -1, 1)",
"expiry": 3600
}
}
},
{
"if": [
"streq(REQUEST_FILENAME, '/shopx/public/index.php')",
"contain(@ARGS.s, '/index/order/detail/id')",
"!contain(SESSION.valid_ids, @ARGS.s)",
],
"then": {
"verdict": {
"action": "deny",
"log": "User access page ${@ARGS.s} NOT in ${SESSION.valid_ids}"
}
}
}
]
示例代码中有两条规则,分别作用如下:
第一条规则
当服务器返回订单列表时,iFlow 解析此响应。iFlow 用正则表达式匹配列表中每一个订单详情的链接,然后保存在会话 (SESSION) 的存储变量 valid_ids 中。
第二条规则
当浏览器请求订单详情时,iFlow 拦截此请求。iFlow 检查请求参数 s 是否包含在会话 (SESSION) 的存储变量 valid_ids 中。如果没有,则表示这个订单 ID 是攻击者自行输入的,阻止访问。
注意:上述会话中的
valid_ids是保存在服务器端的 iFlow 存储中的,攻击者在浏览器端是看不到数据更无法进行修改的。
三、总结
iFlow 使用两条规则在不修改服务器端代码的前提下,利用没有越权的订单列表信息,透明地保证了订单详情不被水平越权查看。
这个例子是建立在用户常规操作顺序的基础上的,即先获得订单列表再查看订单详情。如果网站的其他页面也包含了订单详情链接或者用户从书签中访问订单详情,则会产生误判。因此,它仅适用于这个场景而非彻底解决了水平越权问题。
以补丁方式解决水平越权问题还可以有其他一些方式,如后端参数混淆、加入鉴别码等方式。如何用 iFlow 实现这些功能,在后续介绍中可以看到。(张戈 | 天存信息)
WEB安全新玩法 [5] 防范水平越权之查看他人订单信息的更多相关文章
- WEB安全新玩法 [6] 防范图形验证码重复使用
在完成关键业务操作时,要求用户输入图形验证码是防范自动化攻击的一种措施.为安全起见,即使针对同一用户,在重新输入信息时也应该更新图形验证码.iFlow 业务安全加固平台可以加强这方面的处理. 某网站系 ...
- WEB安全新玩法 [2] 防范前端验证绕过
用户登录,几乎是所有 Web 应用所必须的环节.Web 应用通常会加入一些验证手段,以防止攻击者使用机器人自动登录,如要求用户输入图形验证码.拖动滑动条等.但是,如果验证的逻辑仅仅在前端执行,是很容易 ...
- WEB安全新玩法 [10] 防范竞争条件支付漏洞
服务器端业务逻辑,特别是涉及数据库读写时,存在着关键步骤的时序问题,如果设计或代码编写不当就可能存在竞争条件漏洞.攻击者可以利用多线程并发技术,在数据库的余额字段更新之前,同时发起多次兑换积分或购买商 ...
- WEB安全新玩法 [1] 业务安全动态加固平台
近年来,信息安全体系建设趋于完善,以注入攻击.跨站攻击等为代表的传统 Web 应用层攻击很大程度上得到了缓解.但是,Web 应用的业务功能日益丰富.在线交易活动愈加频繁,新的安全问题也随之呈现:基于 ...
- WEB安全新玩法 [8] 阻止订单重复提交
交易订单的重复提交虽然通常不会直接影响现金流和商品流,但依然会给网站运营方带来损害,如消耗系统资源.影响正常用户订单生成.制造恶意用户发起纠纷的机会等.倘若订单对象是虚拟商品,也有可能造成实际损失.订 ...
- WEB安全新玩法 [9] 重置密码之验证流程防绕过
一般来说,业务流程中出现多个操作环节时,是需要顺序完成的.程序设计者往往按照正常用户的操作顺序实现功能,而忽略了攻击者能够绕过中途环节,直接在后续环节上进行非法操作.iFlow 业务安全加固平台能够在 ...
- WEB安全新玩法 [4] 防护邮箱密码重置漏洞
大部分具有账号系统的应用都会提供重置用户登录密码的功能,常见方式之一是:用户输入自己的邮箱地址或手机号,应用向这个邮箱或手机号发送验证码,用户将收到的验证码输入应用中即可完成密码重置.这一过程容易因设 ...
- WEB安全新玩法 [3] 防护交易数据篡改
在任何涉及交易的系统中,客户与商家之间的交易数据具有核心作用,如购买商品的价格.数量.型号和优惠券等.在客户挑选商品的过程中,这些交易数据逐渐形成:待客户提交订单时,交易数据被商家接收,形成双方认可的 ...
- 自定义 checkbox 新玩法 ?
自定义 checkbox 新玩法 ? 第一步:selector 编写 drawable/selector_checkbox_voice.xml <?xml version="1.0&q ...
随机推荐
- 什么是redis的缓存雪崩, 穿透, 击穿?
目前的互联网系统没有几个不使用缓存的, 但是只要使用缓存的话就会面临这几个问题, 如使用redis缓存技术, 可能会遇到缓存的雪崩, 穿透, 以及击穿. 首先来看一个简单的正常缓存流程: 如用户访问J ...
- Java中对象池的本质是什么?(实战分析版)
简介 对象池顾名思义就是存放对象的池,与我们常听到的线程池.数据库连接池.http连接池等一样,都是典型的池化设计思想. 对象池的优点就是可以集中管理池中对象,减少频繁创建和销毁长期使用的对象,从而提 ...
- 人人都爱Kubernetes,Docker难道就不香了吗?
开篇 提起Docker,有很多人第一印象会认为它就是一个虚拟化容器,所以大家特别容易陷入到一种误区,就是觉得Docker只是在Linux操作系统之上又增加了一层,就跟OS上跑了一个VMWare一样.D ...
- 02、SpringBoot2入门
1.系统要求 Java 8 & 兼容java14 . Maven 3.3+ idea 2019.1.2 1.1.maven设置 <mirrors> <mirror> & ...
- 33.2.NIO
4.1概述[理解] BIO Blocking IO,阻塞型IO NIO No Blocking IO,非阻塞型IO 阻塞IO的弊端 在等待的过程中,什么事也做不了 非阻塞IO的好处 不需要一直等待,当 ...
- Python检查 文件备份是否正常 云备份进程是否正常运行
场景:服务器自动备份数据库文件,每两小时生成一个新备份文件,通过云备份客户端自动上传,需要每天检查是否备份成功. 实现:本脚本实现检查文件是否备份成功,进程是否正常运行,并且发送相关邮件提醒. #! ...
- k8s管理机密信息(12)
一.启动应用安全信息的保护 1.Secret介绍 应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥.将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 ...
- mysql基础之数据库变量(参数)管理
数据库的数据存放路径:[root@ren7 mysql]# pwd /var/lib/mysql [root@ren7 mysql]# ls aria_log.00000001 ibdata1 mul ...
- 用PHP爬取知乎的100万用户
http://blog.jobbole.com/88788/ 突然发现 大数据 Python的爬虫能力很强 爬取到的数据 直接可以用于维修QQ营销 精准营销
- 解决element-ui el-input输入框内容无法修改的问题
wqy的笔记:http://www.upwqy.com/details/271.html el-input 中 使用 :value 时 input输入的内容无法修改 <el-input : ...