PHP değişken dizi enjeksiyon GET

7 Cevap php

Geçenlerde kod yürütülmesine gerçekleştirmek için PHP GET değişkenleri içine diziler enjekte etmek mümkün olduğunu öğrendim?

.php?a[]=asd&a[]=asdasd&b[]=$a

Ben verildi örnek oldu. Ben nasıl çalıştığını hiçbir fikrim yok ve bu bile mümkün olup olmadığını merak ediyorum?

7 Cevap

PHP ) btw, sorgu dizesini ayrıştırmak ve bu POST kullanarak bir biçimde yapıldıysa $_GET süper küresel dizisine (same for $_POST bu değerleri enjekte edecektir.

Senin durumunda, $_GET dizisi bu içerecektir:

array
  'a' => 
    array
      0 => string 'asd' (length=3)
      1 => string 'asdasd' (length=6)
  'b' => 
    array
      0 => string '$a' (length=2)

Sorgu dizesinde geçen her değer, gerekirse [] sorgu dizesinde kullanılan olduğunda, alt-dizileri oluştururken, $_GET dizide PHP ile konacaktır.

Üzerinde sürece düzgün girişi ile uğraşmak gibi (i.e. don't trust the input and use eval, ya da bu gibi kötü fikir herhangi bir tür) , hiçbir riski yoktur: Ama bu "kod yürütme" herhangi bir neden olmaz Kod-enjeksiyon.

Uzun lafın kısası: kod yürütme yok. Aksi takdirde, birileri zaten Facebook kesmek olurdu değil mi? :)

Ben söylemiştim kişinin teorik bazı kod çalıştırmak için kullanılabilecek bir tampon taşması / çift serbest / bazı diğer hack vektör, tetiklemek için yuvalama derin diziyi kullanılan bazı diğer böcek hakkında karıştı olduğunu düşünüyorum. Birçok popüler yazılım gündelik görebileceğiniz gibi bu yazılım hata vardır. Bunlar genellikle hızlı bir şekilde yamalı olsun.

Sen http://www.suspekt.org/ daha fazla bilgi bulabilirsiniz

Güvenli almak için nasıl emin değilseniz, yapabileceğiniz en az $ _GET dizi filtre etmektir. İşte fonksiyonudur:

function filter_url($url)
{
  if (is_array($url))
  {
    foreach ($url as $key => $value)
    {
      // recurssion
      $url[$key] = filter_url($value);
    }
    return $url;
  }
  else
  {
    // remove everything except for a-ZA-Z0-9_.-&=
    $url = preg_replace('/[^a-ZA-Z0-9_\.\-&=]/', '', $url);
    return $url;
  }
}

Şimdi böyle bir $ _GET filtreleyebilirsiniz:

$_GET = filter_url($_GET);

Bu esasen, [] gibi şüpheli karakterlerin $ _GET dizi temizlemek olacaktır.

Teşekkürler

Eğer bir şeyler yanlış gibi görünüyor.

Yukarıdaki örnek sadece gibi bir dizi oluşturur

Array (
  [a] => Array (
    [0] => asd
    [1] => asdasd
  )
  [b] => Array ( [0] => $a )
)

Bu belgelenmiş ve amaçlanan tam olarak çalışıyor.

Yukarıdaki kesinlikle kod yürütülmesine izin vermez, ancak dikkate veriler bir dizi olabilir gerçeğini almaz eğer mevcut kod kontrol akışını değiştirebilir.

PHP dizileri gibi [] biten değişkenler yorumlaması nedeniyle yukarıdaki eserler nedenidir. Eğer [] biten aynı ada sahip birden GET değişkenleri sağlamak Yani, PHP tüm değerlerini içeren bir dizi oluşturur.

Bir dizi geçtiğinde ben o farklı değerlendirilmesi şey bahsediyoruz düşünüyorum

strcasecmp( $_GET['password'], $password ) == 0 ) { echo($secret); } ` If you pass an empty array into strcasecmp it will evaluate to true for whatever reason.

IE:? Index.php password = []

Birisi size sadece bir dizi yerine bir düz değişken göndereceğiz, o ile bir şey yapılamaz, sana yalan söyledim.

Bu kodu deneyin

<?php
    $x = $_GET['x'];
    var_dump($x);
?>

ve? x = 1 ve sonra kullanarak erişebilirsiniz? x [a] = 1 & x [b] = 2 bu davranış değil, enjeksiyon bekleniyor ve onunla herhangi bir kod koşamam.