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

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

缺陷编号:wooyun-2016-0198158

漏洞标题:泛微ecology无需登录SQL注入2+任意文件读取

相关厂商:上海泛微网络科技股份有限公司

漏洞作者: Chora

提交时间:2016-04-19 15:31

修复时间:2016-07-19 09:50

公开时间:2016-07-19 09:50

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-04-19: 细节已通知厂商并且等待厂商处理中
2016-04-20: 厂商已经确认,细节仅向厂商公开
2016-04-23: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2016-06-14: 细节向核心白帽子及相关领域专家公开
2016-06-24: 细节向普通白帽子公开
2016-07-04: 细节向实习白帽子公开
2016-07-19: 细节向公众公开

简要描述:

虽然没有源码,但是可以通过反编译审计源代码,且代码不严谨出现了漏洞。

详细说明:

这次出现在SignatureDownLoad类上面。片段如下:

public class SignatureDownLoad
extends HttpServlet
{
public void doGet(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse)
throws ServletException, IOException
{
String str1 = Util.getFileidIn(Util.null2String(paramHttpServletRequest.getParameter("markId"))); //getFileidIn函数就是返回原来传递的字符串,Util.null2String只是处理了null。
String str2 = Util.null2String(paramHttpServletRequest.getParameter("download"));
...
ConnStatement localConnStatement = new ConnStatement();
try
{
String str8 = "select markPath from DocSignature where markId = " + str1; //可控

boolean bool = localConnStatement.getDBType().equals("oracle");
localConnStatement.setStatementSql(str8); //带入查询
localConnStatement.executeQuery();
if (localConnStatement.next())
{
str5 = Util.null2String(localConnStatement.getString("markPath")); //可以通过union控制结果,从而控制markPath,即str5可控。
BufferedInputStream localBufferedInputStream = null;

str3 = "application/octet-stream";

paramHttpServletResponse.setHeader("content-disposition", "attachment; filename=markPicture.jpg");

System.out.println("realPath:" + str5);
if (str5.equals(""))
{
if (bool) {
localBufferedInputStream = new BufferedInputStream(localConnStatement.getBlobBinary("imagefile"));
} else {
localBufferedInputStream = new BufferedInputStream(localConnStatement.getBinaryStream("imagefile"));
}
}
else //如果str5不等于空
{
localObject1 = new File(str5); //可以控制str5,既可以引入任何路径。
if (str6.equals("1"))
{
ZipInputStream localZipInputStream = new ZipInputStream(new FileInputStream((File)localObject1));
if (localZipInputStream.getNextEntry() != null) {
localBufferedInputStream = new BufferedInputStream(localZipInputStream);
}
}
else
{
localBufferedInputStream = new BufferedInputStream(new FileInputStream((File)localObject1));
}
}
Object localObject1 = paramHttpServletResponse.getOutputStream();
paramHttpServletResponse.setContentType(str3);
int i;
while ((i = localBufferedInputStream.read(arrayOfByte)) != -1) //读取
{
((OutputStream)localObject1).write(arrayOfByte, 0, i); //写入
((OutputStream)localObject1).flush();
}
localBufferedInputStream.close();
((OutputStream)localObject1).flush();
((OutputStream)localObject1).close();
}
}
catch (Exception localException)
{
BaseBean localBaseBean = new BaseBean();
localBaseBean.writeLog(localException);
}
finally
{
localConnStatement.close();
}
}
}


可以看到markId未做任何过滤导致了SQL注入,并且通过union可以形成另外一个漏洞,即任意文件读取。

漏洞证明:

0.png

1.png

修复方案:

过滤。

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2016-04-20 09:48

厂商回复:

官方已经发布安全补丁修复漏洞,谢谢提交!

最新状态:

暂无


漏洞评价:

评价

  1. 2016-04-19 15:33 | sysALong ( 普通白帽子 | Rank:498 漏洞数:111 | 在我们黑龙江这噶哒,就没有什么事是【撸串...)

    今天刚买了一个通用的微饭的。。。。唉。。不能唠嗑了,默默无语两眼泪.

  2. 2016-04-19 18:03 | 从容 ( 普通白帽子 | Rank:415 漏洞数:99 | 别摸我,我怕热…… | Tr3jer@Gmail.com ...)

    表哥牛逼

  3. 2016-04-19 19:55 | 玉林嘎 认证白帽子 ( 普通白帽子 | Rank:956 漏洞数:109 )

    牛逼

  4. 2016-04-19 20:57 | onpu ( 普通白帽子 | Rank:396 漏洞数:68 )

    牛逼