OWASP/CWE/SANS TOP 40 — En Tehlikeli Uygulama Zafiyetlerinin Anlatım ve Örnekleri — Part 1 | TR

Alican Kiraz
17 min readFeb 10, 2020

OWASP, SANS ve CWE bazında zafiyet değerlendirmeleri yapılan günümüzün en tehlikeli Uygulama Güvenliği zafiyetlerini örnek ve açıklamalar ile anlatımını sağladım. Mitre ve Owasp’ın bu konuda örnek olması açısından ele aldığı Zafiyetli Kodlarıda örneklerde inceleyerek, Yazılım geliştirirken Güvenlik Ekiplerince dikkat edilmesi gerekilen temel hata başlıklarını ele aldım. Bu kodlamalara da dikkat ederek hem Yazılımcılar hemde Kod denetimi sağlayan Güvenlik Ekiplerince incelenerek kurumunuzda Secure Coding farkındalığı yaratabilirsiniz. Bu zafiyetleri ele alıcak olursak;

  1. CWE-11 / — Improper Restriction of Operations within the Bounds of a Memory Buffer (BoF)

Bir Buffer Overflow ( BoF) , bir saldırganın sisteminize erişmek için kullanabileceği temelinde yaygın bir yazılım dili kaynaklı kodlama hatasıdır. BoF açıklarını ortadan kaldırmak için yazılımcının; ne olduğunu, uygulamalar için hangi tehlikeleri ortaya çıkardığını ve saldırganların bu güvenlik açıklarından faydalanmak için hangi teknikleri kullandığını anlamak önemlidir. Bunun için SANS ve MITRE açıklamalarından faydalanabilirsiniz.

Kısaca; Buffer, string değerinden veya bir integer değerine kadar her şeyi içerecek şekilde tahsis edilen belleğin sıralı bir bölümüdür. Buffer Overflow ise sabit uzunluklu bir Buffer’a, Buffer’ın işleyebileceğinden daha fazla veri eklendiğinde meydana gelir. Bir yere gitmesi gereken ekstra bilgiler, bitişik Buffer bölgesini taşırarak o alanda tutulan verileri bozabilir veya üzerine yazılabilir hale getirir. Bu taşma genellikle ya bir sistem çökmesine neden olur, yada saldırgan birinin kötü amaçlı eylemler yürütmesi için arbitrary code çalıştırmasına yada kodlama hatalarını değiştirmesine fırsat oluşturur.

Örngine, aşağıdaki örnekle input string değerine bir kodlama yordamı uygulayarak bu değeri bir buffer’da saklayacak şekilde yapılandıralım;

//Ornek C Dili BoF
//Kaynak:cwe.mitre.org
char * copy_input(char *user_supplied_string){
int i, dst_index;
char *dst_buf = (char*)malloc(4*sizeof(char) * MAX_SIZE);
if ( MAX_SIZE <= strlen(user_supplied_string) ){
die(“user string too long, die evil hacker!”);
}
dst_index = 0;
for ( i = 0; i < strlen(user_supplied_string); i++ ){
if( ‘&’ == user_supplied_string[i] ){
dst_buf[dst_index++] = ‘&’;
dst_buf[dst_index++] = ‘a’;
dst_buf[dst_index++] = ‘m’;
dst_buf[dst_index++] = ‘p’;
dst_buf[dst_index++] = ‘;’;
}
else if (‘<’ == user_supplied_string[i] ){
/* encode to &lt; */
}
else dst_buf[dst_index++] = user_supplied_string[i];
}
return dst_buf;
}

Yazılımcı, User tarafından girişi sağlanan String değerinde ve & (Ve) işaretini kodlamaya çalışır, ancak string’in uzunluğu kodlama prosedürü uygulanmadan önce doğrulanır. Birde, programcı encoding genişlemesinin belirli bir karakteri sadece 4 kat artacağını varsayarken, & işareti kodlamayı 5 katı genişletir. Sonuç olarak, kodlama prosedürü string’i genişlettiğinde hedeflenen BoF mümkün olur. saldırgan birçok & işaretli string bir değer sağlar.

2. CWE-79 — Improper Neutralization of Input During Web Page Generation (‘Cross-site Scripting’)

XSS’i öncelikle bir yazılımcı veya Güvenlik Arastırmacısı oalrak tanımamız gerekir; Siteler arası komut dosyası oluşturma saldırısı yani XSS Attack, güvenlik açığı aşağıdaki durumlarda oluşur ve sürdürülür;

a. Manipüle edilmiş JS kodları genellikle bir Web Uygulama Request’i üzerinden iletilerek hedefe ulaşır.
b. Eğer bu gönderilen Request’de değiştirilen veya manipüle edilmiş nokta sanatize edilmemişse hedefe ulaşır ve dinamik olarak işlenir.
c.Bu dinamik içerik işlenirken, web uygulaması sanatize edilmediğinden duruma müdahae edemez.
d. Bir kurbanda bu manipüle edilmiş bu parametre ile Web Uygulamasına giriş sağlarsa ilgili zafiyeti ve hedeflediği noktayı örneğin Cookie payalaşımını aktive der..
e. Kurbanın isteği Server’a iletilir ve Kurbanın Client’ında işlenen değerleri baz alarak hedefe iletir.
f. Böylece saldırgan ilgili kurbanı tanımlayan unique değerleri kullanrak kurban kılığına bürünerek yapmak istediği kötücül işlemlerini yürütür. Örneğin kurbanın hesabını kötüye kullanmak yada ona zarar verecek işlemler gercekleştirmek için.

Üç ana XSS türü vardır:

Tür 1: Reflected XSS (Kalıcı Olmayan) — Server’lar verileri doğrudan HTTP Reques’leri sayesinde okur ve HTTP Responce’larını bunlara göre yollar. Reflected XSS’ler, bir saldırganın bir kurbanın savunmasız bir web uygulamasına manipüle edilmiş bir zafiyet noktasından bağlantı kurması ile ortaya çıkar; bu isteğide mağdura responce olarak gelir ve web tarayıcısı ile de yürütülür. Böylelikle saldırganın yaptığı manipüle edilmiş parametreleri ile gerçekleşen işlem yolu, istediği adımlar ile (örneğin session id paylaşımı) ile harekete geçer ve ilerler.

Tip 2: Stored XSS (Kalıcı Yöntem) — Uygulama tehlikeli verileri bir kullanılabilir depoda toplanır ve dinamik içeriğe dahil edilir. Saldırgan , manipüle edilmiş içeriği enjekte etmek için en uygun yeri, birçok kullanıcıya veya özellikle ziyaret eden kullanıcıların görüntülediği bir alanı seçer.

Tür 3: DOM Tabanlı XSS ​​- DOM tabanlı XSS’de, Client sayfaya XSS enjeksiyonunu gerçekleştirir; diğer tiplerde, Server’a yönelik injection’larla gerçekleştirilir. DOM tabanlı XSS’de ​​genellikle, Client’a gönderilen Server tarafından denetlenen, güvenilir bir komut dosyası içerir; örneğin Javascript durum denetimi, kullanıcıya gönderilmeden önce bir formda gerçekleştirilir. Server tarafından sağlanan komut dosyası, kullanıcı tarafından sağlanan verileri işleyerek web sayfasına (dinamik HTML gibi) geri injection sağlarsa, DOM tabanlı XSS ​​gercekleşir.

3. CWE-20 — Improper Input Validation

İlgili Yazılım Projesi, düzgün bir şekilde input doğrulaması gerçekleştiremediğinde oluşur. Bu tür sorunlar yazılımın veri akışının işlenmesini etkileyebilir. Yazılım Input değerleri düzgün bir şekilde doğrulamazsa, saldırgan Input değerlerini uygulamanın geri kalanı tarafından beklenmeyen bir biçimde girişler sağlayabilir.
Uygun Input denetiminin olmaması durumunda saldırganlar, denetim akışında, bir kaynağın arbitary denetiminde veya arbitary kod yürütülmesinde değişikliklere neden olan veriler oluşturabilir ve girişler sağlamasına neden olur.

Örnekle inceleyecek olursak;

#Example Language: Java

#Kaynak:cwe.mitre.org


public static final double price = 20.00;
int quantity = currentUser.getAttribute(“quantity”);
double total = price * quantity;
chargeUser(total);

Kullanıcının fiyat değişkeni üzerinde kontrolü yoktur, ancak yazılım, miktar için negatif bir değerin belirtilmesini engellemiyor. Bir saldırgan negatif bir değer sağlayacak olsaydı, ödeme yapmak yerine üstüne market ona borçlanırdı.

4. CWE-200 — Information Exposure

Information Exposure, açıkça bazı bilgilere erişim yetkisi olmayan bir kişiye kasıtlı veya kasıtsız bilgi ifşası sağlanmasıdır.

Tanımlayacak olursak, bilgiler ; Bu bilgiler bir hata veya anomali sonrası paylaşılacağı gibi, Ürün veya Framework hakkında, bir saldırıda faydalı olabilecek ancak normalde saldırgan tarafından erişilemeyen, örneğin uzaktan erişilebilen bir ürünün installation path’i gibi bilgilerin sağlanmasıyla oluşur.

Aşağıdaki kod, verilen kullanıcı adı ve parolanın geçerliliğini denetler ve kullanıcının hatalı yada doğru bir şekilde oturum açdığı konusunda bilgilendirir.

//Ornek 1 (bad code)
//Ornek Dil: Perl

//Kaynak:cwe.mitre.org

my $username=param(‘username’);
my $password=param(‘password’);

if (IsValidUsername($username) == 1)
{
if (IsValidPassword($username, $password) == 1)
{
print “Login Successful”;
}
else
{
print “Login Failed — incorrect password”;
}
}
else
{
print “Login Failed — unknown username”;
}

Ancak burda kullanıcı hatalı giriş yaptığında örneğin olmayan bir kullanıcı ismi denediğinde uygulama ona hatalı kullanıcı bilgisi verdiğinden saldırgan bunun doğrultusunda bilgi sahibi olarak doğru kullanıcılara yönelerek saldırı başarı yüzdesini yükseltecektir. Bu gibi farklı durumlarda da birçok bilgi ifşası ortaya çıkar (örneğin, programın tam path’ini gösteren PHP script error), ancak bunlar birincil de olabilir (örn. Kriptografideki zamanlama tutarsızlıkları). Bilgi ifşasını içeren birçok farklı türde problem vardır. Bu ifşaların seviyeleri, ortaya çıkan bilgi türüne bağlı olarak geniş bir aralıkta değişebilir.

5. CWE-125 — Out-of-bounds Read

Genellikle bu, saldırganların diğer memory bölümlerinden hassas bilgileri okumasına veya uygulamanın çökmesine neden olabilir. Yazılımda bir dizini değiştirebilir veya buffer sınırlarının dışındaki bir memory bölgesine başvuran pointer aritmetiği gerçekleştirebilir. Bu nedenle bir sonraki okuma işlemi tanımlanmamış veya beklenmeyen sonuçlar üretir. Bu zafiyetin ortaya çıktığı yazılım dilleri ise C ve C++’dır. Kısaca; Programda, ayrılan belleğin sınırlarının dışından veriler okunmasıdır.

Aşağıdaki programda, analiz edilecek sabit bir bayt sayısı ile memchr () çağrısında search buffer’ıyla güvenilir olmayan bir komut satırı bağımsız değişkenini kullanır.

//Kaynak:fortify.com

int main(int argc, char** argv) {
char* ret = memchr(argv[0], 'x', MAX_PATH);
printf("%s\n", ret);
}

6. CWE-89 — Improper Neutralization of Special Elements used in an SQL Command (‘SQL Injection’)

Kullanıcılar tarafından Input değer sağlanan noktalarda gerekli sanatizasyon yapılmamışsa SQL sytax’ına etki eden Input değerleri ile, arka planda SQL’e etki eden bu Input değerler SQL veritabanında sorguda istenilen çıktı dışında yekileri olmayan birçok çıktıya erişebilir ve veritabanındaki bilgileri istediği ölçekte okuyabilir.

Aşağıdaki kod, belirtilen adla eşleşen öğeleri arayan bir SQL sorgusunu dinamik olarak oluşturur ve yürütür. Sorgu, görüntülenen öğeleri, sahibinin o anda kimliği doğrulanmış kullanıcının username’i ile eşleştiği öğelerle sınırlar.

//Ornek Dil: C#

//Kaynak:cwe.mitre.org


string userName = ctx.getAuthenticatedUserName();
string query = “SELECT * FROM items WHERE owner = ‘“ + userName + “‘ AND itemname = ‘“ + ItemName.Text + “‘“;
sda = new SqlDataAdapter(query, conn);
DataTable dt = new DataTable();
sda.Fill(dt);

Bu kodun yürütmeyi amaçladığı sorgu aşağıdaki gibidir:

SELECT * FROM items WHERE owner = <userName> AND itemname = <itemName>;

Kullanıcı adı Alican olan bir saldırgan “ name’ OR ‘a’=’a “ dizesini kullanarak kodu manipüle etmek isterse;

SELECT * FROM items WHERE owner = ‘wiley’ AND itemname = ‘name’ OR ‘a’=’a’;

Yukarıdaki şekilde arkaplanda işlenecektir. Böylece koşul, WHERE deyiminin her zaman true olarak değerlendirilmesine neden olur. Bu nedenle de sorgu mantıksal olarak “ SELECT * FROM items; “ sorgusuna dönüşür. Bu sayede kimlik doğrulaması atlatılarak saklanan tüm öğeler listelenir.

In-band SQLi (Classic SQLi)

SQL Enjeksiyon saldırılarının en yaygın ve kullanımı en kolay olanıdır. Bant içi SQL Enjeksiyonu, bir saldırgan saldırıyı başlatmak ve sonuçları toplamak için aynı iletişim kanalını kullanabildiğinde gerçekleşir.

in-band SQL Injection iki türe ayrılır; Error-based SQLi ve Union-based SQLi.

Error-based SQLi

Error-based SQLi veritabanının yapısı hakkında bilgi almak için veritabanı sunucusu gönderilen isteklere gelen responce’ları temel alır. Bazen, bir saldırganın tüm veritabanını enumerate etmesi için yeterli bile olabilir.

' GROUP BY table.columnfromerror1 HAVING 1=1 --

Union-based SQLi

Union-based SQLi birden fazla SELECT ifadesini birlikte kullanarak sonuç döndüren SQLi türüdür.

' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1--

Inferential SQLi (Blind SQLi)

Saldırı sırasında web uygulaması üzerinden gerçekte hiçbir veri aktarılmaz ve saldırgan klasik saldırının sonucunu göremez.

Iki tür Blind SQL Injection türü vardır; Blind-boolean-based SQLi ve Blind-time-based SQLi.

#Kaynak: https://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/

TRUE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>78 —

FALSE : SELECT ID, Username, Email FROM [User]WHERE ID = 1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 name FROM sysObjects WHERE xtYpe=0x55 AND name NOT IN(SELECT TOP 0 name FROM sysObjects WHERE xtYpe=0x55)),1,1)),0)>103 —

Boolean-based (content-based) Blind SQLi

Veritabanına bir SQL sorgusu göndermeye dayanan, sorgunun DOĞRU veya YANLIŞ sonucu döndürmesine bağlı olarak uygulamayı farklı bir sonuç döndürmeye zorlayan tekniktir.

Sonuca bağlı olarak, HTTP responsun’daki içerik değişir veya aynı kalır. Veritabanından hiçbir veri döndürülmezse de, kullanılan payload’ın doğru veya yanlış sonuc döndürmesi durumunda saldırganın çıkarım yapmasına olanak tanır.

Time-based Blind SQLi

Veritabanının yanıt vermeden önce belirli bir süre (saniye cinsinden) beklemeye zorlatan bir SQL sorgusu göndermeye dayananır. Bu yanıt süresi saldırgana sorgunun sonucunun DOĞRU veya YANLIŞ olduğunu gösterir.Microsoft SQL Server’da xp_dirtree komutunu örnek verebiliriz. Oracle Database’inde ise UTL_HTTP paketinin yanı sıra SQL ve PL / SQL’den saldırganın kontrol ettiği bir sunucuya HTTP requestleri göndermek için kullanılabilir.

7. CWE-416 — Use After Free

Use-After-Free güvenlik açıkları, saldırganlar tarafından rasgele kod yürütmek için kullanılabilen bir tür memory corruption hatasıdır.

Use-After-Free, özellikle bir programın çökmesine neden olabilecek veya serbest bırakıldıktan sonra bir kusur olması durumunda, muhtemelen rasgele kod yürütülmesine veya remote code execution özelliklerini bile etkinleştirebilir.

Bu zafiyetin ortaya çıktığı yazılım dilleri ise C ve C++’dır.

Örnek zafiyetli kod;

//Ornek Dil C — Kaynak:https://cwe.mitre.org

#include <stdio.h>
#include <unistd.h>
#define BUFSIZER1 512
#define BUFSIZER2 ((BUFSIZER1/2) — 8)
int main(int argc, char **argv) {

char *buf1R1;
char *buf2R1;
char *buf2R2;
char *buf3R2;
buf1R1 = (char *) malloc(BUFSIZER1);
buf2R1 = (char *) malloc(BUFSIZER1);
free(buf2R1);
buf2R2 = (char *) malloc(BUFSIZER2);
buf3R2 = (char *) malloc(BUFSIZER2);
strncpy(buf2R1, argv[1], BUFSIZER1–1);
free(buf1R1);
free(buf2R2);
free(buf3R2);

}

8. CWE-190 — Integer Overflow or Wrap Around

Yazılımda elde edilen değerin her zaman orijinal değerden daha büyük olacağını varsayarsa, yazılımda bir integer overflow ve wraparound oluşturabilen bir hesaplama yapar. Yapılan bu hesaplama resource management veya execution control için kullanıldığında bazı zafiyetleride ortam yaratmış olur. Bir integer değeri, ilişkili gösterimde depolanamayacak kadar büyük bir değere arttırıldığında ya integer overflow yada wraparound meydana gelir. Bu durumda, değer çok küçük veya negatif bir sayı haline gelebilir. Bu zafiyet bazen arbitary code execution için kullanılabilen buffer oferflow’ları tetikleyebilir.

Aşağıdaki görüntü işleme kodu görüntüler için bir tablo ayırır.

//Kaynak: cwe.mitre.org

Ornek Dil: C

img_t table_ptr; /*struct containing img data, 10kB each*/
int num_imgs;

num_imgs = get_num_imgs();
table_ptr = (img_t*)malloc(sizeof(img_t)*num_imgs);

Bu kod, num_imgs boyutunda bir tablo tahsis etmeyi amaçlamaktadır. Ancak num_imgs büyüdükçe, listenin boyutunu belirleyen hesaplama sonunda taşacaktır (CWE-190). Böylece, istenilen yerine çok küçük bir listenin atanmasına neden olacaktır. Sonraki kod listede num_imgs uzunluğunda çalışıyorsa, birçok out-of-bounds sorunla sonuçlanabilir (CWE-119).

9. CWE-352 — Cross-Site Request Forgery (CSRF)

Siteler Arası İstek Sahteciliği (CSRF)’nin Felsefesi, Kullanıcıyı kimliğinin doğrulanmış olduğu bir web uygulamasında, gerçekleştirmediği bir eylemi yürütmeye zorlayan bir saldırıdır. CSRF saldırıları, veri hırsızlığını hedeflemez. Biraz sosyal mühendislik yardımı ile, bir saldırgan bir web uygulaması kullanıcısını saldırganın seçtiği eylemleri gerçekleştirmeleri için kandırabilir. Mağdur normal bir kullanıcıysa, başarılı bir CSRF saldırısı kullanıcıyı para transferi, e-posta adreslerini değiştirme vb. saldırganın isteklerini gerçekleştirmeye zorlayabilir. Tarayıcılardan doğan Request kontrol denetimi zaafları sayesinde iki site arasında gerçekleşen bu Request ayırt edilmediğinden hedef web uygulaması zafiyet sahibiyse bu saldırı gerçekleştirilebilir.

Örnek 1

Aşağıdaki örnek PHP kodu, formu gönderen kullanıcının geçerli bir oturumu olduğunu doğrulayarak form gönderme işlemini korumaya çalışır. CSRF saldırısı, bu karşı önlem tarafından engellenmeyecektir çünkü saldırgan, kullanıcının web tarayıcısı aracılığıyla geçerli bir oturumun mevcut olduğu bir istekte bulunur.

Aşağıdaki HTML, kullanıcının bir profili güncellemesine izin vermek için tasarlanmıştır.

Example Language: HTML

#Kaynak : cwe.mitre.org

<form action=”/url/profile.php” method=”post”>
<input type=”text” name=”firstname”/>
<input type=”text” name=”lastname”/>
<br/>
<input type=”text” name=”email”/>
<input type=”submit” name=”submit” value=”Update”/>
</form>

profile.php aşağıdaki kodu içerir.

//Ornek Dil: PHP
// Kaynak: cwe.mitre.org
// initiate the session in order to validate sessions
session_start();
//if the session is registered to a valid user then allow update
if (! session_is_registered(“username”)) {
echo “invalid session detected!”;
// Redirect user to login page
[…]
exit;
}
// The user session is valid, so process the request
// and update the information
update_profile();
function update_profile {
// read in the data from $POST and send an update
// to the database
SendUpdateToDatabase($_SESSION[‘username’], $_POST[‘email’]);
[…]
echo “Your profile has been successfully updated.”;
}

Bu kod, geçerli bir oturumu kontrol ettiğinden korunuyor görünebilir. Bununla birlikte, CSRF saldırıları, image tags, links, object tags veya arka plan resimleri yükleyen diğer özellikler dahil olmak üzere neredeyse tüm taglardan veya HTML yapılarından gerçekleştirilebilir.

Saldırgan daha sonra, hedef web uygulamasında oturumunuz açıkken sayfayı ziyaret eden herhangi bir kullanıcının kullanıcı adını ve e-posta adresini sessizce değiştirecek kodu barındırabilir. Kod masum görünümlü bir web sayfası olabilir:

//Ornek Dil: HTML
//Kaynak: cwe.mitre.org
<SCRIPT>
function SendAttack () {
form.email = “attacker@example.com”;
// send to profile.php
form.submit();
}
</SCRIPT>
<BODY onload=”javascript:SendAttack();”>
<form action=”http://victim.example.com/profile.php" id=”form” method=”post”>
<input type=”hidden” name=”firstname” value=”Funny”>
<input type=”hidden” name=”lastname” value=”Joke”>
<br/>
<input type=”hidden” name=”email”>
</form>

Formun gizli alanları nasıl içerdiğine dikkat edin, bu yüzden tarayıcıya yüklendiğinde kullanıcı bunu fark etmez. SendAttack (), body’nin onload özniteliğinde tanımlandığından, mağdur web sayfasını yüklediğinde otomatik olarak çağrılır.

Kullanıcının kurban.example.com’da zaten oturum açtığını varsayarsak, profile.php geçerli bir kullanıcı oturumu oluşturulduğunu görür, ardından e-posta adresini saldırganın kendi adresine günceller. Bu aşamada, kullanıcının kimliği tehlikeye atılmış ve bu profil aracılığıyla gönderilen mesajlar saldırganın adresine gönderilebilir.

10. CWE-22 — Improper Limitation of a Pathname to a Restricted Directory (‘Path Traversal’)

Yazılımlarda, sınırlı erişime sahip path’in altında bulunan bir dosya veya dizini tanımlamak üzere tasarlanmış bir path yolu oluşturmak için harici girdi kullanır, ancak Path’in çözülmesine neden olabilecek özel simgeleri düzgün şekilde sanatize etmezse dizinin içinin görünürlüğünü saldırgan sağlayabilir. Birçok dosya işleminin sınırlı bir dizinde gerçekleştirilmesi amaçlanmıştır. Saldırganlar, “..” ve “/” ayırıcılar gibi özel öğeler kullanarak, sistemin başka bir yerinde bulunan dosyalara veya dizinlere erişmek için kısıtlı konumun dışına çıkabilir. En yaygın özel öğelerden biri olan “../” dizisidir. Buna göreli yol geçişi denir.

Örnek 1

Aşağıdaki kod, her kullanıcının profil bilgilerinin ayrı bir dosyada saklandığı bir sosyal ağ uygulaması için olabilir. Tüm dosyalar tek bir dizinde saklanır.

#Ornek Dil: Perl
$Kaynak: cwe.mitre.org

my $dataPath = “/users/cwe/profiles”;
my $username = param(“user”);
my $profilePath = $dataPath . “/” . $username;

open(my $fh, “<$profilePath”) || ExitError(“profile read error: $profilePath”);
print “<ul>\n”;
while (<$fh>) {
print “<li>$_</li>\n”;
}
print “</ul>\n”;

Programcı “/users/cwe/profiles/alice” veya “/users/cwe/profiles/bob” gibi dosyalara erişmeyi amaçlarken, gelen kullanıcı parametresinin doğrulanması söz konusu değildir. Saldırgan aşağıdakiler gibi bir payload ile bu görüntülemeyi bypass edebilir.

../../../etc/passwd

Program şöyle bir pathname oluşturur:

/users/cwe/profiles/../../../etc/passwd

Bu uzantıya gidilirken, işletim sistemi path’i kanonikleştirme sırasında “../” kodunu çözer ve bu dosyaya erişimi gerçekleştirir.

11. CWE-78 — Improper Neutralization of Special Elements used in an OS Command (‘OS Command Injection’)

Saldırgan tarafından enjekte edilen payload, işletim sistemi komutları olarak yürütülür. OS Command Injection saldırıları yalnızca Web Application kodu OS komut çağrıları içeriyorsa ve yapılan bu çağrıda kullanıcı Input noktası bulunuyorsa mümkündür. Dile özgü değildirler — Shell komutu açmamıza izin veren tüm dillerle kullanılabilir.

Örnek 1:

Örneğimizde bir kullanıcının adını kullanıcıdan alırken ve o kullanıcının ana dizininin içeriğini listelemeyi amaçlamaktadır.

#Örnek Dil: PHP
#Kaynak: cwe.mitre.org
$userName = $_POST[“user”];
$command = ‘ls -l /home/’ . $userName;
system($command);

$username değişkeni kullanıcı girişlerini sanatize etmediğinden saldırgan kendi isteğine bağlı olarak OS Com. Inj. Payload’ı kullanabilir.

;rm -rf /

Böylece $command değişkeni;

ls -l /home/;rm -rf /

Dönüşürek çıktı verir. Noktalı virgül Unix’te bir komut ayırıcı olduğundan, OS önce tüm dosya sistemini silerek önce ls komutunu, ardından rm komutunu yürütür.

12. CWE-287 Improper Authentication

Bu zafiyet, ilgili uygulamada bir kullanıcının kimliğini yanlış doğruladığında ortaya çıkar. Yazılım, kullanıcı oturum açma bilgilerini yanlış doğrularsa veya farklı kötü amaçlı kimlik bilgileri toplama tekniklerinin kullanılmasına izin verirse (ör. Kaba kuvvet, kimlik sahtekarlığı), bir saldırgan uygulama içinde belirli ayrıcalıklar kazanabilir veya hassas bilgileri ifşa edebilir.

Örneğin, bir yazılım, uygulama içinde belirli ayrıcalıkları atamak için HTTP GET isteğinde iletilen “group” parametresini kullanır. Parametre “user” değerine eşitse, uygulama bilgileri görüntülemeye izin verir, “admin” değerine eşitse, sayfadaki bilgileri düzenlemek mümkündür.

Örnek 1;

Aşağıdaki kod, kullanıcının zaten oturum açmış olduğundan emin olmayı amaçlamaktadır. Değilse, kod kullanıcı tarafından sağlanan kullanıcı adı ve parola ile kimlik doğrulaması gerçekleştirir. Başarılı olursa, oturum açmış ve kullanıcı çerezlerini kullanıcının zaten oturum açmış olduğunu “hatırlayacak” şekilde ayarlar. Son olarak, oturum açmış kullanıcının kullanıcı çerezine kaydedildiği gibi “Yönetici” kullanıcı adı varsa kod yönetici görevlerini yerine getirir.

#Ornek Dil: Perl

#Kaynak : cwe.mitre.org

my $q = new CGI;
if ($q->cookie(‘loggedin’) ne “true”) {
if (! AuthenticateUser($q->param(‘username’), $q->param(‘password’))) {
ExitError(“Error: you need to log in first”);
}
else {
# Set loggedin and user cookies.
$q->cookie(
-name => ‘loggedin’,
-value => ‘true’
);
$q->cookie(
-name => ‘user’,
-value => $q->param(‘username’)
);
}
}
if ($q->cookie(‘user’) eq “Administrator”) {
DoAdministratorTasks();
}

Ne yazık ki, bu kod atlanabilir. Saldırgan, çerezleri bağımsız olarak ayarlayabilir, böylece kod kullanıcı adını ve şifreyi kontrol etmez. Saldırgan bunu aşağıdaki gibi üstbilgiler içeren bir HTTP isteğiyle yapabilir:

#Kaynak : cwe.mitre.org

GET /cgi-bin/vulnerable.cgi HTTP/1.1
Cookie: user=Administrator
Cookie: loggedin=true

[body of request]

Oturum açan çerez “true” olarak ayarlandığında, saldırgan tüm kimlik doğrulama denetimini atlar. Kullanıcı çerezindeki “Yönetici” değerini kullanarak, saldırgan yazılımı yönetmek için ayrıcalıklar da kazanır.

13. CWE-476 NULL Pointer Dereference

NULL pointer dereference, segmentasyon hatasına neden olan bir hatanın alt türüdür. Bir program NULL işaretçisi ile belleğe okuma veya yazma girişiminde bulunduğunda oluşur. NULL pointer dereference sorunları, race conditions ve basit programlama eksiklikleri de dahil olmak üzere bir dizi kusurla ortaya çıkabilir.

Bu zafiyetin etkili oldukları diller C, C++, C# ve Java’dır.

Bu örnek bir kullanıcıdan bir IP adresi alır, iyi biçimlendirildiğini doğrular ve ardından ana bilgisayar adını arar ve bir buffer’a kopyalar.

Ornek Dil: C
Kaynak: cwe.mitre.org
void host_lookup(char *user_supplied_addr){
struct hostent *hp;
in_addr_t *addr;
char hostname[64];
in_addr_t inet_addr(const char *cp);
/*routine that ensures user_supplied_addr is in the right format for conversion */
validate_addr_form(user_supplied_addr);
addr = inet_addr(user_supplied_addr);
hp = gethostbyaddr( addr, sizeof(struct in_addr), AF_INET);
strcpy(hostname, hp->h_name);
}

Saldırgan iyi biçimlenmiş gibi görünen bir adres sağlar ancak adres bir ana bilgisayar adına çözümlenmezse, gethostbyaddr () çağrısı NULL döndürür. Kod gethostbyaddr’den (CWE-252) dönüş değerini kontrol etmediğinden, strcpy () çağrısında NULL işaretçisi dereference oluşacaktır.

Bu örneğin, bir BoF’a karşı da zayıf olduğunu unutmayın.

Aşağıdaki kodda, programcı sistemin her zaman “cmd” adlı bir özelliğe sahip olduğunu varsayar. Saldırgan programın ortamını “cmd” tanımlanamayacak şekilde denetleyebilirse, trim () yöntemini çağırmaya çalıştığında program bir NULL işaretçi özel durumu atar.

Ornek Dil: Java
String cmd = System.getProperty(“cmd”);
cmd = cmd.trim();

14. CWE-434 Unrestricted Upload of File with Dangerous Type

Ilgili zafiyetli kod sayesinde, saldırganın ürün ortamında otomatik olarak işlenebilecek tehlikeli türlerdeki dosyaları saldırganın karşıya yüklemesini veya aktarmasına izin verir.

Örnek 1:

Aşağıdaki kod, kullanıcının web sunucusuna resim yüklemesine izin vermeyi amaçlamaktadır. Formu kullanıcı tarafında yönlendiren HTML kodunda “file” türünde bir giriş alanı vardır.

#Ornek Dil: HTML
<form action=”upload_picture.php” method=”post” enctype=”multipart/form-data”>

Choose a file to upload:
<input type=”file” name=”filename”/>
<br/>
<input type=”submit” name=”submit” value=”Submit”/>

</form>

Gönderildikten sonra, yukarıdaki form dosyayı web sunucusundaki upload_picture.php dosyasına gönderir. PHP, sunucu tarafı kodu tarafından alınana (veya atılana kadar) dosyayı geçici bir konumda saklar. Bu örnekte, dosya daha kalıcı bir resme / dizine taşınır.

Ornek Dil: PHP
// Define the target location where the picture being
// uploaded is going to be saved.
$target = “pictures/” . basename($_FILES[‘uploadedfile’][‘name’]);
// Move the uploaded file to the new location.
if(move_uploaded_file($_FILES[‘uploadedfile’][‘tmp_name’], $target))
{
echo “The picture has been successfully uploaded.”;
}
else
{
echo “There was an error uploading the picture, please try again.”;
}

Yukarıdaki kodla ilgili sorun, yüklenmekte olan dosya türüyle ilgili bir kontrol olmamasıdır. Web belge kökünde resimlerin / kullanılabilir olduğunu varsayarsak, bir saldırgan şu dosyaya sahip bir dosya yükleyebilir:

malicious.php

Bu dosya adı “.php” ile bittiği için, web sunucusu tarafından yürütülebilir.

15. CWE-611 Improper Restriction of XML External Entity Reference

XXE zafiyetinin varlığı, XML ayrıştırıcısının doğru yapılandırılmadığı durumunu açıklar. Zefiyet, URI’lerle XML objeleri içeren bir XML dosyası istenen konumun dışındaki dokümanlara çözümlenebilecek bir hata dosyası neden olur. Uygulama, belgeleri eklemeden önce belgelerin yolunu kontrol edemezse, saldırgan yerel veya uzak sistemden rasgele dosya ekleyebilir ve uygulamayı görüntülemek için tetikleyebilir.

XXE saldırısı, harici Veri Türü Tanımı (DTD) ve dosyaları okuma veya yürütme özelliğini kullanarak rastgele varlıkları tanımlamak için XML dil yetenekleri etrafında oluşturulur.

Aşağıda, işlendiğinde yerel “/etc/passwd” dosyasının çıktısını döndürebilecek bir XML dosyası örneği verilmiştir: (Kaynak : immuniweb.com)

<?xml version=”1.0" encoding=”ISO-8859–1"?>
<!DOCTYPE test [
<!ELEMENT test ANY >
<!ENTITY xxe SYSTEM “file:///etc/passwd” >]>

Başka bir örnek, aynı güvenlik açığını kullanarak harici bir kaynağın nasıl isteneceğini gösterir:

<?xml version=”1.0" encoding=”ISO-8859–1"?>
<!DOCTYPE test [
<!ELEMENT test ANY >
<!ENTITY xxe SYSTEM “http://www.malicious-website.com/xxe.txt >]>

Saldırgan ayrıca üçüncü taraf yazılımları kullanarak ör. Sistemde rasgele komutlar yürütebilir. “. Aşağıdaki PoC kodu, “/bin/ls” komutunu çalıştırarak geçerli uygulama klasöründeki dosyaları ve dizinleri listeler:

<?xml version=”1.0" encoding=”ISO-8859–1"?>
<!DOCTYPE test [ <!ELEMENT test ANY >
<!ENTITY xxe SYSTEM “expect://ls” >]>

16. CWE-94 Improper Control of Generation of Code (‘Code Injection’)

Code Injection, daha sonra uygulama tarafından yorumlanan / yürütülen injection saldırı türleri için genel terimdir. Bu tür saldırılar güvenilmeyen verilerin kötü işlenmesinden yararlanır. Bu tür saldırılar genellikle uygun input/output veri doğrulamasının olmaması nedeniyle mümkün olur, örneğin:
- İzin verilen karakterler
- Veri formatı
- Beklenen veri miktarı

Code Injection, Command Injection’dan farklıdır, çünkü bir saldırgan yalnızca injection yapılan dilin işlevselliğiyle sınırlıdır. Bir saldırgan bir uygulamaya PHP kodu enjekte edip çalıştırabilirse, yalnızca PHP’nin yapabileceği şeyle sınırlıdır. Command Injection’da, genellikle bir shell, komutları yürütmek için mevcut kodun kullanılmasından oluşur.

Örnek 1:

Bu örnek, kullanıcı iletilerini bir ileti dosyasına yazmaya ve kullanıcıların bunları görüntülemesine izin verir.

#Ornek Dil: PHP
#Kaynak: cwe.mitre.org
$MessageFile = “cwe-94/messages.out”;
if ($_GET[“action”] == “NewMessage”) {
$name = $_GET[“name”];
$message = $_GET[“message”];
$handle = fopen($MessageFile, “a+”);
fwrite($handle, “<b>$name</b> says ‘$message’<hr>\n”);
fclose($handle);
echo “Message Saved!<p>\n”;
}
else if ($_GET[“action”] == “ViewMessages”) {
include($MessageFile);
}

Yazılımcı MessageFile’ın yalnızca veri içermesini istese de, bir saldırgan aşağıdaki gibi bir ileti sağlayabilir:

name=h4x0r
message=%3C?php%20system(%22/bin/ls%20-l%22);?%3E

Bu decode işlemi aşağıdakilere göre yapılır:

<?php system(“/bin/ls -l”);?>

Ilgili kod yürütüldüğünde artık bu kod, kullanıcılar iletileri her görüntülediğinde yürütülür.

17. CWE-798 Use of Hard-coded Credentials

Yazılım’da, kendi gelen kimlik doğrulaması, harici bileşenlere giden iletişim veya dahili verilerin şifrelenmesi için kullandığı parola veya şifreleme anahtarı gibi sabit kodlu kimlik bilgileri içerdiğinde ilgili zafiyet oluşur.

Örnek 1:

Aşağıdaki kod, bir veritabanına bağlanmak için hard-coded bir parola kullanır:

#Ornek Dil: Java

DriverManager.getConnection(url, “scott”, “tiger”);

Bu bilgilere erişimi olan kötücül bir çalışan bu bilgiyi sisteme girmek için kullanabilir.

18. CWE-400 Uncontrolled Resource Consumption

Yazılımda eğer ki, sınırlı bir kaynağın tahsisini ve bakımını düzgün bir şekilde kontrol etmezse, aktörün tüketilen kaynak miktarını etkilemesine ve sonuçta mevcut kaynakların tükenmesiyle oluşan bir zafiyettir. Sınırlı kaynaklar arasında bellek, file system storage, database connection pool girişleri ve CPU bulunur. Saldırgan bu sınırlı kaynakların tahsisini tetikleyebilir, ancak kaynakların sayısı veya boyutu denetlenmezse, saldırgan tüm kullanılabilir kaynakları tüketen bir denial of service(DoS)’a neden olabilir.

Bu kod, her yeni bağlantı aldığında bir socket ayırır ve fork’lar.

//Ornek Dil: C
sock=socket(AF_INET, SOCK_STREAM, 0);
while (1) {
newsock=accept(sock, …);
printf(“A connection has been accepted\n”);
pid = fork();
}

The program does not track how many connections have been made, and it does not limit the number of connections. Bu sayede bir saldırgan tüm diğer bağlantıları tüketerek başkalarının sisteme uzaktan erişmesini engelleyebilir.

19. CWE-772 Missing Release of Resource after Effective Lifetime

Zafiyetli Yazılım, etkin ömrü sona erdikten sonra, yani kaynağa artık gerek kalmadığında kaynağı serbest bırakmadığında oluşan zafiyettir.

Örnek 1

Aşağıdaki kod, bir dosyanın sonuna kadar satır satır okuyarak işlemeyi denemektedir.

#Ornek Dil: Java
#Kaynak : cwe.mitre.org

private void processFile(string fName)
{
BufferReader in = new BufferReader(new FileReader(fName));
String line;
while ((line = in.ReadLine()) != null)
{
processLine(line);
}
}

Yukarıdaki kod ile ilgili sorun asla açtığı file handle’ı kapatmıyor olmasıdır. BufferReader için Finalize () methodu sonunda Close () öğesini çağırır, ancak Finalize () methodu çağrılmadan önce ne kadar süre alacağının garantisi yoktur. Aslında, Finalize () metodunun çağrılmasının garantisi yoktur. Meşgul bir ortamda bu, VM’nin tüm kullanılabilir dosya tanıtıcılarını kullanmasına neden olabilir.

20. CWE-426 Untrusted Search Path

Zafiyetli Uygulama’da, uygulamanın doğrudan denetimi altında olmayan kaynaklara işaret edebilen harici olarak sağlanan bir arama yolu kullanarak kritik kaynakların aranması sağlanır.

Örnek 1;

Bu program, kısıtlı bir dizinin içeriğini listeleyen ve daha sonra diğer eylemleri gerçekleştiren bir komut yürütmeyi amaçlamaktadır. İşletim sisteminin izin denetimini atlamak için setuid ayrıcalıklarıyla çalıştığını varsayarsak.

Example Language: C

#define DIR “/restricted/directory”

char cmd[500];
sprintf(cmd, “ls -l %480s”, DIR);
/* Raise privileges to those needed for accessing DIR. */

RaisePrivileges(…);
system(cmd);
DropPrivileges(…);

Saldırgan yalnızca amaçlanan program davranışı olan DIR içeriğini görebilir. Son olarak, programcı yükseltilmiş ayrıcalıklarla çalışan kodu sınırlamaya da dikkat eder.

--

--

Alican Kiraz
Alican Kiraz

Written by Alican Kiraz

Head of Cyber Defense Center @Trendyol | CSIE | CSAE | CCISO | CASP+ | OSCP | eCIR | CPENT | eWPTXv2 | eCDFP | eCTHPv2 | OSWP | CEH Master | Pentest+ | CySA+

No responses yet