挖洞经验 | 看我如何发现OpenDrive云存储平台的会话机制漏洞
作者:CQITer小编 时间:2018-05-05 21:55

最近在对比云存储解决方案时,我惊讶地发现很多公司仍然在提供无限量云端数据存储服务方案,像OpenDrive公司就是这样(注意别和OpenDRIVE格式规范混淆),OpenDrive公司专为个人、商业团体和公司企业提供无限存储方案。
除了传统的云存储功能外,OpenDrive还以软件客户端和移动APP的应用形式,为使用客户提供存储备份和内容管理解决方案,据OpenDrive官网介绍,包括T-Mobile、Ancestry.com和REMAX在内的很多知名公司,都是其客户群体。
发现我通过网页客户端,注册了一个OpenDrive的试用账户进行测试。在上传了一些测试文件之后,我留意查看了其标记和API请求后发现,OpenDrive公司网站架构为WordPress,而且包括样式、登录和API使用等很多地方都有明显定制化开发的痕迹。

我还通过HTTP代理注意到,在整个存储过程中,存储机制会对两个API服务端发起调用,一个是www开头且用cookie进行验证的子域名服务端,另一个是如下以web开头并用单独的 session ID 进行验证的API服务端:
GET https://web.opendrive.com/api/v1/download/file.json/ABC123***REMOVED***?session_id=1517592191112474005&inline=0&preview=1 HTTP/1.1 Host: web.opendrive.com Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 Accept: image/webp,image/apng,image/*,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.9注意上述GET请求中session_id中的值:
session_id=1517592191 112474005
这个值与Unix系统下的时间戳有些类似,它极有可能是用户初始登录请求时的时间点转化过来的信息—不太好是吧!实际上,前10个数字就是从我账户首次登录时的 日期/时间(data/time)信息转化过来的。

上面session_id中剩下的9位数字可能只是相同登录时间下的其它更精确的生成值,例如来自服务器端函数,如PHP的microtime中生成的毫秒。我尝试通过连续发出大量登录请求,来比较生成的session_id值进行验证,正如预测的那样,这些数字都是连续的时间值。
接下来,我决定看看这种会话机制是如何使用的,它对OpenDrive’产品的安全性影响如何。由于网页客户端对该API的调用功能有限,所以我在测试手机上安装了一个OpenDrive的安卓应用APP。

在测试手机上部署好请求代理之后,我就登录了自己的OpenDrive账户,开始浏览文件、移动文件夹、访问我账户下的其它信息。经过观察,我发现,所有API服务端都使用了相同的,且存在漏洞缺陷的以下session_id生成机制,如以下请求示例:
GET https://ai2.opendrive.com/api/v1/users/info.json/1517592191112474005 HTTP/1.1
session_id: 1517592191112474005
Host: ai2.opendrive.com
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.7.0
上述请求发起来,返回了相应的JSON响应如下:
{ "UserID": 1853669, "AccessUserID": 0, "UserName": "***REMOVED***", "UserFirstName": "***REMOVED***", "UserLastName": "***REMOVED***", "PrivateKey": "***REMOVED***", "Trial": "0", "UserSince": "1517591533", "BwResetLast": "1517591533", "AccType": "1", "MaxStorage": "5120", "StorageUsed": "361144", "BwMax": "1024", "BwUsed": "0", "FVersioning": "0", "FVersions": "10", "DailyStat": 0, "UserLang": "en", "MaxFileSize": "102400", "Level": "1", "UserPlan": "Basic Plan", "TimeZone": "America\/Los_Angeles", "MaxAccountUsers": "1", "IsAccountUser": 0, "CompanyName": "", "Email": "***REMOVED***", "Phone": "", "Avatar": null, "AvatarColor": "a38f84", "AdminMode": 1, "DueDate": "0000-00-00", "WebLink": "", "PublicProfiles": 0, "RootFolderPermission": 2, "CanChangePwd": 1, "IsPartner": 0, "Partner": "OpenDrive", "SupportUrl": "http:\/\/support.opendrive.com", "PartnerUsersDomain": ".opendrive.com", "Suspended": false, "Affiliation": "0", "UserUID": "5ac61707c2ee6" }



