我黑了我们政府的COVID追踪器,这是我了解到的

2020-11-16 20:58:28

该程序类似于在中国推出的基于二维码的系统。在人们进入一个地点时应该扫描二维码的地方,政府服务器将根据二维码扫描来保存和跟踪他们的入住和退房。

撇开隐私不谈,既然我们正在经历第二波COVID19,跟踪解决方案可以帮助识别接触到潜在COVID19患者的人。

我已经很长时间没有调查过漏洞了。我忙于我的日常工作,还有我的健康信息学硕士学位。

然而,Facebook上的一篇帖子引起了我的注意,该帖子称,有人找到了非官方的API访问,以检查任何只传递NIC号码(就像是社保号码)的人的感染状态。

这篇帖子显示了一个非官方的API,任何人只需输入一个网卡号码,就可以获得他们的Covid状态,而不需要任何身份验证。

由于这一切都与一个健康信息学系统有关,这激发了我对更多关于StaySafe平台的好奇心,可能会发现一个漏洞,并最终攻破它。

我访问了Stay Safe网站,乍一看,它有一个简单的登录页面。

根据登录页面,我必须做的就是把我的网卡号码发到1919,或者用我的手机扫描二维码。

如果我发送短信,他们会创建一个新帐户,将我的网卡号码与我的手机号码关联起来。

如果我扫描二维码,它会把我带到一个注册表,在那里我必须给出我的网卡号码,手机号码,他们会用同样的细节把我注册为一个新用户。

于是我拿起手机,把123456789V作为我的网卡号码发到了1919。我希望系统会拒绝我的NIC号码,因为这显然是一个错误的NIC号码(就像信用卡号码一样,NIC号码遵循标准模式)。

然而,我可以使用一个假的网卡号码注册系统,这意味着我可以玩弄系统,或者用别人的网卡号码冒充别人。

尽管如此,我还是找不到截图上看到的关于非官方API的信息。

我用手机扫描了二维码,它把我带到了一张登记表。

系统为不同的位置生成不同的表单,每个位置都有自己唯一的URL。

这些表格也有同样的漏洞,我可以使用假的网卡号码注册。

我用假数据通过表格注册,同时检查网络请求。

这些请求都是使用Javascript发出的,查看开发人员工具,查看请求,我发现任何人都可以向非官方API端点发出GET请求,只需将他们的NIC编号与GET请求一起发送,即可获得Covid状态的感染状态。

查看谷歌搜索结果,我可以访问商家(位置所有者)的后端仪表板,而这是用户不应该访问的。

此页面未受任何身份验证保护。但是,我无法点击链接,因为它们会将我重定向到登录页面。

因此,再次查看网络请求时,我发现它们正在检查用户是否从前端登录。

通过使用Javascript并将商家ID发送到API,它假定检查该商家ID是否存在于数据库中(它是一个4位ID),如果商家ID存在,则发送有效响应,如果不存在,则发送无效响应,并重定向用户。

查看他们的Javascript代码,我发现他们将商家ID保存在浏览器本地存储中。因此,通过使用开发人员工具,我在浏览器本地存储上创建了一个4位数的商户ID。(我可以从注册表中获得有效的商户ID。)。

刷新页面后,我可以访问仪表板上的其他损坏功能。我可以提交一些表格,但我无法通过仪表盘获得任何有价值的数据。我不知道我传递的数据是否有什么不同。

然后,我在同一个Facebook帖子上看到了另一张照片,上面显示了一个密码栏。

然后,我来到一个带有密码字段的页面,说我需要一些密钥才能登录到下一个页面。

我输入了一些通用密码来检查它是否能打开,但没有成功。

我再次检查了页面源代码。所有的用户检查都是在前端使用Javascript完成的。

因此,我查看了Javascript代码,发现了这个不寻常的函数,函数saveAdmin(){}。

函数saveAdmin(){var fName=document.getElementById(";sfname";).value;var lName=document.getElementById(";slname";).value;var Contact=document.getElementById(";sphone";).value;var Email=document.getElementById(";semail";).value;var Password=document.getElementById(";spassword";).value;var isOk=True;if(isEmpty(电子邮件)){setErrorMessage(';Semail';,';电子邮件是必需的。';)isOk=False;}Else{removeErrorMessage(';Semail&39;);}if(isEmpty(Contact)){setErrorMessage(';sphone&39;,';联系人号码)。';)isOk=False;}Else{removeErrorMessage(';sphone';);}if(isEmEmpty(';sphone&39;);}if(isEmpty(联系人)){setErrorMessage(';sphone';);}if(IsEmEmpty)。)isOk=False;}Else{removeErrorMessage(';spassword';);}if(isOk=False){return;}var form=new FormData();form.append(";mainTypeId&34;,";1";);form.append(";mainType&34;,";Admin";);form.append(&#。子类型";,";保持安全;表单.append(";contactNumberTypeId";,";2";);form.append(";contactNumberType";,";Personal";);form.append(";contactNumber";,联系人);form.append(";Email";,Email);Lname";,lname);form.append(";password";,password);var设置={";url";:main_api_url+";/admin/save_admin";,";type";:";post";,";timeout";:0,";Header";:{';X-。Meta[name=";csrf-token";]';).attr(';content';)},";流程数据";:FALSE,";MIME类型";:";多部分/表单-数据";,";内容类型";:FALSE,";数据";:表单,成功:函数(数据){Swal.fire({//Position:';top-end';,ICON:';Success';,Title:';Account';;})。然后(Function(){window.location.place(main_url+';/admin/dashboard';);});},错误:Function(Data){console.log(Data);}};$.ajax(设置);}。

进一步检查该函数的代码,我发现我所需要做的就是将姓名、电子邮件、电话号码、密码和CSRF令牌(我可以从网站收集)作为POST请求传递给saveAdmin函数中提供的API URL。

查看该功能,它看起来似乎成功了,我将能够在系统上创建一个管理员帐户,这可能就是我正在寻找的漏洞。

作为回应,我得到了一个成功的回复,这意味着我刚刚创建了一个新的管理员帐户。我既惊讶又兴奋。

创建管理员帐户是一回事,但登录又如何呢?我返回登录页面,尝试输入我刚刚在上一个POST请求中传递的密码。但没起作用。

再次查看Javascript代码,就像他们对商家仪表板所做的那样,我看到他们正在使用Javascript从前端检查身份验证。

它们存储一个带有名称、ID和电子邮件的本地存储对象,在本地存储中保存这些对象后,它们会将您重定向到仪表板URL,该URL也可以在Javascript代码中找到。

他们将使用管理员详细信息、ID、姓名和电子邮件进行API调用。我的理论是,如果数据存在于后端,则API将返回有效响应,否则将返回响应。

由于我创建了一个admin帐户,并且我随身携带了电子邮件、姓名,并从saveAdmin函数的响应中收到了我的管理员ID,因此我只需将这些对象保存在本地存储中,然后祈祷,然后在浏览器地址栏中输入仪表板URL。

就这样,我进入了电晕跟踪器的仪表盘内,该仪器旨在追踪全国患者的暴露情况。

在短暂的喜悦之后,我想探索一下系统,看看系统的功能。

我可以搜索任何注册了该系统的人,使用他们的网卡或手机号码。

我可以看到他们访问过的地方,甚至可以将它们标记为感染,我没有篡改或保存任何数据。我的目的只是找到漏洞并报告它。

由于某种有线原因,当某人登录到仪表板时,所有注册的用户数据都会被提取到仪表板的单个JSON响应中。我能够看到该请求返回了大约8000多个用户数据,其中包括他们的手机号码、NIC号码和他们的COVID状态。

我不确定此响应是否包含系统中的所有用户数据。

我没有篡改任何数据。我联系了一些对Facebook上最初的帖子发表评论的开发人员,这些帖子引发了这一切,以找出这是否是唯一的漏洞。

但一些开发人员告诉我,网站的SSL没有正确配置,你可以找到服务器的IP地址,这也是正确的。

尽管Javascript可以提供良好的用户体验,但通过Javascript传递身份验证细节是有风险的。与在Javascript请求中传递会话细节相比,服务器端可以很容易地读取会话值。

我联系了ICTA的首席技术官Hiranya Samarasekera先生,我告知了漏洞,并提供了修复漏洞的支持。

Hiranya Samarasekera先生说,该项目是由一群志愿者开发的,并免费提供给ICTA。

ICTA感谢我告知了这一漏洞,并表示他们正在努力修复。

在写完这篇文章后,Hiranya Samarasekera先生联系了我,我和StaySafe的开发者进行了一次讨论,我向他们解释了我们发现的漏洞,并就如何修复它提出了我的想法。

我没有篡改或保存任何数据,我希望我是第一个发现漏洞的人,没有人能够入侵系统并获取用户数据。

这篇文章的想法只是为了学习寻找漏洞和设计安全系统。对于任何人错误使用此信息造成的任何损害,我不承担任何责任。