### 简要描述:
大汉网络JCMS恶意篡改,覆盖全局配置文件漏洞,范围广、危害大。
### 详细说明:
测试版本:Version 2010 2.4,其他版本似乎也存在此问题。范围很广。
[<img src="https://images.seebug.org/upload/201404/14212023273f541dff350aa868c5a63744691412.png" alt="clipboard.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201404/14212023273f541dff350aa868c5a63744691412.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
[<img src="https://images.seebug.org/upload/201404/1421423291b1cff25b6351a48f2ea11248576b69.png" alt="clipboard.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201404/1421423291b1cff25b6351a48f2ea11248576b69.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被任意覆盖,服务器正常运行需要其中的配置,利用此漏洞,可导致网站瘫痪,或恶意篡改。
暂无评论