Türkiye'nin En Eski Webmaster Forumu İyinet'e Hoşgeldiniz!

sitemde exploit var nasıl çözerim

Eif

0
Onaylı Üye
Üye
Katılım
26 Ocak 2005
Mesajlar
7,943
Açılan Konu
325
Tepki puanı
251
Rating sisteminde bir sorun var.

Panelden en fazla 5 oy verilebildiği halde, gelen bir user bir milyon oy vermiş. ip koruması var, her ipden bir kere oy verilebiliyor. zaten bir kere oy vermiş.

Sorum şu. 5 den fazla oy vermesini nasıl kısıtlarım. Eğer yapamazsam sql çağrısını oy 5 den fazla ise göstermesin diye nasıl ayarlarım.

Cevaplayan arkadaşlara önceden teşekkürler.
 

NeFuSa

0
Onaylı Üye
Üye
Katılım
27 Aralık 2006
Mesajlar
1,414
Açılan Konu
129
Tepki puanı
15
Konum
İstanbul
Nasıl bir sistem kullanıyorsunuz?
Üyelikli sistemi mevcut mu?
 

Eif

0
Onaylı Üye
Üye
Katılım
26 Ocak 2005
Mesajlar
7,943
Açılan Konu
325
Tepki puanı
251
merhaba,

üyelik sistemi mevcut değil. siteye gelen her kes oy kullanabiliyor.
 

Eif

0
Onaylı Üye
Üye
Katılım
26 Ocak 2005
Mesajlar
7,943
Açılan Konu
325
Tepki puanı
251
Kod:

PHP:
$recipeid = $_REQUEST['recipeid'];

   $sql = "select d.title, d.recipe, d.hits, d.rating, d.userid, c.category from recipes d, categories c where d.recipeid = $recipeid and c.categoryid = d.categoryid";
   $result = mysql_query($sql);

   if ($myrow = mysql_fetch_array($result)) {
	  do {
         $pagetitle = $myrow["title"];
         $directions = $myrow["recipe"];
         $hits = $myrow["hits"];
         $reciperating = $myrow["rating"];
         $userid = $myrow["userid"];
         $category = $myrow["category"];
      } while ($myrow = mysql_fetch_array($result));

   }

if ($_REQUEST['ratevalue']) {

      $ratecount = 0;
      $ratetotal = 0;
      $ratevalue = $_REQUEST['ratevalue'];

      $ip = getenv(remote_addr);

      $sql = "select * from ratings where recipeid = $recipeid and ip = '$ip'";

      $result = mysql_query($sql);

      if ($myrow = mysql_fetch_array($result)) {
         $ratemsg = "Üzgünüz. Bu tarif için daha önce oy kullandınız!";
      } else {
         $sql = "insert into ratings (recipeid, rating, ip) values ($recipeid, $ratevalue, '$ip')";

         $result2 = mysql_query($sql);

         $sql = "select rating from ratings where recipeid = $recipeid";

         $result3 = mysql_query($sql);

         if ($myrow2 = mysql_fetch_array($result3)) {

           do {
              $ratetotal = $ratetotal + $myrow2["rating"];
              $ratecount++;
           } while ($myrow2 = mysql_fetch_array($result3));

         }

         $newrate = $ratetotal / $ratecount;

         $sql = "update recipes set rating = $newrate where recipeid = $recipeid";

         $result4 = mysql_query($sql);

         $ratemsg = "Bu tarife puan verdiğiniz için teşekkür ederiz.";

         $reciperating = $newrate;

      }
 

NeFuSa

0
Onaylı Üye
Üye
Katılım
27 Aralık 2006
Mesajlar
1,414
Açılan Konu
129
Tepki puanı
15
Konum
İstanbul
Oy gönderilme tarihini kayıt edersen ve o tarihden örneğin 10 dakika geçmeden yeni bir oy gönderilmesini engellersen sorun yaşamazsın. Ancak üyelik var mı yok mu anlayamadım bu koddan.
 

Eif

0
Onaylı Üye
Üye
Katılım
26 Ocak 2005
Mesajlar
7,943
Açılan Konu
325
Tepki puanı
251
üyelik sistemi yok.

gelen kişi bir kere oy vermiş. verdiği oyun en fazla 5 olması gerekirken (sayfada en fazla 5 oy seçeneği var), bu kişi 1000000 puan vermiş. ama sadece bir kere, ilginç olan da o.
 

NeFuSa

0
Onaylı Üye
Üye
Katılım
27 Aralık 2006
Mesajlar
1,414
Açılan Konu
129
Tepki puanı
15
Konum
İstanbul
  • Beğen
Reactions: Eif

Eif

0
Onaylı Üye
Üye
Katılım
26 Ocak 2005
Mesajlar
7,943
Açılan Konu
325
Tepki puanı
251
üyelik sistemi eskiden vardı sonra ben onu iptal ettim. koddaki userid eskiden kalma. databasede hiç user yok.
 

NeFuSa

0
Onaylı Üye
Üye
Katılım
27 Aralık 2006
Mesajlar
1,414
Açılan Konu
129
Tepki puanı
15
Konum
İstanbul
üyelik sistemi eskiden vardı sonra ben onu iptal ettim. koddaki userid eskiden kalma. databasede hiç user yok.

Verdiğim linkte cookie ve session ile kısıtlamalar var, basit düzeyde anlatılmış. Php bilgin ne derecede bilmiyorum, ancak biraz alt yapın varsa basitçe kendine uyarlayabilirsin.
 

K1R1A1LM1AS

0
Onaylı Üye
Üye
Katılım
26 Ocak 2010
Mesajlar
126
Açılan Konu
3
Tepki puanı
9
Konum
Antalya
Rating sisteminde bir sorun var.

Panelden en fazla 5 oy verilebildiği halde, gelen bir user bir milyon oy vermiş. ip koruması var, her ipden bir kere oy verilebiliyor. zaten bir kere oy vermiş.

Sorum şu. 5 den fazla oy vermesini nasıl kısıtlarım. Eğer yapamazsam sql çağrısını oy 5 den fazla ise göstermesin diye nasıl ayarlarım.

Cevaplayan arkadaşlara önceden teşekkürler.

Web tabanlı olarak elde edebileceğimiz bilgiler, oldukça kısıtlı olduğundan, ziyaretçi tarafından gönderilen bilgiler için, %100 güvenlik sağlanması, zaten mümkün dğeildir. Ama tek başına, IP kontrolü yapmak da, kesinlikle yetersiz bir önlemdir. Saldırgan, herhangi bir proxy uygulaması veya eklentisi ile, bu korumayı, kolayca aşabilir, zaten söylediğinize göre aşmışta.

Size tavsiyem, öncelikle saldırganın proxy kullanıp kullanmadığını, belirlemeye çalışmanız (eğer high anony ise, bu tespitide yapamazsınız), tespit edebilirseniz, proxy arkasından gelen ip adresinide kontrol altına almanız, daha sonra sisteminizde, oy göndermeyle ilgili session ve cookie kontrolü sağlamanız olacak. Elbette bu da yeterli bir koruma olmayacak, ama en azından saldırganın, ip değişikliğiyle birlikte, oturumdan çıkması ve cookilerini temizlemesi de gerekecek ve işini biraz da olsa zorlaştırmış olacaksınız.

PHP:
<?PHP
ob_start();
session_start();

// Örnek 1 - Proxy kontrolü
if (!empty($_SERVER["REMOTE_ADDR"]) AND empty($_SERVER["HTTP_VIA"]) AND empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
	// Proxy yok veya iyi gizlenmiş
	$params_ip = $_SERVER["REMOTE_ADDR"]; // ziyaretçi ip
	$params_proxy = "";
	$params_proxyvia = "";
	$params_iss = @gethostbyaddr($_SERVER['REMOTE_ADDR']);
}
else {
	// Proxy var
	$params_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
	$params_proxy = $_SERVER["REMOTE_ADDR"]; // ziyaretçi ip
	$params_proxyvia = $_SERVER["HTTP_VIA"]; // proxy ip
	$params_iss = @gethostbyaddr($_SERVER['HTTP_X_FORWARDED_FOR']);
}

// Örnek 2 - Oturum (Session) kontrolü
// Çalışan sayfanın en üstünde (ob_start(); ifadesinin altında olabilir) session_start(); ifadesinin yer aldığından emin olun.

// IP adresinin, $params_ip olarak geldiğini var sayıyorum
if (empty($_SESSION["userip"])) {
    // Oturum kontrolü, sunucuda özel olarak ayarlanmamışsa, kullanıcı oturumu sonlandırmadığı müddetçe, yaklaşık 22dk kadar aktif kalır.
    $_SESSION["userip"] = $params_ip; // ilk giriş yaptığı ip adresini oturuma alıyoruz
}
else {
    // Eğer oturum zaten mevcutsa, süreyi uzatmak için yeniliyoruz.
    $_SESSION["userip"] = $_SESSION["userip"];
}

// Örnek 3 - Cookie kontrolü
// Çalışan sayfanın en üstünde ob_start(); ifadesinin yer aldığından emin olun.

// IP adresinin, $params_ip olarak geldiğini var sayıyorum
if (empty($_COOKIE["userip"])) {
    // Kullanıcı silene kadar, 24 saat aktif olucak bir cookie oluşturuyoruz
    setcookie("userip", $params_ip, time()+86400);	// 86400 = 24 saat
}

// Kontrol - kendi bilgilerine göre düzenlemen lazım
$query = mysql_query("SELECT * FROM anket WHERE ip='".$params_ip."' OR ip='".$_SESSION["userip"]."' OR ip='".$_COOKIE["userip"]."'");
$kayitsayisi = mysql_num_rows($query);

if ($kayitsayisi > 0) {
    // bu kullanıcı daha önce oy vermiş
}
else {
    // oy vermesinde bir sakınca görünmüyor
}
?>

Ayrıca, eğer sitenizin kitlesi, belirli bir kesimden oluşuyorsa (örneğin Türkiye, Almanya vb..) bu kitlenin dışından gelen kullanıcıların, oy vermesini engelleyebilirsiniz. Bu sayede ziyaretçi, belirlediğiniz bölgelerin dışında kalan bir proxy adresi kullandığında, oy vermeside söz konusu olmayacaktır. Bu tespiti yapmak için kullanabileceğiniz çeşitli araçlar ve servis sağlayıcı siteler mevcut.

http://www.codedcode.com/php/iptocountry/the_script.asp
http://www.hostip.info/use.html

PHP:
// IP adresinin, $params_ip olarak geldiğini var sayıyorum
$country = file_get_contents('http://api.hostip.info/country.php?ip='.$params_ip);
echo $country;
 

Eif

0
Onaylı Üye
Üye
Katılım
26 Ocak 2005
Mesajlar
7,943
Açılan Konu
325
Tepki puanı
251
Teşekkür ediyorum.

Konuyu baştan yanlış anlattım.
Bu yemek tarifleri sitesi. Üyelik sistemi olmayan. Gelen her ziyaretçi tarife birden beşe kadar oy veriyor. Dün gece gelen birisi (ip numarası ttnet adsl olan hatta) oy vermiş. Ama vermesi gerek puanın en fazla 5 olması gerekirken en fazla 1000000 küsür olmuş. Bu puan sayfaya yansıyınca tüm düzeni bozuyor.

Oyu veritabanından sildim. Her şey eskiye döndü. Ama saldırı tekrarlanırsa bunu nasıl önleyeceğimi bilmiyorum. Yada yansıtacağım zaman puan 5 den fazlaysa yansıtma diye nasıl bir kod düzenlemem gerektiğini bulamadım. şu şekilde tarifin puanı yansıtılıyor
PHP:
<?php printf($reciperating); ?>
 

K1R1A1LM1AS

0
Onaylı Üye
Üye
Katılım
26 Ocak 2010
Mesajlar
126
Açılan Konu
3
Tepki puanı
9
Konum
Antalya
üyelik sistemi yok.

gelen kişi bir kere oy vermiş. verdiği oyun en fazla 5 olması gerekirken (sayfada en fazla 5 oy seçeneği var), bu kişi 1000000 puan vermiş. ama sadece bir kere, ilginç olan da o.

Ben aynı kişinin, ip değiştirip saldırdığını düşünmüştüm, sorun verilen puanla ilgili ise, daha farklı bir kontrol kullanmanız lazım. Örneğin;

PHP:
// gelenpuan bilgisi $puan ise
$puan = intval($puan); // eğer gönderilen veri string ise, integer türüne dönüştürecek

if ($puan < 6 AND $puan > 0) {
    // geçerli bir oy
}
else {
    // geçersiz bir oy
}
 
  • Beğen
Reactions: Eif

Eif

0
Onaylı Üye
Üye
Katılım
26 Ocak 2005
Mesajlar
7,943
Açılan Konu
325
Tepki puanı
251
çok teşekkür ediyorum. son kodları uygulayıp sorunu çözüp çözemeyeceğimi deneyeceğim.
 

Eif

0
Onaylı Üye
Üye
Katılım
26 Ocak 2005
Mesajlar
7,943
Açılan Konu
325
Tepki puanı
251
Arkadaşlar,

Çok teşekkür ediyorum KRALMAS ve NeFuSa ve bana pm atıp yardımcı olan arkadaşlarım.

Sorunu sayenizde çözdüm. Nasıl çözdüğümü yazmak istiyorum, aynı sorunu yaşayan olursa kaynak olsun diye.

Tarif sayfasının url si aşağıdaki şekilde (bir az değiştirirsem aynı sistemi kullananlar zarar görmez):
tarif.php?tarifid=23
Oy verince değer kontrolü yapılmadığından gelen kötü niyetli bir ziyaretçi tarife 10000 küsür puan vermiş.
tarif.php?tarifid=23&puan=10000000000 şeklinde browsere yazıp enterlemiş.

if ($puan > 5) {
$puan = '5';

}

yazınca değeri kontrol altına almış oluyoruz ve sorun çözülmüş oluyor.

Bunu siteye yapana gelince. Kim olduğunu bilmiyorum. benim hiç düşmanım yok :)
 
Üst