輸入驗證和表示法問題是由中繼字元、替代編碼和數值表示法引起的。信任輸入會導致安全問題。問題包括:「Buffer Overflows」、「Cross-Site Scripting」攻擊、「SQL Injection」及其他許多問題。
APPHOME
來決定目錄的安裝位置,並且根據指定目錄的相對路徑來執行初始化 Script。
...
CALL FUNCTION 'REGISTRY_GET'
EXPORTING
KEY = 'APPHOME'
IMPORTING
VALUE = home.
CONCATENATE home INITCMD INTO cmd.
CALL 'SYSTEM' ID 'COMMAND' FIELD cmd ID 'TAB' FIELD TABL[].
...
Example 1
中的程式碼允許攻擊者藉由修改登錄金鑰 APPHOME
,來指向包含惡意版本的 INITCMD
的其他路徑,運用提升的應用程式權限來執行任意指令。因為程式不會驗證從登錄中讀取的值,所以如果攻擊者可以控制登錄金鑰 APPHOME
的值,那麼他們就可以欺騙應用程式去執行惡意程式碼並取得對系統的控制。rman
公用程式周圍的批次檔包裝函式來開始 Oracle 資料庫備份,並接著執行 cleanup.bat
Script 來刪除一些暫存檔案。Script rmanDB.bat
會接受單一指令行參數,其中指定了要執行的備份類型。因為存取資料庫是受限制的,所以應用程式需具有較高權限的使用者來執行備份。
...
btype = request->get_form_field( 'backuptype' )
CONCATENATE `/K 'c:\\util\\rmanDB.bat ` btype `&&c:\\util\\cleanup.bat'` INTO cmd.
CALL FUNCTION 'SXPG_COMMAND_EXECUTE_LONG'
EXPORTING
commandname = cmd_exe
long_params = cmd_string
EXCEPTIONS
no_permission = 1
command_not_found = 2
parameters_too_long = 3
security_risk = 4
OTHERS = 5.
...
backuptype
參數進行任何驗證。通常 SXPG_COMMAND_EXECUTE_LONG
函數模組不會執行多重指令,但在此例中,程式首先執行 cmd.exe
shell,以在單一呼叫 CALL 'SYSTEM'
時執行多重指令。一旦叫用 Shell,Shell 就會允許執行多個由兩個 & 分隔的指令。如果攻擊者傳遞一個 "&& del c:\\dbms\\*.*"
形式的字串,那麼應用程式將會執行這個指令以及由此程式指定的其他指令。因為此應用程式本質的關係,所以應用程式必須要有權限才可與資料庫互動,這表示攻擊者插入的所有指令也都會使用這些權限進行運作。/var/yp
目錄下執行 make
指令。
...
MOVE 'make' to cmd.
CALL 'SYSTEM' ID 'COMMAND' FIELD cmd ID 'TAB' FIELD TABL[].
...
CALL 'SYSTEM'
呼叫前清除它的環境變數。如果攻擊者能夠修改 $PATH
變數,指向名為 make
的惡意二進位碼,並使得程式在它們的環境中執行,那麼程式會載入此惡意的二進位碼,代替原來的程式碼。由於應用程式的特性,它需要特定的權限才能執行系統作業,這表示攻擊者的 make
將會在這些權限下執行,攻擊者可能會完全控制系統。
...
var fs:FileStream = new FileStream();
fs.open(new File(String(configStream.readObject())+".txt"), FileMode.READ);
home = String(fs.readObject(home));
var cmd:String = home + INITCMD;
fscommand("exec", cmd);
...
Example 1
中的程式碼允許攻擊者藉由修改組態設定檔案 configStream
的內容來指向包含惡意版本的 INITCMD
的其他路徑,藉此運用提升的應用程式權限來執行任意指令。因為程式不會驗證從檔案中讀取的值,所以如果攻擊者可以控制該值,他們就可以欺騙應用程式去執行惡意程式碼並控制系統。rman
公用程式周圍的批次檔包裝函式來開始 Oracle 資料庫備份,並接著執行 cleanup.bat
Script 來刪除一些暫存檔案。Script rmanDB.bat
會接受單一指令行參數,其中指定了要執行的備份類型。因為存取資料庫是受限制的,所以應用程式需具有較高權限的使用者來執行備份。
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var btype:String = String(params["backuptype"]);
var cmd:String = "cmd.exe /K \"c:\\util\\rmanDB.bat " + btype + "&&c:\\util\\cleanup.bat\"";
fscommand("exec", cmd);
...
backuptype
參數進行任何驗證。通常 fscommand()
函數不會執行多重指令,但在此例中,程式首先執行 cmd.exe
shell,以在單一呼叫 fscommnd()
時執行多重指令。一旦叫用 Shell,Shell 就會允許執行多個由兩個 & 分隔的指令。如果攻擊者傳遞一個 "&& del c:\\dbms\\*.*"
形式的字串,那麼應用程式將會執行這個指令以及由此程式指定的其他指令。因為此應用程式本質的關係,所以應用程式必須要有權限才可與資料庫互動,這表示攻擊者插入的所有指令也都會使用這些權限進行運作。/var/yp
目錄下執行 make
指令。
...
fscommand("exec", "make");
...
fscommand()
呼叫前清除它的環境變數。如果攻擊者能夠修改 $PATH
變數,指向名為 make
的惡意二進位碼,並使得程式在它們的環境中執行,那麼程式會載入此惡意的二進位碼,代替原來的程式碼。由於應用程式的特性,它需要特定的權限才能執行系統作業,這表示攻擊者的 make
將會在這些權限下執行,攻擊者可能會完全控制系統。APPHOME
來決定其安裝目錄,並且根據指定目錄的相對路徑來執行初始化 Script。
...
string val = Environment.GetEnvironmentVariable("APPHOME");
string cmd = val + INITCMD;
ProcessStartInfo startInfo = new ProcessStartInfo(cmd);
Process.Start(startInfo);
...
Example 1
中的程式碼允許攻擊者藉由修改系統屬性 APPHOME
,來指向包含惡意版本的 INITCMD
的其他路徑,運用提升的應用程式權限來執行任意指令。因為程式不會驗證從環境中讀取的值,所以如果攻擊者可以控制系統屬性 APPHOME
的值,那麼他們就可以欺騙應用程式去執行惡意程式碼並取得對系統的控制。rman
公用程式周圍的批次檔包裝函式來開始 Oracle 資料庫備份,並接著執行 cleanup.bat
Script 來刪除一些暫存檔案。Script rmanDB.bat
會接受單一指令行參數,其中指定了要執行的備份類型。因為存取資料庫是受限制的,所以應用程式需具有較高權限的使用者來執行備份。
...
string btype = BackupTypeField.Text;
string cmd = "cmd.exe /K \"c:\\util\\rmanDB.bat"
+ btype + "&&c:\\util\\cleanup.bat\""));
Process.Start(cmd);
...
BackupTypeField
進行任何驗證。通常 Process.Start()
函數不會執行多重指令,但在此例中,程式首先執行 cmd.exe
shell,以在單一呼叫 Process.Start()
時執行多重指令。一旦叫用 Shell,Shell 就會允許執行多個由兩個 & 分隔的指令。如果攻擊者傳遞一個 "&& del c:\\dbms\\*.*"
形式的字串,那麼應用程式將會執行這個指令以及由此程式指定的其他指令。因為此應用程式本質的關係,所以應用程式必須要有權限才可與資料庫互動,這表示攻擊者插入的所有指令也都會使用這些權限進行運作。update.exe
指令,如下所示:
...
Process.Start("update.exe");
...
Process.start()
呼叫前清除它的環境變數。如果攻擊者能夠修改 $PATH
變數,指向名為 update.exe
的惡意二進位碼,並使得程式在它們的環境中執行,那麼程式會載入此惡意的二進位碼,代替原來的程式碼。由於應用程式的特性,它需要特定的權限才能執行系統作業,這表示攻擊者的 update.exe
將會在這些權限下執行,攻擊者可能會完全控制系統。setuid root
安裝的,因為這個程式的意圖是作為一個學習工具來使用,以便讓那些仍在培訓中的系統管理員查看各權限的系統檔,而不給他們篡改權限,或者損壞系統的能力。
int main(char* argc, char** argv) {
char cmd[CMD_MAX] = "/usr/bin/cat ";
strcat(cmd, argv[1]);
system(cmd);
}
root
的權限來執行,所以 system()
的呼叫也以 root
的權限來執行。如果使用者指定了一個標準的檔案名稱,那麼呼叫就能如預期般執行。但是,如果攻擊者傳遞 ";rm -rf /"
形式的字串,則對 system()
的呼叫會由於缺少引數而無法執行 cat
,然後以遞迴方式刪除根分割的內容。$APPHOME
來決定應用程式的安裝目錄,並在該目錄中執行初始化指令碼。
...
char* home=getenv("APPHOME");
char* cmd=(char*)malloc(strlen(home)+strlen(INITCMD));
if (cmd) {
strcpy(cmd,home);
strcat(cmd,INITCMD);
execl(cmd, NULL);
}
...
Example 1
所述,這個範例中的程式碼提升了應用程式的權限,允許攻擊者隨意執行任何指令。在此範例中,攻擊者可能修改環境變數 $APPHOME
來指定包含 INITCMD
惡意版本的不同路徑。由於程式不會驗證從環境讀取的值,透過控制該環境變數,攻擊者可能欺騙應用程式執行惡意程式碼。/var/yp
目錄中執行 make
。注意,程式更新密碼記錄後,就已按照 setuid root
進行安裝了。make
:
system("cd /var/yp && make &> /dev/null");
system()
的引數。但是,由於程式沒有指定 make
的絕對路徑,而且沒有在叫用指令之前清除任何環境變數,因此攻擊者可能修改他們的 $PATH
變數,以指向名為 make
的惡意二進位碼,並從 shell 提示執行 CGI 指令碼。而且因為程式是按照 setuid root
安裝的,所以攻擊者的 make
版本現在會以 root
權限執行。_spawn()
系列中的一個函數來叫用 CreateProcess()
時,如果執行檔或路徑中包含空格,請務必小心。
...
LPTSTR cmdLine = _tcsdup(TEXT("C:\\Program Files\\MyApplication -L -S"));
CreateProcess(NULL, cmdLine, ...);
...
CreateProcess()
剖析空格的方式,作業系統嘗試執行的第一個執行檔會是 Program.exe
,而不是 MyApplication.exe
。所以,如果攻擊者能夠在系統上安裝名為 Program.exe
的惡意應用程式,任何會使用 Program Files
目錄不正確呼叫 CreateProcess()
的程式將會執行此應用程式,而不會執行原本所要執行的應用程式。system()
、exec()
和 CreateProcess()
這類的函數,可利用程式呼叫這些函數的環境,因此攻擊者會有機會去影響這些呼叫的運作情況。$PATH
或程式執行環境的其他層面,使用程式來執行惡意二進位檔案。/var/yp
目錄中執行 make
。注意,程式更新密碼記錄後,就已按照 setuid root
進行安裝了。make
:
MOVE "cd /var/yp && make &> /dev/null" to command-line
CALL "CBL_EXEC_RUN_UNIT" USING command-line
length of command-line
run-unit-id
stack-size
flags
CBL_EXEC_RUN_UNIT
的引數。但是,由於程式沒有為 make
指定絕對路徑,並且在叫用該指令之前未清除其環境變數,因此攻擊者可將 $PATH
變數修改為指向名為 make
的惡意二進位檔案,並透過 Shell 提示執行 CGI 指令碼。另外,由於程式已按照 setuid root
進行安裝,因此攻擊者的 make
版本現在能利用 root
權限來執行。pdfprint
指令列印的檔案。
DISPLAY "TEMP" UPON ENVIRONMENT-NAME
ACCEPT ws-temp-dir FROM ENVIRONMENT-VARIABLE
STRING "pdfprint " DELIMITED SIZE
ws-temp-dir DELIMITED SPACE
"/" DELIMITED SIZE
ws-pdf-filename DELIMITED SPACE
x"00" DELIMITED SIZE
INTO cmd-buffer
CALL "SYSTEM" USING cmd-buffer
pdfprint
指定絕對路徑,因此攻擊者可將 $PATH
變數修改為指向惡意二進位檔案。此外,儘管 DELIMITED SPACE
片語會防止 ws-temp-dir
和 ws-pdf-filename
中嵌入空格,但其中的任何一個都可以嵌入 shell 中繼字元 (例如 &&
)。cmd
要求參數指定任意指令。
...
<cfset var="#url.cmd#">
<cfexecute name = "C:\windows\System32\cmd.exe"
arguments = "/c #var#"
timeout = "1"
variable="mycmd">
</cfexecute>
...
APPHOME
來決定目錄的安裝位置,並且根據指定目錄的相對路徑來執行初始化 Script。
...
final cmd = String.fromEnvironment('APPHOME');
await Process.run(cmd);
...
Example 1
中的程式碼允許攻擊者藉由修改系統屬性 APPHOME
,來指向包含惡意版本的 INITCMD
的其他路徑,運用提升的應用程式權限來執行任意指令。因為程式不會驗證從環境中讀取的值,所以如果攻擊者可以控制系統屬性 APPHOME
的值,那麼他們就可以欺騙應用程式去執行惡意程式碼並取得對系統的控制。
cmdName := request.FormValue("Command")
c := exec.Command(cmdName)
c.Run()
APPHOME
來決定目錄的安裝位置,並且根據指定目錄的相對路徑來執行初始化 Script。
...
String home = System.getProperty("APPHOME");
String cmd = home + INITCMD;
java.lang.Runtime.getRuntime().exec(cmd);
...
Example 1
中的程式碼允許攻擊者藉由修改系統屬性 APPHOME
,來指向包含惡意版本的 INITCMD
的其他路徑,運用提升的應用程式權限來執行任意指令。因為程式不會驗證從環境中讀取的值,所以如果攻擊者可以控制系統屬性 APPHOME
的值,那麼他們就可以欺騙應用程式去執行惡意程式碼並取得對系統的控制。rman
公用程式周圍的批次檔包裝函式來開始 Oracle 資料庫備份,並接著執行 cleanup.bat
Script 來刪除一些暫存檔案。Script rmanDB.bat
會接受單一指令行參數,其中指定了要執行的備份類型。因為存取資料庫是受限制的,所以應用程式需具有較高權限的使用者來執行備份。
...
String btype = request.getParameter("backuptype");
String cmd = new String("cmd.exe /K
\"c:\\util\\rmanDB.bat "+btype+"&&c:\\util\\cleanup.bat\"")
System.Runtime.getRuntime().exec(cmd);
...
backuptype
參數進行任何驗證。通常 Runtime.exec()
函數不會執行多重指令,但在此例中,程式首先執行 cmd.exe
shell,以在單一呼叫 Runtime.exec()
時執行多重指令。一旦叫用 Shell,Shell 就會允許執行多個由兩個 & 分隔的指令。如果攻擊者傳遞一個 "&& del c:\\dbms\\*.*"
形式的字串,那麼應用程式將會執行這個指令以及由此程式指定的其他指令。因為此應用程式本質的關係,所以應用程式必須要有權限才可與資料庫互動,這表示攻擊者插入的所有指令也都會使用這些權限進行運作。/var/yp
目錄下執行 make
指令。
...
System.Runtime.getRuntime().exec("make");
...
Runtime.exec()
呼叫前清除它的環境變數。如果攻擊者能夠修改 $PATH
變數,指向名為 make
的惡意二進位碼,並使得程式在它們的環境中執行,那麼程式會載入此惡意的二進位碼,代替原來的程式碼。由於應用程式的特性,它需要特定的權限才能執行系統作業,這表示攻擊者的 make
將會在這些權限下執行,攻擊者可能會完全控制系統。
...
String[] cmds = this.getIntent().getStringArrayExtra("commands");
Process p = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(p.getOutputStream());
for (String cmd : cmds) {
os.writeBytes(cmd+"\n");
}
os.writeBytes("exit\n");
os.flush();
...
APPHOME
來決定其安裝目錄,並且根據指定目錄的相對路徑來執行初始化 Script。
var cp = require('child_process');
...
var home = process.env('APPHOME');
var cmd = home + INITCMD;
child = cp.exec(cmd, function(error, stdout, stderr){
...
});
...
Example 1
中的程式碼允許攻擊者藉由修改系統屬性 APPHOME
,來指向包含惡意版本的 INITCMD
的其他路徑,運用提升的應用程式權限來執行任意指令。因為程式不會驗證從環境中讀取的值,所以如果攻擊者可以控制系統屬性 APPHOME
的值,那麼他們就可以欺騙應用程式去執行惡意程式碼並取得對系統的控制。rman
公用程式周圍的批次檔包裝函式來開始 Oracle 資料庫備份。Script rmanDB.bat
會接受單一指令行參數,其中指定了要執行的備份類型。因為存取資料庫是受限制的,所以應用程式需具有較高權限的使用者來執行備份。
var cp = require('child_process');
var http = require('http');
var url = require('url');
function listener(request, response){
var btype = url.parse(request.url, true)['query']['backuptype'];
if (btype !== undefined){
cmd = "c:\\util\\rmanDB.bat" + btype;
cp.exec(cmd, function(error, stdout, stderr){
...
});
}
...
}
...
http.createServer(listener).listen(8080);
backuptype
參數進行任何驗證,只有驗證此參數是否存在。一旦叫用此 Shell,就可能允許執行多個指令,並且因為應用程式本質的關係,應用程式將會使用與資料庫互動的必要權限來執行,這表示攻擊者插入的所有指令也會使用這些權限來執行。/var/yp
目錄下執行 make
指令。
...
require('child_process').exec("make", function(error, stdout, stderr){
...
});
...
make
的絕對路徑,因此沒能在執行 child_process.exec()
呼叫前清除它的環境變數。如果攻擊者能夠修改 $PATH
變數,指向名為 make
的惡意二進位碼,並使得程式在它們的環境中執行,那麼程式會載入此惡意的二進位碼,代替原來的程式碼。由於應用程式的特性,它需要特定的權限才能執行系統作業,這表示攻擊者的 make
將會在這些權限下執行,攻擊者可能會完全控制系統。APPHOME
來決定目錄的安裝位置,並且根據指定目錄的相對路徑來執行初始化 Script。
...
$home = $_ENV['APPHOME'];
$cmd = $home . $INITCMD;
system(cmd);
...
Example 1
中的程式碼允許攻擊者藉由修改系統屬性 APPHOME
,來指向包含惡意版本的 INITCMD
的其他路徑,運用提升的應用程式權限來執行任意指令。因為程式不會驗證從環境中讀取的值,所以如果攻擊者可以控制系統屬性 APPHOME
的值,那麼他們就可以欺騙應用程式去執行惡意程式碼並取得對系統的控制。rman
公用程式周圍的批次檔包裝函式來開始 Oracle 資料庫備份,並接著執行 cleanup.bat
Script 來刪除一些暫存檔案。Script rmanDB.bat
會接受單一指令行參數,其中指定了要執行的備份類型。因為存取資料庫是受限制的,所以應用程式需具有較高權限的使用者來執行備份。
...
$btype = $_GET['backuptype'];
$cmd = "cmd.exe /K \"c:\\util\\rmanDB.bat " . $btype . "&&c:\\util\\cleanup.bat\"";
system(cmd);
...
backuptype
參數進行任何驗證。通常 Runtime.exec()
函數不會執行多重指令,但在此例中,程式首先執行 cmd.exe
shell,以在單一呼叫 Runtime.exec()
時執行多重指令。一旦叫用 Shell,Shell 就會允許執行多個由兩個 & 分隔的指令。如果攻擊者傳遞一個 "&& del c:\\dbms\\*.*"
形式的字串,那麼應用程式將會執行這個指令以及由此程式指定的其他指令。因為此應用程式本質的關係,所以應用程式必須要有權限才可與資料庫互動,這表示攻擊者插入的所有指令也都會使用這些權限進行運作。/var/yp
目錄下執行 make
指令。
...
$result = shell_exec("make");
...
Runtime.exec()
呼叫前清除它的環境變數。如果攻擊者能夠修改 $PATH
變數,指向名為 make
的惡意二進位碼,並使得程式在它們的環境中執行,那麼程式會載入此惡意的二進位碼,代替原來的程式碼。由於應用程式的特性,它需要特定的權限才能執行系統作業,這表示攻擊者的 make
將會在這些權限下執行,攻擊者可能會完全控制系統。
...
CREATE PROCEDURE dbo.listFiles (@path NVARCHAR(200))
AS
DECLARE @cmd NVARCHAR(500)
SET @cmd = 'dir ' + @path
exec xp_cmdshell @cmd
GO
...
APPHOME
來決定目錄的安裝位置,並且根據指定目錄的相對路徑來執行初始化 Script。
...
home = os.getenv('APPHOME')
cmd = home.join(INITCMD)
os.system(cmd);
...
Example 1
中的程式碼允許攻擊者藉由修改系統屬性 APPHOME
,來指向包含惡意版本的 INITCMD
的其他路徑,運用提升的應用程式權限來執行任意指令。因為程式不會驗證從環境中讀取的值,所以如果攻擊者可以控制系統屬性 APPHOME
的值,那麼他們就可以欺騙應用程式去執行惡意程式碼並取得對系統的控制。rman
公用程式周圍的批次檔包裝函式來開始 Oracle 資料庫備份,並接著執行 cleanup.bat
Script 來刪除一些暫存檔案。Script rmanDB.bat
會接受單一指令行參數,其中指定了要執行的備份類型。因為存取資料庫是受限制的,所以應用程式需具有較高權限的使用者來執行備份。
...
btype = req.field('backuptype')
cmd = "cmd.exe /K \"c:\\util\\rmanDB.bat " + btype + "&&c:\\util\\cleanup.bat\""
os.system(cmd);
...
backuptype
參數進行任何驗證。通常 Runtime.exec()
函數不會執行多重指令,但在此例中,程式首先執行 cmd.exe
shell,以在單一呼叫 Runtime.exec()
時執行多重指令。一旦叫用 Shell,Shell 就會允許執行多個由兩個 & 分隔的指令。如果攻擊者傳遞一個 "&& del c:\\dbms\\*.*"
形式的字串,那麼應用程式將會執行這個指令以及由此程式指定的其他指令。因為此應用程式本質的關係,所以應用程式必須要有權限才可與資料庫互動,這表示攻擊者插入的所有指令也都會使用這些權限進行運作。/var/yp
目錄下執行 make
指令。
...
result = os.system("make");
...
os.system()
呼叫前清除它的環境變數。如果攻擊者能夠修改 $PATH
變數,指向名為 make
的惡意二進位碼,並使得程式在它們的環境中執行,那麼程式會載入此惡意的二進位碼,代替原來的程式碼。由於應用程式的特性,它需要特定的權限才能執行系統作業,這表示攻擊者的 make
將會在這些權限下執行,攻擊者可能會完全控制系統。APPHOME
來決定目錄的安裝位置,並且根據指定目錄的相對路徑來執行初始化 Script。
...
home = ENV['APPHOME']
cmd = home + INITCMD
Process.spawn(cmd)
...
Example 1
中的程式碼允許攻擊者藉由修改系統屬性 APPHOME
,來指向包含惡意版本的 INITCMD
的其他路徑,運用提升的應用程式權限來執行任意指令。因為程式不會驗證從環境中讀取的值,所以如果攻擊者可以控制系統屬性 APPHOME
的值,那麼他們就可以欺騙應用程式去執行惡意程式碼並取得對系統的控制。rman
公用程式周圍的批次檔包裝函式來開始 Oracle 資料庫備份,並接著執行 cleanup.bat
Script 來刪除一些暫存檔案。Script rmanDB.bat
會接受單一指令行參數,其中指定了要執行的備份類型。因為存取資料庫是受限制的,所以應用程式需具有較高權限的使用者來執行備份。
...
btype = req['backuptype']
cmd = "C:\\util\\rmanDB.bat #{btype} &&C:\\util\\cleanup.bat"
spawn(cmd)
...
backuptype
參數進行任何驗證。一旦透過 Kernel.spawn
叫用 Shell,Shell 就會允許執行多個由兩個 & 分隔的指令。如果攻擊者傳遞一個 "&& del c:\\dbms\\*.*"
形式的字串,那麼應用程式將會執行這個指令以及由此程式指定的其他指令。因為此應用程式本質的關係,所以應用程式必須要有權限才可與資料庫互動,這表示攻擊者插入的所有指令也都會使用這些權限進行運作。/var/yp
目錄下執行 make
指令。
...
system("make")
...
Kernel.system()
呼叫前清除它的環境變數。如果攻擊者能夠修改 $PATH
變數,指向名為 make
的惡意二進位碼,並使得程式在它們的環境中執行,那麼程式會載入此惡意的二進位碼,代替原來的程式碼。由於應用程式的特性,它需要特定的權限才能執行系統作業,這表示攻擊者的 make
將會在這些權限下執行,攻擊者可能會完全控制系統。
def changePassword(username: String, password: String) = Action { request =>
...
s'echo "${password}" | passwd ${username} --stdin'.!
...
}
APPHOME
來決定其安裝目錄,並且根據指定目錄的相對路徑來執行初始化 Script。
...
Dim cmd
Dim home
home = Environ$("AppHome")
cmd = home & initCmd
Shell cmd, vbNormalFocus
...
Example 1
中的程式碼允許攻擊者藉由修改系統屬性 APPHOME
,來指向包含惡意版本的 INITCMD
的其他路徑,運用提升的應用程式權限來執行任意指令。因為程式不會驗證從環境中讀取的值,所以如果攻擊者可以控制系統屬性 APPHOME
的值,那麼他們就可以欺騙應用程式去執行惡意程式碼並取得對系統的控制。rman
公用程式周圍的批次檔包裝函式來開始 Oracle 資料庫備份,並接著執行 cleanup.bat
Script 來刪除一些暫存檔案。Script rmanDB.bat
會接受單一指令行參數,其中指定了要執行的備份類型。因為存取資料庫是受限制的,所以應用程式需具有較高權限的使用者來執行備份。
...
btype = Request.Form("backuptype")
cmd = "cmd.exe /K " & Chr(34) & "c:\util\rmanDB.bat " & btype & "&&c:\util\cleanup.bat" & Chr(34) & ";
Shell cmd, vbNormalFocus
...
backuptype
參數進行任何驗證。一旦叫用 Shell,Shell 就會允許執行多個由兩個 & 分隔的指令。如果攻擊者傳遞一個 "&& del c:\\dbms\\*.*"
形式的字串,那麼應用程式將會執行這個指令以及由此程式指定的其他指令。因為此應用程式本質的關係,所以應用程式必須要有權限才可與資料庫互動,這表示攻擊者插入的所有指令也都會使用這些權限進行運作。/var/yp
目錄下執行 make
指令。
...
$result = shell_exec("make");
...
Runtime.exec()
呼叫前清除它的環境變數。如果攻擊者能夠修改 $PATH
變數,指向名為 make
的惡意二進位碼,並使得程式在它們的環境中執行,那麼程式會載入此惡意的二進位碼,代替原來的程式碼。由於應用程式的特性,它需要特定的權限才能執行系統作業,這表示攻擊者的 make
將會在這些權限下執行,攻擊者可能會完全控制系統。
...
steps:
- run: echo "${{ github.event.pull_request.title }}"
...
github.event.pull_request.title
值表示的任何程式碼。如果 github.event.pull_request.title
包含惡意可執行程式碼,則該動作將會執行惡意程式碼,從而導致 Command Injection。