Kod enjeksiyonu
Örnekler > Kabuk enjeksiyonu

Kabuk (Shell) enjeksiyonu (komut enjeksiyonu) Unix kabuklarından sonra adlandırılır, ancak yazılımın programlı olarak komut satırından çalışmasına izin verilen çoğu sistemde uygulanabilir. Örneğin savunmasız tcsh komut dizisi:
#!/bin/tcsh
# check arg outputs it matches if arg is one 
if ($1 == 1) echo it matches
Yukarıdakiler ./check çalıştırılabilir dosyası içerisine saklanırsa, ./check " 1 ) evil" kabuk komutu ile argümanı sabit olanla karşılaştırmak yerine enjekte edilen evil kabuk komutunu çalıştırmayı deneyecektir. Burada saldırı altındaki kod, parametreyi kontrol etmeye çalışan koddur, yani bir saldırıya karşı savunmak için parametreyi doğruılamaya çalışan koddur.
Bir kabuk komutu oluşturma ve çalıştırmak için kullanılabilecek herhangi bir fonksiyon, bir kabuk enjeksiyon saldırısı başlatmak için potansiyel bir araçtır. Bunlar arasında system() 24 Aralık 2021 tarihinde Wayback Machine sitesinde arşivlendi., StartProcess() ve System.Diagnostics.Process.Start() 6 Ocak 2018 tarihinde Wayback Machine sitesinde arşivlendi. vardır.
Web sunucuları ile web tarayıcıları etkileşimi gibi sunucu-istemci sistemleri, kabul enjeksiyonuna karşı potansiyel olarak savunmasızdır. Kullanıcının gönderdiği bir kelimeyi başka bir kelimeyle değiştirmek için çağrılan harici funnytext programını çalıştırmak amacıyla bir web sunucusunda çalıştırılabilen aşağıdaki kısa PHP programını düşünelim.
<?php
passthru("/bin/funnytext " . $_GET['USER_INPUT']);
Yukarıda oluşturulan bir kabuk komutu olan passthru sonra web sunucusu tarafında yürütülür. Oluşturduğu komutun bir kısmı web tarayıcısı tarafından sağlanan URL’den alındığından, bu URL’in kötü amaçlı kabuk komutları enjekte etmesine izin verir. Çeşitli kabuk özelliklerinin söz diziminden yararlanılarak bu programa kod enjekte edilebilir (bu liste ayrıntılı değildir):
| Shell feature | USER_INPUT value | Resulting shell command | Explanation |
| --- | --- | --- | --- |
| Sequential execution | ; malicious_command | /bin/funnytext ; malicious_command | Executes funnytext, then executes malicious_command. |
| Pipelines | malicious_command | malicious_command | Sends the output of funnytext as input to malicious_command. |
| Command substitution | `malicious_command` | /bin/funnytext `malicious_command` | Sends the output of malicious_command as arguments to funnytext. |
| Command substitution | $(malicious_command) | /bin/funnytext $(malicious_command) | Sends the output of malicious_command as arguments to funnytext. |
| AND list | && malicious_command | /bin/funnytext && malicious_command | Executes malicious_command iff funnytext returns an exit status of 0 (success). |
| OR list | | malicious_command | | malicious_command | Executes malicious_command iff funnytext returns a nonzero exit status (error). |
| Output redirection | > ~/.bashrc | /bin/funnytext > ~/.bashrc | Overwrites the contents the .bashrc file with the output of funnytext. |
| Input redirection | < ~/.bashrc | /bin/funnytext < ~/.bashrc | Sends the contents of the .bashrc file as input to funnytext. |
Bazı diller kabuk komutlarını oluşturmak için doğru bir şekilde kaçılan ya da alıntı yapılan karakter dizileri için fonksiyonlar önerir:
PHP: escapeshellarg() ve escapeshellcmd()
Python: shlex.quote()
Ancak bu durum programcılara bu fonksiyonları bilme/öğrenme ve kabuk komutlarını her kullandıklarında bunlardan yararlanmayı hatırlama görevi yükler. Bu fonksiyonların kullanılmasına ek olarak kullanıcı girdisinin doğrulanması ve steril hale getirilmesi önerilir.
Daha güvenli bir alternatif ise harici programları bir kabul yerine doğrudan çalıştıran API'lar kullanmaktır, böylece kabuk enjeksiyonunun olma ihtimalini önler. Ancak, bu API'lar kabuğun kolaylık sağlayan çeşitli özelliklerini destekleme eğiliminde değildirler ve/veya kısa kabuk sözdizimlerine kıyasla daha hantal/ayrıntılı olma eğilimindedir.