通过移动应用程序Q
RC OD
E扫描信息安全项目参展商的徽章。
去年,我们参观了伦敦的一次大型信息安全项目展览。 在准备过程中,我们以“自己打印” PDF的形式发送了通行证。
我们立即注意到两种类型的条形码。 有趣的是,QR码看起来过于密集,因为它足以在其中存储参与者ID。 由于天生好奇,我们启动了QR扫描仪并收到了代码内容:
{"CJe";"BHEEZST","DO";"Cvmmfuqsppg","G";"upn","KU";"Qfofusbujpo uftufs","T";"xzbuu"}
事实证明,它几乎是但不是相当JSON。 我这样的简称的优点之一是,在这种情况下,它会引起您的注意。 因此,我立即注意到我的名字是用ROT-25编码的(“ tom”变成“ upn”)。 这也称为凯撒密码(Caesar's Cipher),其中每个字母都用固定偏移量替换为另一个字母(在这种情况下,使用字母代替每个字母)。 通过解码器运行该行(考虑了JSON标记),我们得到:
{"BId";"AGDDYRS","CN";"Bulletproof","F";"tom","JT";"Penetration tester","S";"wyatt"}
这更具可读性。
打破吗
奇怪的是,QR码存储的信息似乎与数据库中的BId字段相关。 怎么了 好吧,这很简单。 组织者为供应商制作了一个移动应用程序,可帮助他们在展览期间收集参与者的联系方式。 我们假设在Wi-Fi或蜂窝信号不稳定的情况下,数据会以QR码进行加密。
到目前为止,除了更改数据以避免事件中来自供应商的垃圾邮件外,我们对这些信息几乎无能为力。 这很有趣,但几乎不值得给系统开发人员发送电子邮件。 因此,我们去了Play Market,并安装了适当的应用程序以查看其功能。
在这里,我们遇到了一个问题:我们没有活动组织者的必要数据。 我们认为我们可以使用MiTM代理来伪造服务器响应,而应用程序将让我们走下去。 我们设置了Burpsuite,并记录了一些失败的登录尝试,希望拦截流量并进行尝试。
las,我们没有成功。 该应用程序使用SOAP定向了所有请求,并且响应不明显。 但是,服务器将为该应用程序发布WSDL文档。
这还没有结束
为什么不编写伪造的Web服务,以使您无法再访问真实的应用程序服务器? 几个小时后,我们有了这样的服务,并且所有流量都已打开。 有效! 该应用程序已使用任何数据进行了身份验证,并已连接到假事件。
我们扫描了几个徽章,一切似乎都正常运行。 进步! 在应用程序中徘徊了一段时间后,很明显它正在使用某种基于WebView的框架。 在APK中挖掘一点,我们发现了许多提到Sencha和Ext.js的内容,这证实了我们的假设。
而现在-最有趣的。 如果应用程序由HTML和JavaScript的常规混合物组成,它是否容易受到标准Web攻击? 我们在应用程序期望的“非相当JSON”中包装了一些XSS,并对其进行了扫描,然后...
我们把它弄坏了
太好了! “ JT”字段中的HTML注入显示了图像。 我们可以向该标签添加“ onerror”属性以实现脚本的执行,但是我们受到QR码最大长度的限制。 结果,我们创建了一个有效负载,该有效负载从服务器下载了JS文件并在设备上运行了该文件。 例如,下面是标准的alert()测试:
扫描条形码会触发XSS并执行代码:
我们将其串起来,以使其恰好适合可读QR码的最大大小,而对于通过打印来说又不太密集。 阅读了Ext.js API的文档并将其与反编译的APK代码进行比较之后,我们能够制作出一个条形码,该条形码:
- 从远程服务器下载JS文件
- 从智能手机读取会话密钥并将其发送到我们的服务器
- 从应用程序读取缓存的联系人数据库的内容,包括此设备扫描过的所有通行证的名称和电子邮件地址
- 从智能手机删除录音
然后,攻击可归结为以下几点:供应商扫描我的QR码以换取免费笔,然后我获得了此设备扫描的所有联系人的完整列表。
有效负载:

对Web服务器的请求:

一切顺利,一切顺利
我们在展会上引起了供应商的注意,经过一番讨论,他们决定今年不使用该应用程序。 活动中只有少数人利用了该应用程序,而最喜欢的是简单的小型条形码扫描仪。 市场上的应用程序仅被下载了500次。 但是,这是XSS的一个有趣的向量,它表明您确实需要在使用前过滤数据,无论其来源如何。
尽管此特定应用程序尚未得到广泛使用,但可以想象该漏洞是存在于成千上万的应用程序中还是数百万下载的应用程序中? 所有这些数据都是针对那些可以酌情处置的攻击者:从网络钓鱼活动到暴力攻击。