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

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

缺陷编号:wooyun-2014-057076

漏洞标题:大汉网络JCMS覆盖全局配置文件漏洞

相关厂商:南京大汉网络有限公司

漏洞作者: 矿主

提交时间:2014-04-15 10:39

修复时间:2014-07-14 10:40

公开时间:2014-07-14 10:40

漏洞类型:设计缺陷/逻辑错误

危害等级:中

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

大汉网络JCMS恶意篡改,覆盖全局配置文件漏洞,范围广、危害大。

详细说明:

测试版本:Version 2010 2.4,其他版本似乎也存在此问题。范围很广。

clipboard.png

漏洞证明:

利用方式一:全局配置文件覆盖。
源文件/jcms/setup/opr_setting.jsp:

//程序开始执行,没有任何权限限制,直接能够访问。
String strRealPath = application.getRealPath("");
strRealPath = strRealPath.replace('\\','/');
jcms.sys.Install install = new jcms.sys.Install( strRealPath );
install.setMerpHome( );

//获取动态参数,没有任何过滤,直接传入参数。
String servername = Convert.getParameter( request,"servername");
String jndi = Convert.getParameter( request,"jndi");
String adminpwd = Convert.getParameter( request,"adminpwd");
String lucserver1 = Convert.getParameter( request,"lucserver1");
String rssserver1 = Convert.getParameter( request,"rssserver1");
String debug1 = "1"; //Convert.getParameter( request,"debug1");
......
//写merpserver.ini配置文件,直接对全局配置信息进行覆盖。
String iniPath = strRealPath + "/WEB-INF/ini/merpserver.ini";
boolean bl = false;
String strMsg = "";
com.hanweb.common.util.IniFile ini = new com.hanweb.common.util.IniFile( iniPath );
bl = ini.readIni();
if(bl){
ini.setIniValue("WebServer",servername);
ini.setIniValue("AppPath",jndi);
ini.setIniValue("DBType",dbtypename);
ini.setIniValue("AdminPW",adminpwd);
ini.setIniValue("loglevel",debug1);
ini.setIniValue("b_index",lucserver1);
ini.setIniValue("b_rss",rssserver1);
ini.setIniValue("publishfiletype",publishfiletype);
......
ini.writeIni();
strMsg = "alert('配置文件修改完成,请重新启动服务!');\n";


覆盖管理员密码,直接重置管理员密码。
源文件/jcms/setup/opr_login.jsp:

String iniPath = strRealPath + "/WEB-INF/ini/merpserver.ini";
com.hanweb.common.util.IniFile ini = new com.hanweb.common.util.IniFile( iniPath );
ini.readIni();
strNewPwd = ini.getIniValue("AdminPW");
//直接由全局配置文件,获取密码。通过覆盖全局配置中AdminPW的值,可以修改密码。
if( !user.trim().equals("admin"))
{ strMessage = "用户名不正确!"; }
else if( !pwd.trim().equals( strNewPwd.trim() ))
{ strMessage = "密码不正确!"; }
else { strMessage = "登陆成功!";


利用方式二,数据库信息覆盖。
访问:/jcms/setup/publishadmin.jsp

clipboard.png


写入相应配置后,提交到/setup/opr_publishsetting.jsp处理。
分析源码/jcms/setup/opr_publishsetting.jsp

<%@page import="com.hanweb.common.util.Convert"%>
<%@ page contentType="text/html;charset=UTF-8"%>
<%
//程序开始执行,没有任何权限限制,直接能够访问。
String strRealPath = application.getRealPath("");
jcms.sys.Install install = new jcms.sys.Install( strRealPath );
install.setMerpHome( );

//获取动态参数,没有任何过滤,直接传入参数。
String servername = Convert.getParameter( request,"servername");
String jndi = Convert.getParameter( request,"jndi");
String debug1 = Convert.getParameter( request,"debug1");
String dbtypename = Convert.getParameter( request,"dbtypename");
String dbtype = Convert.getParameter( request,"dbtype");
//写merpserver.ini配置文件,直接对数据库配置信息进行覆盖。
String iniPath = strRealPath + "/WEB-INF/ini/merpserver.ini";
com.hanweb.common.util.IniFile ini = new com.hanweb.common.util.IniFile( iniPath );
ini.readIni();
ini.setIniValue("WebServer",servername);
ini.setIniValue("AppPath",jndi);
ini.setIniValue("DBType",dbtypename);
ini.setIniValue("loglevel",debug1);
ini.writeIni();


至此,merpserver.ini被任意覆盖,服务器正常运行需要其中的配置,利用此漏洞,可导致网站瘫痪,或恶意篡改。

修复方案:

添加文件访问权限,系统安装部署后,自动删除默认安装文件。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2014-04-15 13:45

厂商回复:

感谢关注
此问题只涉及老版本的jcms2.4.10

最新状态:

暂无