---
title: 'İstek Manipülasyonu'
source: 'https://academia.sh/tr/kurslar/sizma-testi/istek-manipulasyonu'
course: 'Güvenlik Araçları ve Sızma Testi'
language: tr
updated: '2026-08-17T18:08:40+00:00'
license: 'CC BY-SA 4.0'
---

# İstek Manipülasyonu

Vekil araçla istek değiştirmenin bir doğrulama adımı olarak ölçülmesi: 18 adayın 40 planlı isteği, yalnız gözleyen isteklerle 6 adayın karara bağlanması ve sıfır uyarı üretilmesi, en geniş kuralla 14 adayın karara bağlanıp 16 uyarı üretilmesi, üç kural kümesinde de kapsam dışı hedefe giden istek sayısının sıfır kalması ve gerçekte açık iki adayın hiçbir kuralla kanıtlanamaması.

Önceki iki araç yalnız bakıyordu. İkisinin de sınırı aynıydı: bir alanın belirli bir değerle
geçtiğini görmek, o alana başka bir değer geldiğinde sistemin ne yapacağını söylemez. Bir adayın
gerçekten açık olduğunu göstermenin tek yolu isteği değiştirip yanıtı görmektir — ve bu, kursta
ilk kez hedefe **dokunan** adımdır.

**Vekil araç**, istemci ile sunucu arasına girip isteği durdurur, değiştirir ve yeniden gönderir.
Bu dersin konusu aracın kullanımı değil, o araçla yapılan işin **muhasebesidir**: bir adayı
kanıtlamak kaç istek ister, bu isteklerin kaçı hedefte kalıcı bir şey değiştirir, kaçı hizmeti
kesme riski taşır ve hangileri kapsamın dışına taşar. Hiçbir istek içeriği, dizge ya da yük
yazılmaz; istekler yalnız sınıflarıyla sayılır.

## İki Ayrı Sınıflandırma

Bir doğrulama isteği iki bağımsız eksende sınıflandırılır ve ikisi karıştırılırsa kapsam denetimi
kurulamaz.

Birincisi **risk sınıfıdır**. `g` yalnız gözleyen istektir: hedefin durumunu değiştirmez, aynı
istek tekrar gönderildiğinde aynı sonucu verir. `d` hedefte durum değiştiren istektir: bir kayıt
yazar, bir oturum açar, bir sayacı ilerletir; geri alınabilir olması ayrı bir koşuldur. `y` hizmeti
kesme riski taşıyan istektir; hız sınırı ve kaynak tüketimiyle ilgili adayların doğrulanmasında
kaçınılmaz olur.

İkincisi **kapsam sınıfıdır**. `kapsam-ici` hedef, katılım kurallarında adı geçen ve üzerinde
değişiklik yapılmasına izin verilen hedeftir. `paylasilan` hedef aynı ortamda başka kiracıların da
bulunduğu bir yerdir: gözlemek serbesttir, durum değiştirmek başkasının verisine dokunma riski
taşıdığı için değildir. `kapsam-disi` hedef üçüncü tarafa aittir ve **hiçbir istek gönderilemez**.
Kapsam dışı bir hedefe tek bir gözlem isteği göndermek bile verilen yetkiyi geçersiz kılar; o an
yapılan iş yetkisiz erişim olur ve yasal sonuç doğurur.

- **AA15.** Aday listesi, plan uzunlukları, kapsam sınıfları ve `gercek` alanı **modeldir**.
  `gercek`, adayın doğrulama sonunda ortaya çıkacak durumudur; doğrulamadan önce bilinmez ve
  yalnız modelin sonucu hesaplayabilmesi için yazılmıştır.
- **AA16.** Doğrulama planı bir adayın açık olduğunu göstermek için gereken **en kısa** istek
  dizisidir. Plan uzunlukları elle yazıldı.
- **AA17.** Bir plan ancak **bütün** adımları çalıştırılabiliyorsa sonuç üretir. Eksik çalışan plan
  "açık değil" demez; `dogrulanamadi` der.
- **AA18.** Her istek hedefte bir kayıt üretir. Uyarı sayısı risk sınıfına bağlıdır: `g` sıfır,
  `d` bir, `y` üç. Süreler istek başına elle yazıldı.
- **AA19.** Kapsam denetimi programlıdır: izin verilen istek sınıfı, kural kümesi ile kapsam
  sınıfının kesişimidir. Kesişim boşsa istek gönderilmez.
- **AA20.** Üç kural kümesi, katılım kurallarının üç ayrı sıkılık düzeyini temsil eder.
- **AA21.** Yanlış pozitif, planı tam koşan ve açık olmadığı görülen adaydır; bu adayın raporda
  yeri yoktur.

```js
// vek/dogrula.mjs — vekil aracla dogrulamanin ADIM SAYISI ve RISK SINIFI modelidir.
// Hicbir istek icerigi, dizge ya da yuk yazilmaz; istekler yalniz sinifiyla sayilir.
// g = yalniz gozleyen (durum degistirmez), d = hedefte durum degistiren,
// y = hizmeti kesme riski tasiyan.
export const RISK = {
  g: { kayit: 1, uyari: 0, dk: 2 },
  d: { kayit: 1, uyari: 1, dk: 5 },
  y: { kayit: 1, uyari: 3, dk: 15 },
};

// Kapsam sinifi: her hedefte hangi istek siniflari gonderilebilir.
export const KAPSAM = {
  'kapsam-ici':  ['g', 'd', 'y'],
  'paylasilan':  ['g'],            // ayni ortamda baska kiracilar var
  'kapsam-disi': [],               // ucuncu taraf; hicbir istek gonderilemez
};

// Katilim kurallari: hangi risk sinifina izin veriliyor.
export const KURAL = {
  'yalniz-gozlem':    ['g'],
  'geri-alinabilir':  ['g', 'd'],
  'yazili-ek-izinle': ['g', 'd', 'y'],
};

// satir: aday | aday sinifi | hedef kapsami | gercekte acik mi | dogrulama plani
export const ADAY = `
  aa01 bilgi-ifsasi    kapsam-ici  evet  g,g
  aa02 yetki-denetimi  kapsam-ici  evet  g,g,d
  aa03 oturum-yonetimi kapsam-ici  hayir g,g,d
  aa04 yapilandirma    kapsam-ici  evet  g
  aa05 girdi-dogrulama kapsam-ici  evet  g,d,d
  aa06 hiz-siniri      kapsam-ici  evet  g,y
  aa07 bilgi-ifsasi    paylasilan  hayir g,g
  aa08 yetki-denetimi  paylasilan  evet  g,d
  aa09 yapilandirma    kapsam-disi evet  g
  aa10 girdi-dogrulama kapsam-ici  hayir g,d
  aa11 oturum-yonetimi kapsam-ici  evet  g,g,g
  aa12 hiz-siniri      kapsam-ici  hayir g,y
  aa13 bilgi-ifsasi    kapsam-ici  hayir g
  aa14 yetki-denetimi  kapsam-ici  evet  g,g,d,d
  aa15 girdi-dogrulama paylasilan  hayir g,d
  aa16 yapilandirma    kapsam-ici  hayir g,g
  aa17 oturum-yonetimi kapsam-disi hayir g,d
  aa18 hiz-siniri      kapsam-ici  evet  g,g,y
`.trim().split('\n').map((r) => {
  const [ad, sinif, hedef, gercek, plan] = r.trim().split(/\s+/);
  return { ad, sinif, hedef, gercek: gercek === 'evet', plan: plan.split(',') };
});

// Bir adayin bir kural kumesindeki sonucu.
export function sonuc(a, kural) {
  const izin = KURAL[kural].filter((s) => KAPSAM[a.hedef].includes(s));
  const calisan = a.plan.filter((s) => izin.includes(s));
  const tam = calisan.length === a.plan.length;
  const s = { calisan: calisan.length, atlanan: a.plan.length - calisan.length,
    kayit: 0, uyari: 0, dk: 0 };
  for (const adim of calisan) { s.kayit += RISK[adim].kayit; s.uyari += RISK[adim].uyari; s.dk += RISK[adim].dk; }
  s.durum = tam ? (a.gercek ? 'kanit' : 'yanlis-pozitif') : 'dogrulanamadi';
  return s;
}

export function kuralOlc(kural) {
  const t = { kanit: 0, yanlisPozitif: 0, dogrulanamadi: 0, istek: 0, atlanan: 0,
    kayit: 0, uyari: 0, dk: 0, kapsamDisiDokunus: 0 };
  for (const a of ADAY) {
    const s = sonuc(a, kural);
    t[s.durum === 'yanlis-pozitif' ? 'yanlisPozitif' : s.durum] += 1;
    t.istek += s.calisan; t.atlanan += s.atlanan;
    t.kayit += s.kayit; t.uyari += s.uyari; t.dk += s.dk;
    if (a.hedef === 'kapsam-disi' && s.calisan > 0) t.kapsamDisiDokunus += 1;
  }
  return t;
}
```

## On Sekiz Aday, Üç Kural Kümesi

```js
// vek/olc.mjs — on sekiz aday uc kural kumesinden gecirilir.
import { ADAY, KURAL, RISK, sonuc, kuralOlc } from './dogrula.mjs';

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());

const plan = ADAY.flatMap((a) => a.plan);
console.log(`${ADAY.length} aday, ${plan.length} planli istek: ` +
  ['g', 'd', 'y'].map((s) => `${s}=${plan.filter((x) => x === s).length}`).join(' '));
console.log(`gercekte acik olan aday ${ADAY.filter((a) => a.gercek).length} (model; ` +
  `dogrulamadan once bilinmiyor)`);

const A = [-6, -16, -12, 6, 8, 16];
console.log('\n1. aday basina plan ve sonuc (kural: geri-alinabilir)');
y(A, 'aday', 'sinif', 'hedef', 'plan', 'kosan', 'sonuc');
for (const a of ADAY) {
  const s = sonuc(a, 'geri-alinabilir');
  y(A, a.ad, a.sinif, a.hedef, a.plan.join(''), s.calisan, s.durum);
}

const B = [-18, 7, 16, 16, 8, 9, 8, 8, 7];
console.log('\n2. kural kumesi basina toplam');
y(B, 'kural', 'kanit', 'yanlis pozitif', 'dogrulanamadi', 'istek', 'atlanan', 'kayit', 'uyari', 'dk');
for (const k of Object.keys(KURAL)) {
  const t = kuralOlc(k);
  y(B, k, t.kanit, t.yanlisPozitif, t.dogrulanamadi, t.istek, t.atlanan, t.kayit, t.uyari, t.dk);
}

console.log('\n3. kapsam denetimi');
for (const k of Object.keys(KURAL))
  console.log(`  ${k.padEnd(18)} kapsam disi hedefe giden istek: ${kuralOlc(k).kapsamDisiDokunus}`);

const g = kuralOlc('yalniz-gozlem'), e = kuralOlc('yazili-ek-izinle');
console.log(`\nyalniz gozlemle karara baglanan aday   ${g.kanit + g.yanlisPozitif} / ${ADAY.length}`);
console.log(`en genis kuralla karara baglanan aday  ${e.kanit + e.yanlisPozitif} / ${ADAY.length}`);
console.log(`hicbir kuralla dogrulanamayan aday     ${e.dogrulanamadi}`);
const acikAmaKanitsiz = ADAY.filter((a) => a.gercek && sonuc(a, 'yazili-ek-izinle').durum !== 'kanit');
console.log(`  bunlarin gercekte acik olani         ${acikAmaKanitsiz.length} ` +
  `(${acikAmaKanitsiz.map((a) => a.ad).join(', ')})`);
console.log(`bir uyari basina kazanilan kanit       ` +
  `${((e.kanit - g.kanit) / (e.uyari - g.uyari)).toFixed(2)}`);
```

```
18 aday, 40 planli istek: g=27 d=10 y=3
gercekte acik olan aday 10 (model; dogrulamadan once bilinmiyor)

1. aday basina plan ve sonuc (kural: geri-alinabilir)
aday  sinif           hedef         plan   kosan           sonuc
aa01  bilgi-ifsasi    kapsam-ici      gg       2           kanit
aa02  yetki-denetimi  kapsam-ici     ggd       3           kanit
aa03  oturum-yonetimi kapsam-ici     ggd       3  yanlis-pozitif
aa04  yapilandirma    kapsam-ici       g       1           kanit
aa05  girdi-dogrulama kapsam-ici     gdd       3           kanit
aa06  hiz-siniri      kapsam-ici      gy       1   dogrulanamadi
aa07  bilgi-ifsasi    paylasilan      gg       2  yanlis-pozitif
aa08  yetki-denetimi  paylasilan      gd       1   dogrulanamadi
aa09  yapilandirma    kapsam-disi      g       0   dogrulanamadi
aa10  girdi-dogrulama kapsam-ici      gd       2  yanlis-pozitif
aa11  oturum-yonetimi kapsam-ici     ggg       3           kanit
aa12  hiz-siniri      kapsam-ici      gy       1   dogrulanamadi
aa13  bilgi-ifsasi    kapsam-ici       g       1  yanlis-pozitif
aa14  yetki-denetimi  kapsam-ici    ggdd       4           kanit
aa15  girdi-dogrulama paylasilan      gd       1   dogrulanamadi
aa16  yapilandirma    kapsam-ici      gg       2  yanlis-pozitif
aa17  oturum-yonetimi kapsam-disi     gd       0   dogrulanamadi
aa18  hiz-siniri      kapsam-ici     ggy       2   dogrulanamadi

2. kural kumesi basina toplam
kural               kanit  yanlis pozitif   dogrulanamadi   istek  atlanan   kayit   uyari     dk
yalniz-gozlem           3               3              12      25       15      25       0     50
geri-alinabilir         6               5               7      32        8      32       7     85
yazili-ek-izinle        8               6               4      35        5      35      16    130

3. kapsam denetimi
  yalniz-gozlem      kapsam disi hedefe giden istek: 0
  geri-alinabilir    kapsam disi hedefe giden istek: 0
  yazili-ek-izinle   kapsam disi hedefe giden istek: 0

yalniz gozlemle karara baglanan aday   6 / 18
en genis kuralla karara baglanan aday  14 / 18
hicbir kuralla dogrulanamayan aday     4
  bunlarin gercekte acik olani         2 (aa08, aa09)
bir uyari basina kazanilan kanit       0.31
```

## Doğrulamanın Asıl Kazancı

İkinci tablonun ilk iki sütunu birlikte okunur. Yalnız gözlem kuralında 3 kanıt ve 3 yanlış pozitif
çıkıyor; en geniş kuralda 8 kanıt ve 6 yanlış pozitif. Rapor açısından bu iki sütun **eşit
değerdedir**. Altı yanlış pozitifi elemek, düzeltme ekibinin altı satırla uğraşmasını önler; her
satır bir inceleme, bir tartışma ve çoğu zaman bir değişiklik talebi demektir. Kanıtlanmış bulgu
kadar **elenmiş aday** da doğrulamanın ürünüdür.

Üçüncü sütun ise raporun en dürüst kısmıdır. `dogrulanamadi`, "bu aday açık değil" demek değildir;
"bu adayı kuralların içinde kalarak karara bağlayamadım" demektir. Bu ayrımın kaybolması sızma testi
raporlarının bilinen kusurudur: doğrulanamayan aday sessizce düşürülür ve kurum, hiç bakılmamış bir
kalemi bakılmış sanır. On sekiz adayın en geniş kuralda bile dördü bu sütunda kalır ve modelin
`gercek` alanına bakıldığında **ikisinin gerçekten açık** olduğu görülür.

O iki aday hangileridir sorusu, dersin en önemli satırıdır. `aa08` paylaşılan bir ortamdadır: onu
kanıtlamak için gereken durum değiştiren istek, aynı ortamdaki başka kiracıların verisine
dokunabileceği için gönderilemez. `aa09` üçüncü tarafa aittir ve tek bir gözlem isteği bile
gönderilemez. İkisi de gerçekten açıktır ve ikisi de kanıtlanmadan raporlanır — bulgu değil,
**kapsam dışında kalmış risk** olarak.

## Planın Uzunluğu Bir Bulgudur

Birinci tablodaki `plan` sütunu tek başına bilgi taşır. Dört adayın planı tek istektir; birinin
planı dört istek uzunluğundadır ve ikisi durum değiştiren sınıftadır. Bu fark rastlantı değildir:
bir adayı kanıtlamak için gereken istek sayısı, o adayın **önündeki denetim sayısıyla** doğru
orantılıdır. Tek istekle gösterilebilen bir yapılandırma kalemi, önünde hiçbir denetim olmadığı
için tek isteklik kalmıştır; dört istek isteyen yetki denetimi kalemi ise ancak bir dizi koşul
sağlandıktan sonra kendini gösterir.

Bu, raporda iki yönde kullanılır. Kısa planlı bir bulgu daha ciddidir çünkü aynı kısalık saldırgan
tarafında da geçerlidir. Uzun planlı bir bulgu ise düzeltme önceliğinde geriye düşebilir, ama bunun
gerekçesi "zor" değil, **kaç koşulun birlikte sağlanması gerektiğidir** ve o koşullar tek tek
yazılır.

Planın uzunluğu maliyet tarafında da doğrudan çarpandır. Kırk planlı isteğin 27'si gözlem
sınıfındadır; en geniş kuralda çalışan 35 isteğin 25'i gözlem, 7'si durum değiştiren, 3'ü kesme
riski taşıyandır. Toplam 130 dakikanın 50'si gözlem isteklerinden, kalan 80 dakika ise yalnız on
istekten gelir. Doğrulamanın süresi istek sayısıyla değil, **istek sınıfıyla** belirlenir.

Vekil aracın kaydettiği istek ve yanıt çiftleri, sonraki aşamada yeniden üretim adımlarının ham
maddesi olur. Rapora giren şey bu ham kayıt değildir: sınıf, sayı, koşul ve gözlenen sonuç yazılır.
Bir doğrulama kaydının olduğu gibi rapora eklenmesi, raporu okuyan herkese aynı isteği yeniden
gönderme yeteneği vermek demektir ve bu, düzeltme sürecinin riskini gereksiz yere büyütür.

## Adım Sayısı ve Bırakılan İz

Kural kümesi genişledikçe üç sayı birlikte artıyor. İstek 25'ten 35'e, süre 50 dakikadan 130
dakikaya, uyarı 0'dan 16'ya çıkıyor. Kayıt sayısı istekle birebir gidiyor çünkü her istek hedefte
bir kayıt bırakıyor; ayırt edici olan **uyarı** sütunudur.

Yalnız gözleyen isteklerle yürütülen bir doğrulama 25 kayıt üretir ve **hiçbir uyarı** üretmez.
Savunma tarafından bakıldığında bu, günlük dosyasında sıradan bir istek yığınıdır; ancak sonradan,
hacim ve düzen üzerinden bir çözümlemeyle fark edilir. Durum değiştiren istekler açılınca yedi
uyarı, hizmet kesme riski taşıyanlar açılınca on altı uyarı doğuyor. Buradaki asıl sayı marjinal
orandır: yalnız gözlemden en geniş kurala geçiş **beş ek kanıt** kazandırırken **on altı uyarı**
üretiyor — uyarı başına 0,31 kanıt.

Bu oran, katılım kurallarının neden pazarlık konusu olduğunu açıklar. Uyarıların bir bölümü
savunmanın gerçekten çalıştığının işaretidir ve mavi takımın bunları görmesi istenir. Bir bölümü ise
nöbetçi ekibi gerçek bir olay sanıp müdahaleye başlatır; test penceresi, iletişim kanalı ve önceden
bildirilen kaynak listesi tam olarak bunun için yazılır. Uyarı sayısını sıfırda tutmak da bir
seçenektir ama bedeli açıktır: on sekiz adayın on ikisi karara bağlanmadan kalır.

Üçüncü tablo üç kural kümesinde de aynı sayıyı veriyor: kapsam dışı hedefe giden istek **sıfır**.
Bu sayı bir sonuç değil, bir **değişmezdir**; hangi kural kümesi seçilirse seçilsin sıfır kalmak
zorundadır. Kapsam denetimini araca ya da kişiye bırakmak yerine plan üzerinde programlı çalıştırmak
bunu güvence altına alır: istek gönderilmeden önce hedefin sınıfı sorulur, kesişim boşsa adım
atlanır ve atlandığı yazılır.

## Özet

- On sekiz adayın doğrulama planları toplam 40 istek içerir: 27 yalnız gözleyen, 10 durum
  değiştiren, 3 hizmet kesme riski taşıyan.
- Kural kümesi genişledikçe karara bağlanan aday 6'dan 14'e çıkar; kanıt 3'ten 8'e, elenen yanlış
  pozitif 3'ten 6'ya yükselir. Elenen aday da doğrulamanın ürünüdür.
- Yalnız gözleyen isteklerle yürütülen doğrulama 25 kayıt ve sıfır uyarı bırakır; en geniş kuralda
  35 kayıt ve 16 uyarı doğar. Marjinal oran uyarı başına 0,31 kanıttır.
- Dört aday hiçbir kural kümesiyle doğrulanamaz ve ikisi gerçekte açıktır; bunlar bulgu olarak
  değil, kapsam dışında kalmış risk olarak raporlanır.
- Planın uzunluğu adayın önündeki denetim sayısını ölçer; tek istekle gösterilen bir kalem, aynı
  kısalığın saldırgan tarafında da geçerli olması nedeniyle daha ciddidir.
- Kapsam denetimi programlıdır ve üç kural kümesinde de kapsam dışı hedefe giden istek sıfırdır;
  bu bir sonuç değil, korunması gereken bir değişmezdir.

## Sonraki Adım

Bu üç araç da ağ üzerinde çalışıyordu: trafiği kaydettiler, alanları okudular, isteği değiştirip
yanıtı gördüler. Değerlendirme sırasında incelenmesi gereken kalemlerin bir bölümü ise ağdan değil
**dosyadan** gelir: bir uçta bulunan bilinmeyen bir çalıştırılabilir, bir posta ekinden çıkan arşiv,
saha ekibinin dışarıdan aldığı bir yardımcı araç. Bunların ne yaptığını istek göndererek
öğrenmek mümkün değildir.

Sonraki ders sanal alan çözümlemesini bu eksende ele alır. Uç Nokta Güvenliği kursunda sanal alanın
yalıtım gücü ölçülmüştü; burada o ölçüm girdi olarak alınır ve tek bir soru sorulur: bir kalemin
davranışlarından kaçı gözlenebiliyor, kaçı ortamın sanal alan olduğunu fark edip **gizleniyor**.
Gizlenen davranış, doğrulanamayan aday sütununu bu kez ağın değil, çözümleme ortamının kendi
sınırından besler.
