1. 程式人生 > >Java命令注入之防護

Java命令注入之防護

1 Java中的命令注入

在Java中的Runtime.getRuntime本質就是使用ProcessBuilder,以ProcessBuilder裡用ProcessImpl,start 的一個子程序執行命令,

Java的native呼叫

a.Windows是CreateProcessW 建立子程序執行命令

b.Unix中以enecve 來建立子程序執行命令

Java並沒有使用system函式進行建立子程序執行命令,通常我們也知道system的函式非常容易發生注入風險,比如system(“ls “+”test;rm *”); 後面部分是使用者輸入的,使用者輸入通過注入符號;和後續指令rm *,被系統執行。

 execve, CreateProcessW 函式通過執行命令和引數分別傳遞的方式,這種方式杜絕了system的拼接命令的方式,有一定的安全性,但也未必是安全的。

1.1      引數直接用於命令執行

如果傳入的引數對原執行命令來說是用於執行的情況下,enecve, createprocessW無法防護

1.        Windows下的

cmd.exe /K 引數可以批量執行命令

String btype = request.getParameter("inputparam");
String cmds[] = {"cmd.exe","/K","\"C: &&del C:\\r2.txt”+btype+” &&del C:\\r1.txt \""};
System.Runtime.getRuntime().exec(cmds);

雖然此時傳入的引數是用於cmd.exe的,但因為cmd.exe 使用了/K引數,將後續傳入的引數用於命令執行,如果傳入&&del *,最後變成

cmd.exe /K “del C:\\test1.txt && del *&&del C:\\test2.txt”

2.        Unix 下的

  • /bin/bash 引數,輸入引數直接作為命令執行
String btype = request.getParameter("test");
String cmds[] = {"/bin/bash ","test.sh"+btype};
System.Runtime.getRuntime().exec(cmds);
傳入的引數作為bash直接執行的,此時如果作為引數傳入;rm *,最後等效於

/bin/bash test.sh;rm *

  • /bin/bash –c 引數,後續輸入引數為執行命令
String btype = request.getParameter("inputparam");
String cmds[] = {"/bin/bash ","-c","sh script.sh"+btype};
System.Runtime.getRuntime().exec(cmds);

此時傳入的引數是用於bash執行指令碼檔案的,但因為使用了-c引數,使後續傳入的引數用於命令執行,如果傳入;rm *,最後等效於

/bin/bash –c “sh script.sh; rm *”

上述的例子提示只要在實際應用過程中,傳入的引數(例如上例的sh script.sh;)是用於執行程式內部(例如sh -c,cmd.exe/k)執行命令的,execve,CreateProcessW函式就無法防護,此時用法等效於system(“sh script.sh;rm *”)函式

1.2       引數編碼

對用於常見的用於shell執行的符號進行轉碼,避免命令注入的風險

字元

功能描述

Unix

Windows

|

管道:連線上個指令的標準輸出,作為下個指令的標準輸入

\|

^|

;

連續指令服務

\;

^;

&

後臺執行

\&

^&

$

變數替換

\$

^$

重定向輸入

\>

^>

目標檔案內容傳送到命令中

\<

^<

`

返回當前執行結果

\`

^`

\

作為連線符號用,或者轉義用

\\

^\

!

執行上一條shell命令

\!

^!

例如:Unix 中

可以通過編碼方式,避免命令的注入

/bin/bash script.sh\;rm *

/bin/bash –c “sh script.sh\; rm *” 

  • 多字元需要轉義每個字元

比如:  >> 需要轉義成\>\>

  •   編碼方式的注意點:

編碼是指在呼叫函式之前需要對引數進行編碼,不需要多次編碼。

比如說在某個script.sh test.sh\;rm *裡面繼續還有命令呼叫,而這個命令是用引數傳入

sh $1

上述的解決方案並不是對test.sh;rm * 做兩次編碼,對script.sh來說傳入引數test.sh;rm *只需要做一次編碼,而在script.sh裡需要對輸入的引數$1在進行一次編碼,遵循誰呼叫誰編碼的原則。

1.3       引數過濾

  • 白名單保護

如果命令的引數是有特徵性的建議使用白名單對輸入的引數進行保護

比如允許[a-z][A-Z][0-9] _- 等有限的字元

  •  黑名單保護

a.      |;&$><`\! 可以將這些字元直接作為黑名單過濾

b.      \t\n\r\f \u0000 這些字元需要作為黑名單過濾,特別是空字元截斷 \u0000 (這個在JVM6裡是沒有保護)


相關推薦

Java命令注入防護

1 Java中的命令注入 在Java中的Runtime.getRuntime本質就是使用ProcessBuilder,以ProcessBuilder裡用ProcessImpl,start 的一個子程序執行命令, Java的native呼叫 a.Windows是CreateP

每天一個linxu命令6jps ?查看java進程的端口

div mach 導致 ont virt tac jvm 信息 路徑名 jps -- Java Virtual Machine Process Status Tool 可以列出本機所有Java進程的pid jps [ options ] [ hostid ] 選項 -q

Java命令學習系列jmap

.com respond 標識 config 一個bug running vivo huang 父類 jmap是JDK自帶的工具軟件,主要用於打印指定Java進程(或核心文件、遠程調試服務器)的共享對象內存映射或堆內存細節。可以使用jmap生成Heap Dump。 什麽

Java命令學習系列jstack

數據庫 get image for 線程調度 nbsp 額外 無限 其他 jstack是java虛擬機自帶的一種堆棧跟蹤工具。 功能 jstack用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主

Java逆向基礎AspectJ的ajc與aj5命令

java aspectj ajc acj命令是用於編譯java文件和aj文件的編譯器,相當於eclipse的編譯器(ECJ)+aspectj運行時擴展aj5命令在jdk1.5上使用-javaagent:pathto/aspectjweaver.jar加載aspectj程序,達到修改字節碼的目的這兩

Java IO流 File 鍵盤命令行實例

name new comm ann edi delet HR lse ted http://www.verejava.com/?id=17160055387849 import java.io.File; import java.util.Scanner; public

java設計模式命令模式

int aud 按鍵 設計 oid 定義 bsp class 命令 命令模式:   對命令的封裝,把發出命令的責任和執行命令的責任分割開,委派給不同的對象。 命令模式涉及到五個角色: 客戶端(CommandMain)角色:創建一個具體命令並確定接收者(觸發錄音機按

Web 安全漏洞 OS 命令注入

什麼是 OS 命令注入 上週我們分享了一篇 《Web 安全漏洞之 SQL 注入》,其原理簡單來說就是因為 SQL 是一種結構化字串語言,攻擊者利用可以隨意構造語句的漏洞構造了開發者意料之外的語句。而今天要講的 OS 命令注入其實原理和 SQL 注入是類似的,只是場景不一樣而已。OS 注入攻擊是指程式提供了直

Java分析系列三:jstat命令的使用及VM Thread分析

前面提到了一個使用jstack的shell指令碼,通過命令可以很快地定位到指定執行緒對應的堆疊資訊。 目錄 [隱藏] 1 使用jstat命令 2 JVM記憶體模型 3 JVM記憶體引數設定 3.1 堆記憶體設定 3.2 非堆記憶體設定

Java 設計模式命令模式

本文為筆者學習《Head First設計模式》的筆記,並加入筆者自己的理解和歸納總結 命令模式將“請求”封裝成物件,以便使用不同的請求、佇列或者日誌來引數化其他物件。命令模式也支援可撤銷的操作。 結構圖 遙控器(RemoteControl)通過命令(Command)控制燈的開關

Java設計模式從[打飛機遊戲中的控制器]分析命令(Command)模式

  首先請允許我囉嗦幾句。為什麼我們在軟體設計過程中強調設計模式?為軟體增加設計模式確實會增加一定的程式碼複雜程度,但是它的好處是無窮的。它可以使得軟體更加易於擴充套件而無需改變原始碼。“解耦”是設計模式中的一個關鍵詞。例如,對於某個物件obj,在呼叫obj.method(

《11招玩轉網路安全》第五招:DVWA命令注入

首先還是將DVWA的安全級別設定為Low,然後單擊DVWA頁面左側的Command Injection按鈕。 圖5-1  Low級別的命令注入 這個就是最典型的命令注入介面。在文字框中輸入一個IP地址,然後返回ping命令的結果,單擊頁面右下角的View Source

Java命令javap初探

javap是jdk自帶的一個工具在jdk安裝目錄的/bin下面可以找到,可以對程式碼反編譯,也可以檢視java編譯器生成的位元組碼,對程式碼的執行過程進行分析,瞭解jvm內部的工作。 下面列舉javap命令的常用options及其功能描述,更多功能的使

java高分局jps命令使用

jps 顯示指定系統內所使用的HotSpot虛擬機器程序 常用引數 -q 只輸出LVMID,省略主類的名稱 -m 輸出虛擬機器程序啟動時傳遞給主類main()函式的引數 -l 輸出主類

java高分局jmap命令使用

jmap 命令用於生產堆轉儲快照 jhat 虛擬機器堆轉儲快照分析工具,jhat內建了一個微型的HTTP/HTML伺服器。 C:\Users\Administrator>jmap -dump:

Java爬蟲技術繞過百度雲防護抓取網站內容

大家好,我是Coody最近做文章採集,碰到一個有經過百度雲加速的網站,由於開啟瀏覽器需要安全檢查,所以針對相關機制做了一下研究,故此封裝了一個HTTP工具。 本文已釋出之開源中國,由於csdn使用者量巨大且易於搜尋引擎收錄,故此分享出來希望對特定的友友有所幫助。 直接貼

java設計模式——策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式(行為型)【讀書筆記】

一、策略模式           定義:定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到演算法的客戶。           使用場景:策略模式是一種定義一系列演算法的方法,從概念上看,所有的這些演算法完成的都是相同的工作,只是實現不

java高分局jstatc命令使用

jstack(stack trace for java)命令使用者生成虛擬機器當前時刻的執行緒快照(一般稱為threaddump或者javacore檔案)。生成快照的主要目的是定位執行緒出現長時間停頓的原因,如執行緒間死鎖、死迴圈、請求外度資源導致的長時間的等待

Java命令列程式構建工具airlift使用分組(group)

閒話少說,直接上程式碼: package com.ilucky.druid.airlift.test2; import java.util.Arrays; import io.airlift.ai

14.java設計模式命令模式

#### 基本需求: * 一套智慧家電,有照明燈、風扇、冰箱、洗衣機,我們只要在手機上安裝app就可以控制對這些家電工作 * 這些智慧家電來自不同的廠家,我們不想針對每一種家電都安裝一個App分別控制,我們希望只要一個app就可以控制全部智慧家電 * 要實現一個app控制所有智慧家電的需要,則每個智慧家電廠