Web Saldırıları 101

SOC

Bu yazımızda Web saldırılarına değineceğiz ve kısa açıklamalarını yaparak örnekler göreceğiz.

Web uygulamaları bir tarayıcı arayüzü aracılığı ile kullanıcılara hizmet sağlayan uygulamalardır.Acunetix tarafından yapılan bir araştırmaya göre gerçekleştirilen tüm siber saldırıların %75 i web uygulaması düzeyinde olduğu belirtildi.Bu yöntemlerden bazıları şunlardır;

  • SQL injection
  • Cross Site Scripting
  • Command İnjection
  • IDOR
  • RFI ve LFI
  • File Upload(Web Shell)

Açık Web uygulama Güvenliği Projesi (OWASP),yazılım güvenliği arttırmak için çalışan kar amacı gütmeyen bir kuruluştur.OWASP her 2 yılda bir en kritik güvenlik risklerini taşıyan 10 web uygulaması güvenlik açığını listesini yayınlar.

OWASP web uygulamalarındaki güvenlik açıklılarını taramaya yardımcı olan zap aracının geliştirmiştir.

OWASP güvenlik araştırmacılarının kendini geliştirmesi için node.js ile savunmasız juice_shop adında bir proje gerçekleştirmiştir.

Web saldırılarını anlayabilmemiz için HTTP isteklerini bilmemiz gerekir bu yüzden bir HTTP isteğine göz atalım.

  1. GET methodu ile kaynağın sunucudan istendiği belirtilir.
  2. HOST tarayıcılar istenen kaynağın hangi alana ait olduğunu tanımlamak için host başlığını kullanır.
  3. COOKIE Bir web uygulaması müşterinin cihazında bilgi depolamak istediğinde ,bunu bir ‘çerez’ olarak saklar.Çerezler genelde oturum bilgilerini tutar.
  4. Ugrade-Insecure-Request İstemcinin şifreleme(SSL) ile bağlantı kurmak istediğini belirtir.
  5. User-Agent İstemcinin tarayıcı ve işletim sistemi ile ilgili bilgileri verir.
  6. ACCEPT İstenen veri türü burada belirtilir.
  7. Accept-Encoding İstemcinin anladığı kodlama türünü belirtir.
  8. Accept-Language İstemcilerin dil bilgilerini belirtir.
  9. Connection HTTP bağlantısının nasıl yapılacağını gösterir
  10. HTTP POST yöntemi kullanılıyorsa burada POST parametleri görüntülenebilir.

Şimdide HTTP yanıtlarına göz atalım

  • Durum Satırı olarak belirtilen bölümde http yanıt durum kodu hakkında bilgi verilir.HTTP durum kodları şu şekildedir
    • 100-199 :Bilgilendirici Yanıtlar
    • 200-299 :Başarılı Yanıtlar
    • 300-399 :Yönlendirme Mesajları
    • 400-499 :İstemci Hata yanıtları
    • 500-599 :Sunucu hata yanıtları
  • Yanıt Başlıkları
    • Tarih :Sunucunun HTTP yanıtını istemciye gönderdiği tam saat
    • Bağlantı :HTTP istek başlığında olduğu gibi bağlantının nasıl ele alınacağı
    • Sunucu :Sunucunun işletim sistemi ve web sunucusunun bilgileri
    • Son değiştirilme : İstenen kaynağın son değiştirilme bilgisi
    • İçerik Türü : Gönderilen veririn türü
    • İçerik Uzunluğu : Gönderilen verinin boyutu
  • Yanıt gövdesi
    • Sunucu tarafından gönderilen ve istemci tarafından istenen kaynağı içerir.

SQL Injection

Bir saldırgan tarafından veri tabanına gönderilen SQL sorgularını manipüle etmesine olanak tanıyan bir güvenlik açığıdır. 3 tür SQL injeciton saldırısı vardır.

  • Bant içi SQL inj : Aynı kanal üzerinden saldırgan bir SQL sorgusu gönderip yanıt alıyorsa bu bant içi SQL injection olarak tanımlanır.
  • Çıkarımsal SQL inj : Görülemeyen bir yanıt alan SQL sorgularına denir.
  • Bant dışı SQL inj : Farklı kanal üzerinden saldırgan bir SQL sorgusu gönderip yanıt alıyorsa bu bant dışı SQL injection olarak tanımlanır.Örneğin DNS üzerinden bir yanıt alınıyorsa

SQL Injection nasıl çalışır ?

Günümüzdeki web uygulamarı çoğunlukla kullanıcıdan bir veri alır ve bu verileri içeriği görüntülemek için kullanır.Giriş sayfalarında çoğunlukla SQL Injection gerçekleşir.

Bir kullanıcıdan genellikle giriş sayfasında kullanıcı adı ve şifre girer ve web uygulaması bu verileri alıp aşağıdaki şekilde bir SQL sorgusu oluşturur.

SELECT * FROM kullanıcılar WHERE kullanıcı adı = ‘KULLANICI ADI’ ve şifre =’KULLANICI_ŞİFRE’

Bu sorgunun anlamı adı “KULLANICI ADI ” ve şifresi “KULLANICI_ŞİFRE” olan kullanıcılar tablosundaki kullanıcıya ait tüm bilgileri bana getir demek oluyor.Eğer web uygulaması eşleşen bir kullanıcı bulursa başarılı oturum açar , bulamazsa oturum açılmaz.

Diyelim ki kullanıcı adımız “siber”, şifremiz “güvenlik” olsun ve şu şekilde bir sorgu gerçekleşecek

SELECT *FROM kullanıcılar WHERE kullanıcı adı = ‘siber’ ve şifre ‘güvenlik’

Biz bunu tasarlandığı şekilde kullanmasaydık kullanıcı adı alanına ‘ (kesme işareti) koysaydık SQL sorgusu şuna dönecekti

SELECT *FROM kullanıcılar WHERE kullanıcı adı = ‘siber” ve şifre ‘güvenlik’

Böyle bir hata ile karşılacaktık ama bu saldırgan için güzel birşey olacaktır.Saldırgan buradaki hata mesajlarını manipüle edebilir ve ona doğru bir komut olduğu gösterebilir.Eğer saldırgan kullanıcı adı bölümüne ‘ OR 1=1 — – kodunu girerse SQL sorgusu şu şekilde olacaktır.

SELECT *FROM kullanıcı WHERE kullanıcı adı = ” OR 1=1 ve şifre = ‘güvenlik’

SQL’de “– – ” den sonra gelen karakterler yorum satırı olarak algılanacaktır.Yani yukarıdaki SQL sorgusu şu şekilde olacaktır

SELECT *FROM kullanıcı WHERE kullanıcı adı = ” OR 1=1

Bu sorgunun anlamı “eğer kullanıcı adı boşsa veya 1=1 ise ” bu yüzden kullanıcı adının boş bırakılıp bırakılmaması pek önemli değil çünkü her zaman 1=1 eşit olacağı için sorgu çalışacaktır ve büyük ihtimal veri tabanındaki ilk girişi çağıracaktır ve saldırgan web uygulamasına başarılı bir şekilde girecektir.

SQL Injection Saldırılarından Nasıl Yararlanırlar ?

  • Authentication bypass (Kimlik doğrulama bypass’ı)
  • Command Execution(Komut çalıştırma)
  • Exfiltrating sensitive data (hassas veri sızdırma)
  • Creating/deleting/Updating database entries (Veritabanı girişlerini güncelleme /silme/oluşturma)

SQL Injection nasıl önlenir ?

  • Gelen parametreleri doğrulama ve filtreleme önlemi alınabilir
  • Minimum yetkilendirme web uygulaması üzerinden veri tabanına erişim sağlayan kullanıcının minimum yetkilere sahip olmasını sağlayabiliriz.
  • Web Application Firewall ile belirli kalıpları veya imzaları tarama yapabiliriz.
  • Güncel ve güvenli yazılımlar kullanmalıyız.

SQL Injection Tespit Etme

Bir acces.log ‘da aşağıdaki maddelerin kontrolünü sağlayabiliriz.

  • Bir web isteğinin kullanıcıdan gelen tüm alanlarını kontrolü sağlanması gerekmektedir.
  • SQL anahtar kelimelerini SELECT , WHERE INSERT ,UNION gibi kelimeleri arayabiliriz.
  • Özel karakterleri kontrol edebiliriz.(‘),(-)
  • SQL Injection saldırılarında kullanılan payload listesine hakim olmakta fayda vardır.
  • Otomatik olarak kullanılan toolları bilmekte fayda var.Örneğin en sıklıkla kullanılan Sqlmap aracı vardır.
    • User-Agent bilgisinin kontrolü sağlayabiliriz burada kullanılan arac gözükebilir.
    • İsteklerin sıklıklarını kontrol edebiliriz.
    • Veri yükünün içeriğine bakabiliriz.Örneğin tool tarafından gönderilen bir payload şu şekilde görülebilir. sqlmap ‘ OR 1=1

SQL Injection saldırısının başarılı olup olmadığını yanıta bakarak anlamak biraz zor olabilir ,Saldırının aynı sayfada ve id değişkeni üzerinden gerçekleştirilmesi nedeniyle tüm yanıtlar yaklaşık aynı büyüklükte olacağını varsayabiliriz.Yanıtın büyüklüğüne bakarak saldırının başarısını tahmin edebiliriz.

Cross Site Scripting (XSS) nedir ?

Siteler arası komut dosyası çalıştırma ,meşru web uygulamalarına dahil edilen ve kötü amaçlı kodların çalıştırılmasına olanak tanıyan bir tür güvenlik açığıdır. 3 farklı türü vardır ;

  • Reflected XSS : XSS payloadının istekte bulunması gereken ,kalıcı olmayan türdür.XSS ‘in en yaygınıdır.
  • Stored XSS : Saldırganın payloadın kalıcı olarak web uygulamasına yükleyebildiği XSS türüdür.
  • DOM Tabanlı XSS : HTML dökümanında Javascript ile eriştiğimiz nesnelerde doğan XSS türüdür.Girdilerini genelde # işaretinden sonra alır ve bundan dolayı işlenen veri sunucuya gönderilmez ve browserda kalır.

Cross Site Scripting Tespit Etme

  • Anahtar kelime araması yapabiliriz.(alert,script gibi)
  • Sık kullanılan XSS payloadlarına hakim olmak tespiti kolaylaştırabilir.
  • Özel karakter kullanımı kontrolünü sağlayabiliriz.(> ,< işaretleri)

Yukarıdaki acces.log örneğinde isteklerin /blog/ sayfasına yapıldığını ve s parametre değerlerinin değiştiğini görebilmekteyiz.İlgili anahtar kelimelerin kullandığı isteği tespit ettikten sonra bir URL decode etme işlemi ile kullanılan payloadı tespit edebiliriz.

Loglara baktığımızda script,prompt,console.log gibi javascript ile ilgili kelimeleri görüyoruz.Javascript gördüğümüzde aklımıza hemen XSS geliyor.Aynı zamanda user agent bilgisinde kullanılan otomatik aracı görebilmekteyiz (python-urllib).

Command Injection

Command Injection saldırları bir kullanıcıdan alınan veriler filtrelenmediğinde ve doğrudan işletim sistemi kabuğuna iletildiğinde gerçekleşen saldırılardır.Bu saldırı biçiminde saldırganın önceliğinin sistemin kontrolünü ele geçirmek olmasıdır. Örneğin bir kullanıcının dosyasını tmp klasörüne koplayan temel bir web uygulaması olsun aşağıdaki kod gibi

Buraya biz deneme.txt adında bir dosya yüklersek tmp klasörü altına alınacak bunun yerine deneme;ls;.txt dosyasını yüklersek buradaki ls komutu yani dizin listeleme komutu çalışacaktır ve dizindeki dosyaları bize listeleyecektir.

Saldırgan burada doğru payloadı kullanır ise bir reverse shell işlemi yapacaktır.

Command Injection Tespit Etme

  • Bir web isteğini incelerken tüm alanların kontrolü
  • Komutlar ile ilgili anahtar kelime kontrolü (dir,ls,cp,cat,type vb)
  • Sık kullanılan command ınjection payloadları

Shellshock isimli bir güvenlik açığının istismar edilmesi sonucu ele geçirilen bir isteği inceleyelim;

GET isteğini incelediğimiz taktirde User-Agent bilgisinde bir şüpheli durum görüntülenmektedir.Burada yer alan bash komutu çalıştırıldığında /etc/passwd dosyasının içeriğini saldırgana HTTP response başlığında “NS” olarak döndürecektir.

IDOR(Insecure Direct Object Reference)

Güvenli olmayan doğrudan nesne referansı ,bir yetkilendirme mekanizmasının bulunmamasından veya doğru kullanılmamasından kaynaklanan bir güvenlik açığıdır.Bir kişisinin başkasına ait bir nesneye erişmesini sağlar.

Saldırgan,web uygulamasına gönderilen parametreleri manipüle ederek kendisine ait olmayan bir nesneye erişim sağlar ve içeriğini okuyabilir,değiştirebilir veya silebilir.

Bir örnek verecek olursak temel bir web uygulamasında kullanıcıdan “id” değişkeni alır ve istekte bulunan kullanıcıya ait verileri görüntüler.Eğer web uygulaması bu id değişkenini kontrol etmiyorsa “id=1 yerine 2 ” yazarsam id=2 deki kullanıcının bilgilerini görüntülemiş olurum.

IDOR güvenlik açığından yararlanılırsa;

  • Kişisel bilgileri elde etme
  • Yetkisiz Belgelere erişim
  • Yetkisiz işlemler yapmak gibi durumlar gerçekleşebilir.

IDOR Saldırlarını Tespit etme;

  • Tüm parametreleri kontrol edilmesi
  • Aynı sayfa için yapılan taleplerin sayısına bakılması
  • Bir model bulmaya çalışmak.Örneğin id=1,id=2,id=3 gibi istekler görüyorsanız şüphelenmeliyiz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir