白帽故事 · 2021年8月10日 0

一款公共交通票务移动APP的XXE漏洞

这是一次国外漏洞赏金计划,漏洞挖掘的目标是一款票务Android应用程序,这款应用程序是一款公共交通票务应用程序,公司的总部设在德国以外。

在登录Android应用程序并检查账户设置后,我看到了一个“更改我的数据”选项,

点击后,可进行个人信息修改:

当保存数据时,我发现了以下发往服务器的请求数据:

请求的数据格式类似062.6.26#{some long data}. 这看起来非常有趣,然后我将{some long data}这些数据发往了Decoder尝试解码,解码器很快的识别出这些数据是经过了Bas64的编码格式,经过解码的数据是一段XML信息:

太棒了!紧接着我开始构造XXE Payload:

xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///etc/passwd">]>

构造后的数据包像下面这个样子:

然后就是对这段数据重新进行Base64编码:

通过替换了原始请求中数据包,并重新发送至服务器,成功获取到了服务器端的/etc/passwd内容:

由于该APP应用程序使用的是Java语言,我甚至还可以使用下面的Payload列出服务器文件目录:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY>
<!ENTITY xxe SYSTEM "file://">]>

我的主要目的是尝试寻找SSH私钥,但出于好奇心,我随手尝试了获取/etc/shadow内容,令我震惊的是,它成功“回显”了!从服务器的响应数据可以清楚地看到我是以root用户身份运行的:

最终我在/home/user/.ssh/目录下发现了SSH私钥,这也意味着我可以在系统上执行完整的RCE,但是漏洞赏金计划不允许这么做,因此我没有尝试,同时停止了我的测试并报告了该漏洞。

这是一篇国外漏洞赏金计划的Writeup,经由骨哥翻译并整理,如要查看原文,可通过点击下方“阅读原文”跳转查看。

====正文结束====