文章作者:rebeyond
受影响版本:v6~v7
漏洞说明:
JEECMS是国内Java版开源网站内容管理系统(java cms、jsp cms)的简称。该系统基于java技术开发,继承其强大、稳定、安全、高效、跨平台等多方面的优点;采用SpringMVC3+Spring3+Hibernate3+Freemarker主流技术架构。广泛应用于政府(部委和省级政府部门、市、县、乡及委办局)、教育科研(大、中、小学及各地方教育局)、电信运营商、金融(证券、保险及银行)、企业(矿业、煤炭、旅游、石油集团及大中型制造类企业)、新闻媒体(报社、网媒)等数字化信息平台建设领域。
该系统提供上传功能,其中对用户提交的上传文件没有进行充分的检查,导致任意注册用户在前台即可上传任意格式的文件。
利用场景:前台注册用户。默认注册地址:http://xxx.com/register.jspx。
漏洞分析:
JEECMS的安全一向口碑不错,前段时间曝光过一个任意文件上传漏洞,利用的是\00截断,之后的版本添加了对文件名是否含\00的判断,如下图所示,修复了该问题。
但是另外一个上传组件提供了一个拉取远程图片的功能,该组建并没有对远程文件的类型进行足够的判断,导致用户可以从远程拉取任意格式的文件,下面看代码:
远程文件的url直接由客户端的upfile参数传入,之后以ue_separate_ue为分隔符来进行分割,之后直接调用saveRemoteImage函数,下面跟进saveRemoteImage函数:
该函数直接调用HttpClient类建立连接,读取字节流,然后通过UploadUtils.generateFilename来获取保存路径,此处只用Apache的FileNameUtils.getFileSufix方法来获取扩展名,没有进行任何验证。最后通过IOUtils.copy完成文件的创建。
漏洞演示:
漏洞原理了解之后,下面就好办了,先本地假设个环境:
通过构造如下的表单,来进行提交:
访问返回的URL,文件成功上传:
通过谷歌搜索powered by jeecms,共7万多个结果: