欢迎来到 无奈人生 安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Play框架任意文件读取漏洞

来源: 作者: 时间:2019-02-24 19:29 点击: 我要投稿
广告位API接口通信错误,查看德得广告获取帮助

简介
360 Redteam在研究区块链项目过程中,发现某区块链项目API使用了Play Framework框架进行构建网站,我们对该框架进行审计后发现一处通用型漏洞,该框架处理静态文件资源路径不当,在Windows环境下可导致任意文件读取漏洞。
Play Framework是一个开源Star10k+的Web应用框架,使用Scala和Java语言混合编写。该框架具有可扩展、资源消耗低等特点。我们发现该框架涵盖客户人群包括游戏公司EA、领英、沃尔玛、三星等多家知名公司。同时我们发现部分区块链钱包项目中也使用到了该框架,该漏洞可能会导致窃取钱包秘钥等问题。
 
漏洞编号
CVE-2018-13864
 
发现团队
360 RedTeam & 0keeTeam
 
影响范围
Play Framework 2.6.12-2.6.15
 
漏洞详情
首先我们在Play Framework的 routes 文件中可以看到静态资源解析路由的配置信息
# Map static resources from the /public folder to the /assets URL path GET /assets/*file controllers.Assets.at(path="/public", file)
该路由调用 controllers.Assets.at 函数将 /assets/* 指向文件目录 /public ,即可解析该目录中的CSS、JS文件等。跟踪controllers.Assets.at 函数
漏洞文件:/framework/src/play/src/main/scala/play/api/controllers/Assets.scala

跟踪 assetAt 函数

这里使用 resourceNameAt 函数获取标准化的文件名,跟踪该函数

resourceNameAt 函数首先会将文件路径进行URL解码,然后将 path 与 decodedFile进行拼接然后通过 removeExtraSlashes 函数将双斜杠//替换成单斜杠/,拿到最终的绝对路径。
但是后面有路径标准化判断,会判断文件路径标准化后的前缀是否为 /public/ ,跟踪一下 fileLikeCanonicalPath 函数看看都干了什么

该函数中以“/”为分隔符将路径进行分隔,然后对数组进行遍历,如果碰到“..”就删除前一个数组元素,达到标准化路径

既然代码中是以“/”分隔,在Windows环境中,我们可以使用反斜杠“\”进行绕过,这样不会删掉前面目录,达到跨目录的效果,而且前缀依然是 /public/,满足标准化路径的判断。
我们发现在Scala版与Java版均受该漏洞影响。
 
漏洞利用
我们在官网下载了Scala版的聊天室Demo(https://github.com/playframework/play-scala-chatroom-example/tree/2.6.x),在Windows下使用sbt运行该源码。

抓取一个静态文件,然后找到项目编译后对应的文件路径

构造payload,读取项目目录中的 build.sbt 文件试试,这个文件正常是访问不到的。

400报错,查了一下发现是akka http不允许特殊符号,那我们进行URL编码

成功跨目录读取到了其他文件。
 
修复方案
升级到Playframework >=2.6.16版本
 
时间线
2018-07-10 360 Redteam报告Playframework官方人员2018-07-11 Playframework官方确认漏洞2018-07-17 Playframework发布2.6.16版本,修复此漏洞
 
参考链接
https://www.playframework.com/security/vulnerability/CVE-2018-13864-PathTraversal
 

简介
360 Redteam在研究区块链项目过程中,发现某区块链项目API使用了Play Framework框架进行构建网站,我们对该框架进行审计后发现一处通用型漏洞,该框架处理静态文件资源路径不当,在Windows环境下可导致任意文件读取漏洞。
Play Framework是一个开源Star10k+的Web应用框架,使用Scala和Java语言混合编写。该框架具有可扩展、资源消耗低等特点。我们发现该框架涵盖客户人群包括游戏公司EA、领英、沃尔玛、三星等多家知名公司。同时我们发现部分区块链钱包项目中也使用到了该框架,该漏洞可能会导致窃取钱包秘钥等问题。
 
漏洞编号
CVE-2018-13864
 
发现团队
360 RedTeam & 0keeTeam
 
影响范围
Play Framework 2.6.12-2.6.15
 
漏洞详情
首先我们在Play Framework的 routes 文件中可以看到静态资源解析路由的配置信息
# Map static resources from the /public folder to the /assets URL path GET /assets/*file controllers.Assets.at(path="/public", file)
该路由调用 controllers.Assets.at 函数将 /assets/* 指向文件目录 /public ,即可解析该目录中的CSS、JS文件等。跟踪controllers.Assets.at 函数 www.wnhack.com
漏洞文件:/framework/src/play/src/main/scala/play/api/controllers/Assets.scala

跟踪 assetAt 函数

这里使用 resourceNameAt 函数获取标准化的文件名,跟踪该函数

resourceNameAt 函数首先会将文件路径进行URL解码,然后将 path 与 decodedFile进行拼接然后通过 removeExtraSlashes 函数将双斜杠//替换成单斜杠/,拿到最终的绝对路径。
但是后面有路径标准化判断,会判断文件路径标准化后的前缀是否为 /public/ ,跟踪一下 fileLikeCanonicalPath 函数看看都干了什么

内容来自无奈安全网

该函数中以“/”为分隔符将路径进行分隔,然后对数组进行遍历,如果碰到“..”就删除前一个数组元素,达到标准化路径

既然代码中是以“/”分隔,在Windows环境中,我们可以使用反斜杠“\”进行绕过,这样不会删掉前面目录,达到跨目录的效果,而且前缀依然是 /public/,满足标准化路径的判断。
我们发现在Scala版与Java版均受该漏洞影响。
 
漏洞利用
我们在官网下载了Scala版的聊天室Demo(https://github.com/playframework/play-scala-chatroom-example/tree/2.6.x),在Windows下使用sbt运行该源码。

抓取一个静态文件,然后找到项目编译后对应的文件路径
本文来自无奈人生安全网
构造payload,读取项目目录中的 build.sbt 文件试试,这个文件正常是访问不到的。

400报错,查了一下发现是akka http不允许特殊符号,那我们进行URL编码

成功跨目录读取到了其他文件。
 
修复方案
升级到Playframework >=2.6.16版本
 
时间线
2018-07-10 360 Redteam报告Playframework官方人员2018-07-11 Playframework官方确认漏洞2018-07-17 Playframework发布2.6.16版本,修复此漏洞
 
参考链接
https://www.playframework.com/security/vulnerability/CVE-2018-13864-PathTraversal
  无奈人生安全网

。 (责任编辑:admin)
【声明】:无奈人生安全网(http://www.wnhack.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱472701013@qq.com,我们会在最短的时间内进行处理。