Laravel调试模式泄露管理员凭证与敏感报告

本文详细分析了Zouikwatzeggen.nl因Laravel调试模式未关闭导致的安全漏洞,包括管理员凭证泄露、用户提交的不当行为报告被实时监控,以及如何通过技术手段复现和验证这些漏洞。

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后,我们可以运行:

1
apk-mitm \#Zouikwatzeggen_2.2.2_Apkpure.apk

来修补它。

修补APK文件后,我们可以使用ADB将其安装到手机上(参见此页面获取说明)。专业提示:使用scrcpy在桌面上捕获手机屏幕,如果您想同时捕获两个屏幕,如下面的视频所示,这非常方便。

准备手机以便与Burp Suite配合工作。例如,参见本教程。仍然无法用Burp拦截流量?您可以使用此命令将Burp Suite证书直接注入到修补的APK中:apk-mitm \#Zouikwatzeggen_2.2.2_Apkpure.apk --certificate cacert.pem。cacert.pem文件通过运行此命令创建:

1
curl --proxy http://127.0.0.1:8080 -o cacert.der http://burp/cert && openssl x509 -inform DER -in cacert.der -out cacert.pem

在APK中注入Burp证书后,应用流量拦截工作正常。左边是应用发出的请求。

我们现在能够拦截应用与其后端系统之间的流量。例如,当我们提交新报告时,我们能够拦截发出的请求:

提交新报告时发送到服务器的请求。它返回一个错误消息,包括堆栈跟踪。

堆栈跟踪错误消息?

这很奇怪。提交报告的功能被破坏,应用返回错误。快速查看请求,我们看到:“recipient”: “null”。开发人员在发送表单时忘记了设置电子邮件…

此外,返回的错误非常详细。它反映了触发错误的确源代码文件和代码行。这闻起来像是有人在应用发布前忘记了正确测试所有功能,并且忘记了关闭调试消息。

然而,首先让我们深入挖掘,尝试通过注入我们自己的电子邮件地址作为收件人来修复请求。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
POST /formData HTTP/1.1
Host: api.zouikwatzeggen.nl
Cookie: XSRF-TOKEN=eyJpdiI6Ijh6ODVJYTZrQ1lsOHlpbXVCWm51dkE9PSIsInZhbHVlIjoiRnBabGd6U0pCSGw0Y0hyYXlPa1IzcGVoS1BLZkYyeVR6WEtoZlV5N2xUVERpbnd2eGdVSVdPUzQxdjJtTFlLcm9ZNy9pVWR0Rk1CWFlwSlAvQjNmcVdNKzc4czBwZXJSa016YnpJdlVnMjhkTEtSS0c5M1hjOGxYSzdSQ3YvMUUiLCJtYWMiOiI4MzVjZmU1MDVmOTQ1MTliNmY5YTMyOGI4NzliYjM4NWQwMmJkOTFjNGVlN2JlODViY2MzOTQ1NWFkNWI3ZGQ2In0%3D; zouikwatzeggen_fritz_api_v2_session=eyJpdiI6IkMya3ZIcEozV2RpdUg0NkRqUU14V2c9PSIsInZhbHVlIjoiVGo2eGJFaElHek5jREhXL3RGM093R0xZRXlZbm41UldvT3hsMXRRRWV3VktIMVZBL215NTV2TExUQmlGT3Irc1dkT0lEYmFJNWYrQU1KaU9aUmJ6TGt5cVhnSFFPUDhRVkFER1oyTzRnaC83a2x3WUNsbVhKV2s4MmJkTkJRcFIiLCJtYWMiOiI0YWUyZmVlZjk1ZTA1NmVkMjU1MTljMDE0MWYxMDM5Njk0M2I2YjljOWU1ODUzMTRlNmIyNDQ0ODUzOTM0OWVlIn0%3D
Accept: application/json, text/plain, */*
Content-Type: application/json;charset=utf-8
Content-Length: 112
Accept-Encoding: gzip, deflate
User-Agent: okhttp/3.14.9
Connection: close

{"message":"https://test.nl <h1>test</h1>","type":"ContactViaAnonymousEmail","recipient":"pentest@protozoan.nl"}

注入我们自己的电子邮件作为收件人。

几秒钟后,我们收到了这封电子邮件:

漏洞1:能够从#zouikwatzeggen-app向任何人发送电子邮件

我们发现了第一个漏洞:电子邮件欺骗。

尽管影响有限;但有人可以使用应用向任何人发送自定义文本的电子邮件。对于网络钓鱼活动或只是向互联网上的用户发送垃圾邮件很方便。

现在让我们仔细查看提交电子邮件表单时返回的标头:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
HTTP/1.1 200 OK
Date: Mon, 12 Sep 2022 17:50:06 GMT
Server: Apache/2.4.41 (Ubuntu)
Cache-Control: no-cache, private
phpdebugbar-id: X87122f399eb1db5364428a9111273a8b
Set-Cookie: XSRF-TOKEN=eyJpdiI6Ik9ROW14ckUrbU0xVjdXQzZWMko0R2c9PSIsInZhbHVlIjoiUnFIQW1YZlBSbXVmaEhkREpjeHUyYTRXbUZhY3pyK1JLbmhKaFU0QXQvOUR4YXF1MUJMallOUUZyR05NOVV4S2wyYTZDc2lERTJZU0IxL2RyTzcrZVFhd25ndFpRWXd4WVJtNHFLUVVWdEZ2OTd2MWJBTURGd1Z2VjJIUStHZmIiLCJtYWMiOiI1ZDE3Y2IxZDEyODFkZGRlNWEwMjBkODJjZWUyN2M1ODkxZThjM2Q5OTQ1YTcyNzk2MWEwZmVmNGZmOWYwMmE1In0%3D; expires=Mon, 12-Sep-2022 19:50:06 GMT; Max-Age=7200; path=/; samesite=lax
Set-Cookie: zouikwatzeggen_fritz_api_v2_session=eyJpdiI6Im1hMWpreFZ6VjIwRSsySmtjcjBCbUE9PSIsInZhbHVlIjoiVzRiSy9nZ1F6c0pTZDNLUjE1bUNqR0FTSUM4UDFweG4rVjNsRUVzTGtSdFpSeXFrUnZSOHJUZxhszQU0yalZWMzJKQmhkK2ZSRHVaVjBmNGFzemVXSWNYak9FdHRYa0tmYnlpdnpxTlhOZlZsaVpSd0hwNDVJWVVSRzBBeXpkalkiLCJtYWMiOiI3OGU0Yzk1NTQ1NTRkZDNiYjJlMzQ4ZjkyYWMwNTI3OGVhZTQwNTFlMmJlMDZkMGIyOTY3ODZhOGI5NjI2NDVkIn0%3D; expires=Mon, 12-Sep-2022 19:50:06 GMT; Max-Age=7200; path=/; httponly; samesite=lax
Content-Length: 17
Connection: close
Content-Type: application/json

{"status":"sent"}

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

现代(和古老)医学的基本原则之一是,我们需要确保我们的干预真正有助于解决问题,而不是实际上使其更糟。

如果提交者的高度敏感数据被泄露,或者关于不知情的不当行为潜在对象的报告细节被泄露怎么办?它会对我们对系统的整体信任产生什么影响?

一个有趣的观点是,尤其是这条“不造成伤害”规则使我们在医学中创建了适当的(透明)程序,然后我们才能甚至研究对人类

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计