Laravel调试模式未关闭导致管理员凭证与敏感报告泄露
背景
11年前,Benjamin与我在BMJ Careers上发表了文章“There’s a medical app for that”,帮助读者评估医疗应用的安全性。当时我们关注的是患者安全,而今天我们将关注医疗工作者自身的安全。
让我们仔细看看这款允许用户报告工作中不当行为的应用——#zouikwatzeggen-app(意为“#我会说点什么-app”)。这款应用安全吗?
该应用旨在提高对不当行为的认识,并展示如何讨论这些问题。还有一个报告按钮,可以轻松(匿名)直接向正确的人报告不良行为。该应用是一个更大的电子学习包的一部分,包括关于预防不良行为的电子学习和研讨会。
职场中的不良行为有多种形式:八卦、欺凌、排斥、恐吓、言语和身体攻击、歧视、冲突以及性言论或行为。
归根结底,我认为每个人都同意减少不良行为是件好事。应用可能有所帮助,但我们需要确保应用本身在处理高度敏感数据时尽可能安全。
侦察:应用如何工作?
作为安全研究人员,我们对“通过应用发送报告”的功能很感兴趣。这是如何工作的?某种将数据中继到电子邮件的表单?参数是什么?支持此功能的代码托管在哪里?服务器是否安全?
我们从Android应用开始,因为我们可以轻松下载应用并修补代码以拦截应用产生的流量。
如今所有应用都使用HTTPS进行通信,通过修补我们禁用了这些安全检查。修补后,我们可以通过Burp Suite路由应用流量并检查/操纵它。
有多种方法可以获取应用的APK安装文件。方法1——从Google Play商店在Android手机上安装应用,并使用这里描述的方法;https://stackoverflow.com/questions/4032960/how-do-i-get-an-apk-file-from-an-android-device
方法2——信任第三方下载网站并下载APK;参见https://apkpure.com/上的深层链接
拦截应用流量
获取APK后,我们使用APK-MITM修补APK,使其不再检查HTTPS证书;它需要接受我们Burp强制实施的HTTPS证书。
安装apk-mitm后,我们可以运行:
|
|
来修补它。
修补APK文件后,我们可以使用ADB将其安装到手机上(参见此页面获取说明)。专业提示:使用scrcpy在桌面上捕获手机屏幕,如果您想同时捕获两个屏幕,如下面的视频所示,这非常方便。
准备手机以便与Burp Suite配合工作。例如,参见本教程。仍然无法用Burp拦截流量?您可以使用此命令将Burp Suite证书直接注入到修补的APK中:apk-mitm \#Zouikwatzeggen_2.2.2_Apkpure.apk --certificate cacert.pem。cacert.pem文件通过运行此命令创建:
|
|
在APK中注入Burp证书后,应用流量拦截工作正常。左边是应用发出的请求。
我们现在能够拦截应用与其后端系统之间的流量。例如,当我们提交新报告时,我们能够拦截发出的请求:
提交新报告时发送到服务器的请求。它返回一个错误消息,包括堆栈跟踪。
堆栈跟踪错误消息?
这很奇怪。提交报告的功能被破坏,应用返回错误。快速查看请求,我们看到:“recipient”: “null”。开发人员在发送表单时忘记了设置电子邮件…
此外,返回的错误非常详细。它反映了触发错误的确源代码文件和代码行。这闻起来像是有人在应用发布前忘记了正确测试所有功能,并且忘记了关闭调试消息。
然而,首先让我们深入挖掘,尝试通过注入我们自己的电子邮件地址作为收件人来修复请求。
|
|
注入我们自己的电子邮件作为收件人。
几秒钟后,我们收到了这封电子邮件:
漏洞1:能够从#zouikwatzeggen-app向任何人发送电子邮件
我们发现了第一个漏洞:电子邮件欺骗。
尽管影响有限;但有人可以使用应用向任何人发送自定义文本的电子邮件。对于网络钓鱼活动或只是向互联网上的用户发送垃圾邮件很方便。
现在让我们仔细查看提交电子邮件表单时返回的标头:
|
|
PHP调试栏
如果您仔细看,会注意到phpdebugbar-id;这是PHP开发人员使用的一种工具(2),用于轻松调试已部署应用程序中的问题。这可能解释了为什么我们得到那些详细的错误消息。应用程序的调试模式未关闭,并且包括一个php调试栏。
让我们看看是否能在桌面上触发调试栏的用户界面。一个简单的方法是访问应用使用的其中一个端点来触发错误。
我们从Burp历史记录中随机选择一个URL,并在浏览器中打开它。
https://api.zouikwatzeggen.nl/getToKnowYou?domain=1&model=App%5CCms%5CModels%5CAfterIntroBeforeQuestionsHolxder(注意Holxder部分是一个触发错误的拼写错误)。
我们获得了调试栏的访问权限!
这里我们有第二个漏洞:php调试栏暴露。请参见https://github.com/barryvdh/laravel-debugbar以了解其所有功能。
这个漏洞让我们洞察应用背后的代码、其设置和活动用户会话及其数据。正如我们所理解的,这是一个问题。但我们需要一个概念证明,让组织中的每个人都能理解,这对AmsterdamUMC的15,000名员工有什么影响?他们如何受到影响?如果我告诉董事会“PHP调试栏未关闭!”,他们会耸耸肩。
尽可能,我们应该提供一个每个人都能理解的概念证明,同时限制这样做造成的损害。例如:我们现在能否使用这个调试栏泄露我们自己提交的不当行为报告?
左边是我们刚刚发送报告的手机,右边是暴露的调试栏。灰色部分是用于搜索我们刚发送报告泄漏的Burp Suite。蓝色标记了实际泄漏。
好的。这很严重;我们可以泄露提交的报告。
调试栏允许列出服务器所有访问者的最新请求。这包括不当行为报告的提交。在调试栏UI中,它不反映这些报告的确切细节。然而,当有人拦截调试栏流量(使用Burp浏览器)时,它将反映所有报告细节。
上面的概念证明视频可能有点快,所以让我们仔细看看。
步骤1:打开请求模态。 按下文件夹图标打开活动会话的模态
步骤2:打开来自应用的传入POST请求。 打开请求/formData
步骤3:拦截PHP调试栏关于此请求发出的请求,在Burp中检查响应并搜索字符串Serieuze,看看是否能找到我们报告的一部分(并确认泄漏)。
漏洞2:响应包含不当行为报告消息
换句话说,有人可以监控此端点https://api.zouikwatzeggen.nl/_debugbar/open?op=get,无需认证,每隔几秒存储输出。这允许有人近乎实时地捕获员工发送的所有报告。
我们现在已经证明了漏洞泄露报告细节,但是否还有更多?
在深入挖掘后,我们发现过去调试栏可以被滥用以实现远程代码执行(RCE),参见此漏洞。幸运的是,这个Laravel已正确修补,我找不到绕过修复的方法。
我们还能做些什么来使用这个调试栏实现RCE?
泄露管理员密码
如果系统管理员使用相同的Web应用程序访问管理面板怎么办?我们能否泄露密码?
让我们监控此服务器上的传入请求几个小时,看看是否幸运地监控到管理员登录:
捕获的服务器请求,有人尝试登录。
万岁!正如我们所见,路径/cm/login被另一个用户请求。让我们看看用于此登录的凭据。
漏洞3:管理员用户名和密码泄露(上图中模糊处理)
我们现在证明了这个漏洞给了我们访问管理员仪表板所需的凭据。
是时候停止我们的研究并与CERT分享所有见解了。
讨论,不造成伤害——Primum non nocere
现代(和古老)医学的基本原则之一是,我们需要确保我们的干预真正有助于解决问题,而不是实际上使其更糟。
如果提交者的高度敏感数据被泄露,或者关于不知情的不当行为潜在对象的报告细节被泄露怎么办?它会对我们对系统的整体信任产生什么影响?
一个有趣的观点是,尤其是这条“不造成伤害”规则使我们在医学中创建了适当的(透明)程序,然后我们才能甚至研究对人类