Aziz Ozbek
WordPress Expert from Zürich
submit post with php curl

PHP cURL method=’post’ Form ile Login ve Kayit (Session Hijacking)

Bu konumuzda, PHP de cURL kütüphanesini kullanarak, Post metodu ile Form göndererek hedef siteye üye olup yada giriş yapıp, sitenin içeriğini nasıl alacağınızı göreceğiz. Normalde, sitelerden içerik çekmek kolaydır, URL’yi file_get_contents kodu ile kolayca çekeriz. Ancak eğer hedef site CSRF (Cross-site-request-forgery) karşıtı tasarlandıysa veya ziyaretçi oturumuyla ile etkin oturum kimliğini kontrol ediyorsa,giriş yapamanız biraz zorlaşır.
Bu durumda, hedef web siteyi kandırmak için Session Hijacking (Oturum Kaçakçılığı) hilesini kullanıyoruz. Önce Cross-site-request-forgery , sonra Session Hijacking nedir onu bi görelim.
cross_site_request_forgery nedir

Cross Site Request Forgery nedir ?

CSRF (Cross Site Request Forgery), günümüzde, fazlalıkla yazılımcının kodlama bilgisinin yetersiz olduğundan kaynaklanan bir güvenlik zafiyetidir.

En küçük örnekle; Diyelim ki Kullanıcı Hesabı şifresinin “Get” Methodu ile değiştirildiği bir siteye üye oldunuz. Sitede oturumunuz açık iken biri size aşağıdaki gibi bir link yolladı.

Hey Aziz, Ne yapıyorsun kanka ya, özlettin kendini. Çok değişmişsin, bak şu önceki resimlere bide suan ki haline bak 🙂 Haylazlar Albümünde ki 12 Fotoğraf’i görmek için tıklayınız.

<a href="https://azizozbek.ch/uye.php?id=123&sifre=123456"> Haylazlar Albümünde ki 12 Fotograf'i görmek icin tiklayiniz 

Eğer burda linke tıklarsanız, şifreniz otomatik olarak değişecektir. Ve sizin hiç bi haberiniz olmayacak. O yüzden ne yapıyoruz, böyle güvenliksiz sitelere kayıt olmuyoruz 🙂

Yazılımcılar buna karşın sadece küçük sistemlerde işe yarasa da, yine de küçük sistemler için hayat kurtarıcı bir method olan Post Metodunu kullanırlar. Çoğunlukla Lamer diye adlandırılan, yetenekler sınırlı Hacker’lar(benim gibi 🙂 “get” metodu yerine “post” metodu kullanıldığında URL içinde şifrenin değiştiğini göremeyince işin başarısız olduğunu zanneder.

Ancak bu sadece Lamer’lar için geçerlidir. Derine inen pek çok uzman saldırgan da vardır, şuan yapacağımız gibi. Bu gibi durumlarda post methodu yetersiz kalır ve yeni korunma yöntemleri aramak zorunda kalırsınız.

Gene çogunlukla  <input type="hidden" /> gizli Veriler ile Session Verilerini kontrol ederek formu gönderirler, Session Hijacking konusunda göreceğimiz üzere, bu yöntem de her zaman ise yaramıyor 🙂

Size buna karşın önerebileceğim en iyi korunma yöntemi Google reCaptcha kullanmaniz.

Session Hijacking nedir ?

Session hijacking (oturum çalmak), Kullanıcı bir siteye giriş yaptığında, sayfaya her girişinde her defasında kullanıcı bilgilerinin sorulmaması, $_SESSİON ve $_COOKİE değişkenlerince taşınan veriler sayesinde sağlanır. $_COOKİE kullanıcı bilgisayarına gönderilirken, $_SESSİON sunucuda kalır. Bu bilgiler el değiştirirse, sizin kimliğiniz artık başkasının elindedir ve sizin yerinize istediğini yapabilir demektir. 

Bu konumuzda tam olarak Session Hijacking konusuna değinmeyeceğim, çünkü bizim olayımız tam olarak başkasının Oturum bilgilerini çalmak değilde, kendi oluşturduğumuz bilgileri sunucudaki aktif oturum ile eşitlemek.Fakat bu gibi olaylari Session Hijacking konusu altinda toplayabiliriz tabi ki. 

Hadi kodumuzu inceleyelim o zaman…

Session_Hijacking_php curl
Session Hijacking

Php cURL ile otomatik Form girişi

  1. İlk olarak, Eğer HTML hakkında fazla bilginiz yok ise veya tüm Form bilgilerini (Gizli İnputlar vs.) tam olarak öğrendiğinizden emin olmak istiyorsanız. Hedef sitenin ctrl+shift+c kombinasyonu’nu kullanarak Kaynak Kodunu açın. Form tag’i içindeki action="" Parametresini aşağıdaki curl.php‘ye yönlendirin. Aşağıdaki kod ile Hedef siteden gelen tüm Post Bilgilerini öğreniyoruz.

  2. if($_GET){foreach ($_POST as $key => $value) echo htmlspecialchars($key)." = ".htmlspecialchars($value)."n";}
form action redirect to localhost


  1. Artık hedef Sitedeki tüm Form bilgilerini aldığımıza göre, name="" parametlerini kontrol edelim. Çoğunlukla kullanıcı adı “username”  ve şifre olarak “password” kullanılır. O yüzden ben de bu standart değerleri kullandım. Eğer sizin hedef sitesinde değerler farklı ise 11. Satırda ki dizinin içinde değerleri değiştirin.
    	$postValues = array(
    'username' => $name,
    'password' => $pass
    );
  2. Şimdi form’un nereye gittiğini kontrol edelim. Eğer action=""  parametresinin içindeki ÜRL formun bulunduğu ÜRL ile aynı ise, kodlarda bi değişiklik yapmanıza gerek yok. Çoğunlukla zaten aynıdır. Eğer farklı ise $LOGIN_ACTION_URL = "" değerini formun gönderildiği sayfayı yazın.ist. Aksi takdir de $LOGIN_ACTION_URL = $loginForm ve $LOGIN_FORM_URL = $loginForm değerleri aynı kalsın.
  3. Artık Oturum Bilgilerinin tutulduğu bir dosya oluşturabilirsiniz. Php kodlarında otomatik olarak dosya oluşturadabılırsınz, fakat ben yazmadım. Kodları Linux gibi işletim sistemlerinde kullanırsanız, dosya oluşturmak için Admin yetkisi isteyecektir her türlü. Eğer otomatik oluşturmasını istiyorsanız aşağıdaki Kodları,$COOKIE_FILE = 'cookie.txt'; kodu ile degistirin. Yoksa “cookie.txt” adında bir dosya oluşturun.
    if(!file_exists("cookie.txt")){
    $COOKIE_FILE = 'cookie.txt';
    }else{
    $COOKIE_FILE = fopen("cookie.txt", "w");
    }
  4. Artık Funksiyonumuzun içinde gerekli olan herşeyi gördük. (Her kodun yanına ingilizce olarak kısaca bi açıklama yazdım, translate yaparak yada yapmayarak anlarsınız umarım.)
  5. $username = ""; // kullanici adi
    $password = ""; // sifreniz
    $formPage = ""; // login formunun bulundugu sayfa
    $indexseite = ""; //login den sonra gösterilecek sayfa
    $get = get_curl($username, $password, $formPage, $indexseite);

    $formPage Login Formunun bulundugu sayfa.
    $indexseite  Başarılı girişten sonra gösterilecek sayfa

  6. Kodları kolayca kopyalayabilirsiniz, yada yukardan PHP dosyasını indirebilirsiniz.
  7. Rast Gele 🙂
Rating: 5.0/5. From 5 votes.
Please wait...

18 comments

    1. Teşekkürler Semih.

      $postValues = array(
      	    'username' => $name,
      	    'password' => $pass
      	);
      

      Login Bilgilerinin icine Tokeni eklersen olur galiba. Hatayi tam bilmedigim icin, tam cevap veremiyorum. Genel olarak, __RequestVerificationToken varsa, gizlenmis bir session bilgisi var demektir. Asagidaki kod ile, curl’den cikan kodlarin icinden gizli verileri cekebilirsin.

      preg_match_all('/type="hidden" value="(.*)" /i', $get, $regs);
      $token = $regs[1][0];
      $postValues = array(
                  '__RequestVerificationToken'=>$token,
      	    'username' => $name,
      	    'password' => $pass
      	);
      

      Konu ile ilgili Soru => https://stackoverflow.com/questions/21795399/scrap-password-protected-asp-page

    1. siteye curl ile ulasilabiliyo, yani herhangi bir korunma söz konusu degil. bos formun ekran görüntüsü ve kaynak kodunu paylasirsan belki bi ipucu bulabiliriz.

  1. __RequestVerificationToken’ ı muhtemelen google recaptcha istiyordur artık çoğu web siteler recaptcha olamadan üye ve login işlemini yapmıyor bunu aşabilmek için 2recaptcha veya anti-recaptcha gibi sitelerden belli ücret karşılığı otomatik çözdürüp token kodunu api aracılığı ile alıp gerekli alana json vb. İle yazdırabiliyorsun yani bu kısımda kod bilgisi ve backend bilgisi gerekli.

  2. $value) echo htmlspecialchars($key).” = “.htmlspecialchars($value).”\n”;}

    if (isset($_POST)) {

    $tesisat_no = security($_POST[‘tesisatno’]);
    $kod = security($_POST[‘ctl00ContentPlaceHolder1TextBox5’]);

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, “https://www.faturaodemelisin.net/turkcell-fatura-odeme-sorgulama”);
    curl_setopt($curl, CURLOPT_REFERER, “https://www.faturaodemelisin.net/turkcell-fatura-odeme-sorgulama”);
    curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER[“HTTP_USER_AGENT”]);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_VERBOSE, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);
    curl_setopt($curl, CURLOPT_COOKIEFILE, ‘SessionId’);
    curl_setopt($curl, CURLOPT_COOKIEJAR, ‘SessionId’);
    $exec = curl_exec($curl);
    curl_close($curl);
    if($exec === false){
    echo ‘Curl error: ‘ . curl_error($curl);
    exit;
    } else {

    preg_match(‘/<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="(.*?)"/', $exec, $veri1);
    preg_match('/<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="(.*?)"/', $exec, $veri2);
    preg_match('/

    <?php
    $tesno = 'ctl00$ContentPlaceHolder1$TextBox1';
    $guvenlik ='ctl00$ContentPlaceHolder1$TextBox5';

    print_r($post_bilgileri = "$tesno=$tesisat_no&$guvenlik=$kod&__VIEWSTATE=$veri1[1]&__VIEWSTATEGENERATOR=$veri2[1]&__EVENTVALIDATION=$veri3[1]");
    }

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, "https://www.faturaodemelisin.net/turkcell-fatura-odeme-sorgulama&quot;);
    curl_setopt($curl, CURLOPT_REFERER, "https://www.faturaodemelisin.net/&quot;);
    curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_VERBOSE, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);
    curl_setopt($curl, CURLOPT_COOKIEFILE, 'SessionId');
    curl_setopt($curl, CURLOPT_COOKIEJAR, 'SessionId');
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post_bilgileri);
    $icerik = curl_exec($curl);
    curl_close($curl);
    if($icerik === false){
    echo 'Curl error: ' . curl_error($curl);
    exit;
    } else {
    preg_match_all('#(.*?)#si’, $icerik, $sonuc);
    echo “”;
    print_r($icerik);
    print_r($sonuc);
    // echo $sonuc[0][1];

    }
    }
    ?>
    aziz hocam söyle bir sayfadan curl ile fatura bilgilerini çekip kullanmam gerekiyor fakat bir türlü almadım bir kaç sorgu üst üste yapınca bir güvenlik resmide çıkıyor nerde hata yapıyorum yardımcı olurmusunuz. teşekkür ederim

    1. Merhaba Engin, geç cevabım için kusura bakma. Başka biride aynı hatayla karşılaşırsa diye yazıyım.
      Kodu kullandığınızda çıkan hataları veya kullandığınız sayfayı yollarsanız yardımcı olabilirim.

  3. aziz hocam vermiş olduğunuz curl kodu ile sayfaya giriş yapabiliyorum benim şöyle bir sorum olacak kullanıcı adı ve sifre ile giriş yaptık sonrasında birde parola ekranı geldiğinde nasıl devamını getireceğiz ben birkaç sekil denedim bir türlü başaramadım

  4. Öncelikle emeğinize sağlık, kodlar sayesinde karşı siteye giriş yapabildim ancak benim sorun şu olacak, giriş yaptığım sayfa haricinde sitedeki diğer sayfalara giriş yapamıyorum. Bunu nasıl yapabilirim bu botla? Botla giriyorum siteye yan sekmede refresh yapıyorum giriş yapmamış olarak görünüyorum?

    1. tesekürler, giris yaptigin site ile diger sayfalar ayni session”i paylasmasi gerekiyor. yoksa diger sayfalarda giris yapmis olmazsin.
      yani site.com üzerinde giris yaptiginda alt.site.com’un icerigine ulasamazsin (normalde)

Bir yanıt yazın

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