1 前言
此原创文章以FocalPoint 为例, 介绍如何有效分析数据请求和响应, 并自动爬取数据的方法, 最后从安全防护的角度反思保护我们产品数据的一些思路,供大家参考和讨论。
2 FocalPoint 简介
(摘自https://www.teamblue.unicomsi.com/products/focal-point/)
FocalPoint™是UNICOM开发的一个灵活的、基于web的产品需求管理解决方案,使用户能够根据市场需求和业务目标进行产品和产品组合管理。FocalPoint可以快速启动和运行,并适配用户的工作方法、过程和工作流。用户可以快速确定优先顺序,选择正确的投资,平衡变化和业务需求,并调整资源,以保障在正确的时间交付正确的产品。
作者观点:
从设计和使用的角度,使用FocalPoint管理产品需求非常细致和灵活,用户可以根据自身的需要设计和定义很细粒度的参数, 这些参数为每一个需求提供了各个维度的信息,甚至可以说,信息非常丰富。 这些信息中,可能会包含大量的敏感或机密信息,这对某些黑客来说,可能是很大的诱惑。
和目前流行的Web应用一样,系统后台基于Web服务并且提供大量的JSON接口,强大的功能、灵活、方便的前端数据展示,也为黑客们爬取数据提供了极大的便利。
潜在威胁来自公司内部的攻击者, 或者被外部黑客控制的内部终端。 产品需求信息一旦泄漏,对公司的影响非常巨大。
3 FocalPoint数据爬取
3.1 数据请求分析
使用工具: Chrome/Edge浏览器, 结构化显示JSON数据的浏览器插件Pretty Js/JSON-handle
步骤:
(1)访问Web应用, 右键菜单选择”inspect”打开”开发者工具”界面, 点击刷新。
(2)点击Network->启动Record Network Log->Fetch/XHR
注,某些页面内容可能由web服务直接构造HTML,此时需要使用”All”来查看和分析页面内容,有时候会有意外的惊喜。
(3)查看逐个请求(Request)和响应(Response),对照页面显示的数据,从响应中检索有价值的信息,然后记录请求的URL以及相关参数,初步识别和整理潜在有价值的URL列表。
如上图: URL 为 https://<host>/<uri_root>/toolbar?type=display&dm=normal&feature=TREE响应数据为json格式,且未做任何加密。
(4)进一步对URL和其参数做分析和不断尝试,总结规律,这里以查询URL为例 。https://<host>/<uri_root>/search?q=123&m=XYZ, 尝试如下技巧,然后观察对响应数据的影响。
删除某些参数, 例如删除”q”
修改参数的值,特别使用一些边界值, 例如-1, 0 等等
在页面和响应中搜索url, href等等关键字
经反复测试发现:
search? m=XYZ会返回所有数据
其他URL,当filter=-1时,会返回所有数据
所有URL放在一起比较,发现只需要变换project_id, view_id就可以访问不同的产品数据
每一个需求属性可以通过URL访问, 变换URL中的属性id可以获取到任何属性的值
至此, 请求和响应分析工作准备完毕
3.2 自动化爬取方案
如何自动化爬取到数据? 方案怎样最简单,可靠,有效? 爬虫的方案很多, 我推荐的是选择多种技术结合,发挥各自的优势。
因为FocalPoint安全认证登步骤复杂,需要在多个URL中重定向,如果用Python实现会比较复杂, 因此我选择的方案是python+vbscript
(1)使用vbscript ,创建 WScript.Shell对象->启动浏览器->打开URL-> 等待页面加载完毕->发送快捷键^s打开保存窗口->发送文件路径->发送回车, 利用浏览器自身的保存功能来下载数据。
优点: 实现简单
缺点: 在脚本执行过程中不能点击鼠标和敲击键盘,否则窗口的焦点改变,会导致脚本执行混乱; 每一步耗时的操作需要设置合理的等待时间(WScript。Sleep), 确保数据准确获取
(2)使用python对JSON和文件的强大处理功能来解析数据, 并根据自己的需求对数据进行转换,从而能让这些数据更好的被利用。
(3)对复杂的数据, 需要很多步骤才能够获取,我的方法是使用脚本生成脚本,把 数据获取或数据的处理的代码做成模板(文本), 然后使用python来生成vbscript 或者另外一个python, 然后再运行这些vbscript/python来达到目的,这个方法可以达到事半功倍的效果。
(4)对于某些属性,可以利用vbscript 发送^c复制到剪贴板, 然后从剪贴板里获取数据保存到变量,再写入文件,这样可以避免解析HTML
4 存在的安全问题以及推荐措施
分类 | 问题 | 推荐措施 |
数据 | 数据明文,极其容易被检索和分析 | 可使用加密, 加扰,序列化等手段增加解析难度 |
接口 | 过多暴露的URL,页面中某些信息其实不需要暴露URL。 过多的不必要、没有价值的功能反而为数据暴露提供了更多的隐患 | 去掉这些画蛇添足的功能(url, button等等) |
大量的GET接口, 使获取数据特别容易 | 改用POST, 使用动态验证码做为隐藏的属性提交和验证数据请求 | |
某些接口在特殊条件下会返回所有数据,很容易被拖库 | 禁止一次返回整库数据,限制数据返回的数量,分批按条件返回 | |
URL接口参数固定,且参数值容易被猜测 | 关键、敏感数据请求的URL应避免做为GET的请求参数,推荐使用POST, 并使用动态表单技术, 变换参数ID,使参数不容易被猜测 | |
对反常高频次,单一获取某些关键参数的请求未做检测和限制, 正常使用行为不会持续只对某一类参数频繁检索 | 对这些关键参数须考虑反常流量检测,达到阈值后,采取合适的保护策略,比如冻结IP,24小时内禁止再访问同一参数等等 | |
界面 | “关于”页面,甚至暴露了使用的web server, oracle, java版本, 黑客更容易检索该版本对应的漏洞和利用方法 | 减少暴露,去掉用户不必要知道的信息 |
某些数据权限控制不严谨, 不可见但是可以访问。比如正常情况下,界面中看不到某类数据的菜单,但是使用构造的URL可以访问该类数据 | 不但要控制到不可见, 还须控制到不可访问 |
5 总结
如今的产品架构设计,都是模块化、细粒度、微服务……这对产品的开发和扩展非常有利,但需要有度, 每一个提供给终端用户的功能,包括每一个菜单、按钮、链接…… 都需要从安全的角度,从攻击者的角度去衡量,避免过度的信息暴露。
对关键、敏感、高价值的数据和接口, 需要在实现上和其他数据加以区分,使用合理的技术和措施,及时发现和阻断不正常的流量请求, 并提高数据被爬取的难度和成本。