{"id":4747,"date":"2026-08-11T20:58:54","date_gmt":"2026-08-11T18:58:54","guid":{"rendered":"https:\/\/www.sycope.com\/?post_type=dictionary-item&#038;p=4747"},"modified":"2026-08-11T22:47:31","modified_gmt":"2026-08-11T20:47:31","slug":"command-injection","status":"publish","type":"dictionary-item","link":"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/command-injection","title":{"rendered":"Command Injection"},"content":{"rendered":"<p><strong>Command injection<\/strong> (wstrzykiwanie polece\u0144) to podatno\u015b\u0107, w kt\u00f3rej aplikacja sk\u0142ada polecenie systemu operacyjnego z danych wpisanych przez u\u017cytkownika i przekazuje je do pow\u0142oki systemowej (shell), nie usuwaj\u0105c wcze\u015bniej znak\u00f3w specjalnych. Atakuj\u0105cy dopisuje wtedy do oczekiwanej warto\u015bci w\u0142asne polecenia, a serwer je wykonuje z uprawnieniami aplikacji. Wariant dotycz\u0105cy polece\u0144 systemu operacyjnego ma w\u0142asny numer w katalogu s\u0142abo\u015bci: <code>CWE-78<\/code> (OS Command Injection). Nale\u017cy te\u017c do kategorii Injection w zestawieniu <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/owasp-top-10\">OWASP Top 10<\/a> \u2014 li\u015bcie najcz\u0119stszych podatno\u015bci aplikacji webowych.<\/p>\n<h2>Jak dzia\u0142a command injection?<\/h2>\n<p>Ca\u0142y problem polega na tym, \u017ce dane, kt\u00f3re mia\u0142y by\u0107 zwyk\u0142\u0105 warto\u015bci\u0105, trafiaj\u0105 do pow\u0142oki \u2014 a ta cz\u0119\u015b\u0107 z nich rozumie jako polecenia do wykonania. Przebieg jest zwykle taki:<\/p>\n<ol>\n<li><strong>Dane wchodz\u0105<\/strong> \u2013 aplikacja przyjmuje co\u015b, co kontroluje u\u017cytkownik: parametr w adresie URL, pole formularza, nag\u0142\u00f3wek HTTP, ciasteczko albo tre\u015b\u0107 \u017c\u0105dania do <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/api\">API<\/a>.<\/li>\n<li><strong>Sklejenie polecenia<\/strong> \u2013 warto\u015b\u0107 zostaje wstawiona do gotowego polecenia, np. <code>ping -c 1 &lt;host&gt;<\/code>, gdzie <code>&lt;host&gt;<\/code> pochodzi wprost od u\u017cytkownika.<\/li>\n<li><strong>Wykonanie w pow\u0142oce<\/strong> \u2013 polecenie uruchamia funkcja, kt\u00f3ra si\u0119ga do pow\u0142oki (<code>system()<\/code>, <code>popen()<\/code>, <code>os.system()<\/code>, <code>Runtime.exec()<\/code> z pow\u0142ok\u0105, <code>child_process.exec()<\/code>).<\/li>\n<li><strong>Uruchomienie wstrzykni\u0119tego polecenia<\/strong> \u2013 je\u015bli dane zawieraj\u0105 znak specjalny pow\u0142oki, np. <code>127.0.0.1; id<\/code>, pow\u0142oka wykona najpierw <code>ping<\/code>, a zaraz po nim <code>id<\/code>.<\/li>\n<\/ol>\n<p>Wstrzykni\u0119te polecenie dzia\u0142a z takimi prawami, z jakimi uruchomiony jest podatny proces. Gdy aplikacja dzia\u0142a jako u\u017cytkownik o szerokich uprawnieniach (albo jako root), jeden podatny parametr zwykle wystarcza do pe\u0142nego przej\u0119cia serwera.<\/p>\n<h2>Jakie znaki specjalne umo\u017cliwiaj\u0105 wstrzykni\u0119cie?<\/h2>\n<p>Pow\u0142oki uniksowe oraz <code>cmd.exe<\/code> i PowerShell rozumiej\u0105 zestaw znak\u00f3w, kt\u00f3rymi mo\u017cna \u0142\u0105czy\u0107 lub rozdziela\u0107 polecenia. Najcz\u0119\u015bciej wykorzystywane to:<\/p>\n<ul>\n<li><code>;<\/code> \u2013 rozdziela polecenia (wykonaj kolejne niezale\u017cnie od poprzedniego),<\/li>\n<li><code>&amp;&amp;<\/code> oraz <code>||<\/code> \u2013 wykonanie warunkowe (po sukcesie \/ po b\u0142\u0119dzie),<\/li>\n<li><code>|<\/code> \u2013 potok, czyli przekazanie wyniku do nast\u0119pnego polecenia,<\/li>\n<li><code>&amp;<\/code> \u2013 uruchomienie w tle,<\/li>\n<li><code>$(...)<\/code> oraz <code>`...`<\/code> \u2013 podstawienie polecenia (wykonaj to i wstaw wynik),<\/li>\n<li>znak nowej linii (<code>n<\/code>) \u2013 kolejne polecenie w nowym wierszu.<\/li>\n<\/ul>\n<p>Dlatego sprawdzanie samej d\u0142ugo\u015bci czy typu danych nie wystarcza. Liczy si\u0119 to, czy te znaki w og\u00f3le docieraj\u0105 do pow\u0142oki.<\/p>\n<h2>Czym command injection r\u00f3\u017cni si\u0119 od code injection?<\/h2>\n<p>Oba ataki uruchamiaj\u0105 tre\u015b\u0107 podsuni\u0119t\u0105 przez napastnika, ale na innym poziomie:<\/p>\n<ul>\n<li><strong>Command injection (CWE-78)<\/strong> \u2013 atakuj\u0105cy wykorzystuje istniej\u0105c\u0105 w aplikacji funkcj\u0119 uruchamiania <em>polece\u0144 systemu operacyjnego<\/em>. Nie wstrzykuje w\u0142asnego kodu programu, tylko dok\u0142ada kolejne polecenia do tych, kt\u00f3re wykona pow\u0142oka. Jego mo\u017cliwo\u015bci ogranicza to, co potrafi\u0105 pow\u0142oka i system.<\/li>\n<li><strong>Code injection<\/strong> \u2013 atakuj\u0105cy wstrzykuje fragment kodu w j\u0119zyku samej aplikacji (np. PHP, Python, JavaScript), kt\u00f3ry zostaje uruchomiony w jej \u015brodowisku. Tu granic\u0105 s\u0105 mo\u017cliwo\u015bci danego j\u0119zyka.<\/li>\n<\/ul>\n<p>Ta r\u00f3\u017cnica ma znaczenie przy wykrywaniu. Command injection wida\u0107 w danych o uruchamianych procesach (proces serwera WWW nagle odpala pow\u0142ok\u0119), a code injection raczej w zachowaniu samej aplikacji.<\/p>\n<h2>Gdzie najcz\u0119\u015bciej wyst\u0119puje command injection?<\/h2>\n<p>Podatno\u015b\u0107 pojawia si\u0119 wsz\u0119dzie tam, gdzie aplikacja przekazuje dane u\u017cytkownika do pow\u0142oki. Typowe miejsca to:<\/p>\n<ul>\n<li>funkcje opakowuj\u0105ce narz\u0119dzia systemowe (np. <code>ping<\/code>, <code>nslookup<\/code>, <code>whois<\/code>, konwersja plik\u00f3w, archiwizacja),<\/li>\n<li>parametry URL i pola formularzy przekazywane do skrypt\u00f3w, kt\u00f3re wykonuj\u0105 polecenia,<\/li>\n<li>punkty ko\u0144cowe API buduj\u0105ce polecenie z danych JSON lub XML,<\/li>\n<li>panele administracyjne urz\u0105dze\u0144 sieciowych i sprz\u0119tu IoT (cz\u0119ste \u017ar\u00f3d\u0142o publikowanych podatno\u015bci),<\/li>\n<li>nazwy plik\u00f3w i ich metadane przy wgrywaniu, je\u015bli trafiaj\u0105 p\u00f3\u017aniej do polecenia pow\u0142oki.<\/li>\n<\/ul>\n<h2>Czym jest blind command injection i jak go wykry\u0107?<\/h2>\n<p>Cz\u0119sto wynik wstrzykni\u0119tego polecenia nie wraca w odpowiedzi HTTP. To <strong>blind (\u015blepa) command injection<\/strong> \u2014 atakuj\u0105cy nie widzi efektu wprost, wi\u0119c potwierdza go po\u015brednio:<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/latency-opoznienie\">Op\u00f3\u017anienie<\/a> w czasie<\/strong> \u2013 wstrzykni\u0119cie <code>; sleep 10<\/code> (albo <code>ping -c 10 127.0.0.1<\/code>) i zmierzenie, czy odpowied\u017a faktycznie przysz\u0142a p\u00f3\u017aniej. Je\u015bli tak, polecenie si\u0119 wykona\u0142o.<\/li>\n<li><strong>Zapis wyniku do pliku<\/strong> \u2013 przekierowanie wyniku do pliku w katalogu dost\u0119pnym przez WWW, a potem jego odczyt.<\/li>\n<li><strong>Techniki out-of-band (OAST)<\/strong> \u2013 zmuszenie serwera do odezwania si\u0119 na zewn\u0105trz, np. zapytania <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/dns\">DNS<\/a> lub HTTP do serwera atakuj\u0105cego (<code>nslookup atakujacy.example<\/code>). To potwierdza wykonanie polecenia, a przy okazji pozwala wyprowadzi\u0107 dane. Skr\u00f3t OAST oznacza testowanie przez kana\u0142 poza sam\u0105 sesj\u0105 HTTP (out-of-band application security testing).<\/li>\n<\/ul>\n<h2>Jak wykrywa\u0107 i monitorowa\u0107 command injection?<\/h2>\n<p>Z punktu widzenia zespo\u0142u monitoruj\u0105cego bezpiecze\u0144stwo (<a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/soc-security-operations-center\">SOC<\/a>) i narz\u0119dzi analizuj\u0105cych ruch sieciowy (<a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/ndr-network-detection-and-response\">NDR<\/a>) command injection zostawia \u015blady, kt\u00f3rych nie wida\u0107 przy zwyk\u0142ym ruchu aplikacji:<\/p>\n<ul>\n<li><strong>Dane o procesach<\/strong> \u2013 proces serwera WWW lub aplikacji nagle uruchamia pow\u0142ok\u0119 albo narz\u0119dzia systemowe (<code>sh<\/code>, <code>bash<\/code>, <code>cmd.exe<\/code>, <code>powershell<\/code>, <code>whoami<\/code>, <code>id<\/code>, <code>curl<\/code>, <code>wget<\/code>). \u0141a\u0144cuch rodzic-dziecko w stylu <code>nginx \u2192 sh \u2192 curl<\/code> to mocny sygna\u0142, \u017ce co\u015b jest nie tak.<\/li>\n<li><strong>Analiza ruchu i log\u00f3w WWW<\/strong> \u2013 znaki specjalne pow\u0142oki (<code>;<\/code>, <code>|<\/code>, <code>&amp;&amp;<\/code>, <code>$(<\/code>, znaki backtick) oraz nazwy polece\u0144 w parametrach, nag\u0142\u00f3wkach i tre\u015bci \u017c\u0105da\u0144.<\/li>\n<li><strong>Po\u0142\u0105czenia wychodz\u0105ce<\/strong> \u2013 nietypowe zapytania DNS albo sesje HTTP\/<a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/http-https\">HTTPS<\/a>, kt\u00f3re serwer aplikacji inicjuje tu\u017c po \u017c\u0105daniu. To typowy \u015blad OAST i pobierania kolejnej cz\u0119\u015bci ataku.<\/li>\n<li><strong>Korelacja<\/strong> \u2013 zestawienie \u017c\u0105dania HTTP ze znakami specjalnymi z tym, co sta\u0142o si\u0119 zaraz po nim (uruchomienie procesu, po\u0142\u0105czenie na zewn\u0105trz). To pozwala odr\u00f3\u017cni\u0107 udany atak od zwyk\u0142ego skanowania.<\/li>\n<\/ul>\n<p>Filtr aplikacyjny (<a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/waf-web-application-firewall\">WAF<\/a>) wy\u0142apie cz\u0119\u015b\u0107 pr\u00f3b, ale szyfrowany ruch, r\u00f3\u017cne kodowania znak\u00f3w i sztuczki maskuj\u0105ce ograniczaj\u0105 jego skuteczno\u015b\u0107. Dlatego dane z hosta i z sieci s\u0105 jego uzupe\u0142nieniem, a nie zamiennikiem.<\/p>\n<h2>Jak zapobiega\u0107 command injection?<\/h2>\n<p>OWASP uk\u0142ada warstwy obrony od najskuteczniejszej:<\/p>\n<ol>\n<li><strong>Nie uruchamiaj pow\u0142oki<\/strong> \u2013 zamiast sk\u0142ada\u0107 polecenia, korzystaj z gotowych funkcji j\u0119zyka (np. funkcja tworz\u0105ca katalog zamiast <code>system(\"mkdir ...\")<\/code>). To usuwa problem u \u017ar\u00f3d\u0142a.<\/li>\n<li><strong>Rozdziel polecenie od danych<\/strong> \u2013 je\u015bli musisz uruchomi\u0107 zewn\u0119trzny program, przeka\u017c nazw\u0119 programu i argumenty osobno, bez po\u015brednictwa pow\u0142oki (np. <code>ProcessBuilder<\/code> w Javie, <code>subprocess<\/code> z list\u0105 argument\u00f3w i bez <code>shell=True<\/code> w Pythonie). Wtedy dane nie s\u0105 traktowane jak polecenia.<\/li>\n<li><strong>Sprawdzaj dane przez list\u0119 dozwolonych (allowlist)<\/strong> \u2013 przyjmuj tylko z g\u00f3ry znany, dozwolony zbi\u00f3r warto\u015bci (np. same cyfry albo warto\u015b\u0107 z ustalonej listy), zamiast pr\u00f3bowa\u0107 blokowa\u0107 znaki uznane za niebezpieczne.<\/li>\n<li><strong>Escapowanie tylko w ostateczno\u015bci<\/strong> \u2013 funkcje typu <code>escapeshellarg()<\/code> stosuj wy\u0142\u0105cznie wtedy, gdy pow\u0142oki nie da si\u0119 unikn\u0105\u0107. \u0141atwo tu o b\u0142\u0105d, zw\u0142aszcza przy tzw. argument injection (podszywaniu danych pod dodatkowe opcje polecenia).<\/li>\n<li><strong>Najmniejsze potrzebne uprawnienia<\/strong> \u2013 uruchamiaj procesy z minimalnymi prawami i w izolacji (kontener, osobne konto), \u017ceby ograniczy\u0107 skutki ewentualnego w\u0142amania.<\/li>\n<\/ol>\n<h2>Dowiedz si\u0119 wi\u0119cej<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/api-security\">API Security<\/a> \u2014 Niezabezpieczone API mo\u017ce pozwoli\u0107 na wstrzykni\u0119cie komend przez b\u0142\u0119dnie walidowane dane wej\u015bciowe.<\/li>\n<li><a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/sql-injection-sqli\">SQL Injection (SQLi)<\/a> \u2014 SQLi pokazuje podobny mechanizm wstrzykiwania polece\u0144 do zapyta\u0144, cho\u0107 dotyczy bazy danych.<\/li>\n<li><a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/web-shell-attacks\">Web Shell Attacks<\/a> \u2014 Command Injection mo\u017ce da\u0107 atakuj\u0105cemu dost\u0119p do pow\u0142oki, kt\u00f3r\u0105 p\u00f3\u017aniej wykorzystuje web shell.<\/li>\n<li><a href=\"https:\/\/www.sycope.com\/pl\/post\/techniki-attck-mittre-w-bezpieczenstwie-twojej-sieci\">Techniki MITRE ATT&#038;CK w bezpiecze\u0144stwie sieci<\/a> \u2014 W MITRE ATT&#038;CK Command Injection odpowiada technikom realizuj\u0105cym zdalne wykonanie polece\u0144.<\/li>\n<li><a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/xss-cross-site-scripting\">XSS (Cross-Site Scripting)<\/a> \u2014 XSS i Command Injection to r\u00f3\u017cne wektory, ale oba wynikaj\u0105 z braku filtrowania danych wej\u015bciowych.<\/li>\n<\/ul>\n","protected":false},"featured_media":0,"template":"","class_list":["post-4747","dictionary-item","type-dictionary-item","status-publish","hentry"],"acf":{"tytul":"Command Injection","ikona":"","krotki_opis":"Podatno\u015b\u0107, w kt\u00f3rej aplikacja przekazuje dane u\u017cytkownika do pow\u0142oki systemu, pozwalaj\u0105c atakuj\u0105cemu uruchomi\u0107 dowolne polecenia systemu operacyjnego z uprawnieniami procesu (CWE-78)."},"_links":{"self":[{"href":"https:\/\/www.sycope.com\/pl\/wp-json\/wp\/v2\/dictionary-item\/4747","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sycope.com\/pl\/wp-json\/wp\/v2\/dictionary-item"}],"about":[{"href":"https:\/\/www.sycope.com\/pl\/wp-json\/wp\/v2\/types\/dictionary-item"}],"wp:attachment":[{"href":"https:\/\/www.sycope.com\/pl\/wp-json\/wp\/v2\/media?parent=4747"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}