Savunmasız PHP kod örnekleri?

16 Cevap php

Tamam, böylece ben ve bir arkadaşım PHP güvenlik mini bir sunum yapıyoruz (Ben olsa PHP gerçekten içine değilim) o SQL enjeksiyon saldırıları ve diğer her türlü eğilimli bir (savunmasız PHP kod bazı örnekler bulmak için bana sordu .) Ben ve kod gerektiğine nasıl gösteren kod iyi hem de kötü parçaları ile herhangi bir web sitesi var merak ediyorum?

Temelde sitemizde içine koyacağız ve onu kesmek için çalışacağız, o zaman "doğru" bir web sitesi gösterecektir ve o tekrar kesmek için çalışacağız.

16 Cevap

SQL injection kolaydır:

$var = $_POST['var'];
mysql_query("SELECT * FROM sometable WHERE id = $var");

Bu kolayca çözülür:

$var = mysql_real_escape_string($_POST['var']);

Diğer ortak biridir XSS (cross site scripting):

$var = $_POST['var'];
echo "<div>$var</div>\n";

sitenizden çalıştırılır Javascript enjekte etmesine olanak veriyor. Örneğin, bu ile ilgili birkaç yolu vardır:

$var = strip_tags($_POST['var']);

ve

$var = filter_var($_POST['var'], FILTER_SANITIZE_STRING);

Gerçekten Yeni başlayanların en sık hata bir yönlendirme sonra komut dosyası yürütülmesine sonlandırmak için unutmak.

<?php
if ($_SESSION['user_logged_in'] !== true) {
    header('Location: /login.php');
}

omg_important_private_functionality_here();

Çözüm:

if ($_SESSION['user_logged_in'] !== true) {
    header('Location: /login.php');
    exit();
}

Tarayıcıları genellikle script çıkışı her render olmadan Location başlığı takip çünkü, normal bir tarayıcıda test ederken bu atlanabilir.

Ah, sen örnekler kısa olmayacaktır. Sadece Google PHP tutorial ve bunların her biri Albert Hall dolduracak kadar delik vardır.

1, W3Schools Sonuç. Kullanıcı girişi dahil etmek ilk örneği nedir?

Welcome <?php echo $_POST["fname"]; ?>!<br />

Bzzt. Örnek kodun her parça boyunca tekrarlanan HTML enjeksiyon,. Ilk veritabanı sorgu nedir?

$sql="INSERT INTO Persons (FirstName, LastName, Age) VALUES ('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";

Bzzt. SQL enjeksiyonu, kaybedersiniz. Sonraki.

Sonuç 2, resmi PHP öğretici. Bir değişken çıkarılırken ilk örneği nedir?

echo $_SERVER['HTTP_USER_AGENT'];

Bzzt. HTML enjeksiyon. Değil bir kolayca işletilebilir biri, ama yine de, php.net 'in öğrenme materyalleri boyunca tekrarlanır tür kötü uygulama.

Sonuç 3, tizag.com. Kullanıcı girişi yankılanan ilk örneği nedir?

echo "You ordered ". $quantity . " " . $item . ".<br />";

Bzzt.

Sonuç 4, freewebmasterhelp.com. Fazla değil, ama yine de yöneten dahil etmek için çok temel:

print "Hello $name"; // Welcome to the user

Bzzt.

Sonuç 5, learnphp-tutorial.com.

<title><?= $greeting ?> World!</title>

Bz ...

Ben gidebiliriz.

Bu dertli çöp kodlama öğrenme ne zaman vahşi PHP kod genel kalite, yani felaket bir mucize mi?

Bobby Tables

alt text

Bobby Tables bir betik SQL injection üzerinden savunmasız olabilir yollarını ayrıntılı adamış bir sayfasıdır. Bu ancak, SQL enjeksiyon pek çok web sayfası güvenlik açıklarının nedeni, PHP özgü değildir.

Bu sizin sunum eklemek istediğiniz Someting olabilir.

Bir sql-injection-savunmasız oturum açma komut dosyası başka bir örnek. Bu yeni programcılar arasında ne yazık ki çok yaygındır.

$username = $_POST["username"];
$password = $_POST["password"];
$query = "SELECT username, password 
          FROM users 
          WHERE (username = '{$username}') 
            AND (password = '{$password}')";

Today's DailyWTF:

if(strstr($username, '**')) {

    $admin = 1;
    $username = str_replace('**', '', $username);
    $_SESSION['admin'] = 1;

} else {

    $admin = 0;

}

(Onlarla uğraşmak zorunda kalmıştım sürece) Email header injection attacks boyun çok daha büyük bir acı vardır, o zaman şüpheli olabilir.

Bu çok kötü:

$to = 'contact@domain.com';
$subject = $_POST["subject"];
$message = $_POST["message"];
$headers = "From: ".$_POST["from"];
mail($to,$subject,$message,$headers);

(Yukarıdaki ikinci referans kopyalanan kodu.)

Kazanmak için csrf.

<?php
$newEmail = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
$pdoStatement = $pdoDb->prepare('UPDATE user SET email=:email WHERE ID=:id');
$pdoStatement->execute(array(':email'=>$newEmail, ':id'=>$_SESSION['userId']));

You feel safe with this kind of code. All is good your users can change their emails without injecting SQL because of your code. But, imagine you have this on your site http://siteA/, one of your users is connected. With the same browser, he goes on http://siteB/ where some AJAX does the equivalent of this code :

<form method="post" action="http://site/updateMyAccount.php">
  <p>
    <input name="email" value="badguy@siteB"/>
    <input type="submit"/>
  </p>
</form>

Sizin kullanıcı sadece kendi e-posta onu bilmeden değiştirildi var. Eğer bu tarz bir saldırı tehlikeli olduğunu sanmıyorum, ask google about it

Saldırılara karşı bu tür yardımcı olmak için, aşağıdakilerden birini yapabilirsiniz:

  • Kullanıcı Referrer (çok mükemmel)
  • Formlarınıza yaşadığınız bazı belirteçleri uygulamak ve geri veri almak onların varlığını kontrol edin.

Another one is session hijacking. One of the methods to do it is piggybacking. If your server accepts non cookie sessions, you can have URLs like http://siteA/?PHPSESSID=blabla which means your session ID is blabla.

An attacker can start a session and note his session ID, then give the link http://siteA/?PHPSESSID=attackerSessionId to other users of your website. When these users follow this link, they share the same session as your attacker : a not logged session. So they login. If the website does not do anything, your attacker and your user are still sharing the same session with the same rights. Bad thing if the user is an admin.

Bu azaltmak için, kullanıcıların kimlik bilgilerini (giriş ve çıkış, yönetim bölümü vb gider) değiştirdiğinizde session_regenerate_id kullanmak zorunda.

HTTP Response Splitting attack

Web uygulama çerez bir HTTP istek girişi saklamak durumunda diyelim

<?php setcookie("author",$_GET["authorName"]); ?>

Girdi "\ r \ n" karakterleri düzgün valide değilse HTTP yanıt bölme saldırıya karşı çok eğilimli.

Bir saldırgan gibi zararlı bir dize gönderdiğinde ise "Yazar Adı \ r \ nHTTP/1.1 200 OK \ r \ n ..", sonra HTTP yanıt aşağıdaki formu iki yanıtları bölünmüş olacaktır:

HTTP/1.1 200 OK
...
Set-cookie: author=AuthorName

HTTP/1.1 200 OK ...

Açıkçası, ikinci tepki tamamen saldırgan tarafından kontrol edilir ve herhangi bir başlık ve gövde içeriği yerine ile inşa edilebilir

Şablonlar yapmak için yanlış bir şekilde.

<?php

  include("header.php");
  include($_GET["source"]); //http://www.mysite.com/page.php?source=index.php
  include("footer.php");

?>

XSS açıkları göstermek kolaydır. Sadece sayfada bir yere GET değişkeni "q" değerini koyar ve sonra aşağıdaki URL'yi vurmak bir sayfa oluşturun:

http://mysite.com/vulnerable_page.php?q%3D%3Cscript%20type%3D%22javascript%22%3Ealert(document.cookie)%3B%3C%2Fscript%3E

Bu kullanıcının çerezleri bir uyarı kutusunda görüntülenmesine neden olur.

Yükleme sağlar ve uzantısı kontrol etmiyor. Dikkat edin:

Site A resim yükleme sağlar ve bunları görüntüler.

Kraker adam (HTTP mimetypes yoluyla) bir dosya ve hileler sizi onun bir resim dosyası inanmak yükler. Bu dosya PHP uzantısı vardır ve kötü amaçlı kod içerir. Sonra onun resim dosyasını görmek için çalışır ve her PHP extesioned dosya PHP tarafından yürütülür, çünkü kod çalıştırılır. O apache kullanıcı yapabileceği her şeyi yapabilir.

Temel beklendiği gibi (genellikle güvenlik duyarlı) operasyonları yerine olmayan kırık işlevselliği almak için ikinci bir "gerçek" sürümünü kullanmak için programcı gerektiren çalışmıyor.

Gerçek bir operatör etkilenir nerede Bunların en ciddi biri olacaktır: bir beklediğiniz gibi "==" operatörü yerine "===" operatörü gerçek eşitlik karşılaştırma almak için gerekli olan, çalışmaz.

Büyük 3 PHP forum paketlerinden biri koduna "Bağlı Kal" bir güvenlik açığından etkilenen. Cookie kullanıcının kimliği ve parola karma içerecektir. PHP komut dosyası okumak ve kimliğini temizlemek, veritabanındaki kullanıcı doğru karma sorgulamak için kullanabilirsiniz ve daha sonra otomatik olarak oturum gerektiğini görmek için çerez biri ile karşılaştırmak istiyorsunuz

Hash karşılaştırma deyimi işe yaramaz hale true: çerezi değiştirerek, bir saldırganın boolean bir karma "değer" kullanın böylece Ancak karşılaştırma, == ile oldu. Saldırgan böylece şifre olmadan giriş için herhangi bir kullanıcı kimliği yerine olabilir.

Insanlar API kullanıcılar tarafından veya kullanılacak olması gerekiyordu olmadığını dosyaları yüklemek için izin. Bir program sunucusuna bazı dosyaları yükler, ve bu program kötü bir dosyayı karşıya kalmayacaksınız Örneğin, bu iyi.

Ama bir hacker gönderilen ediliyor ne iz, ve nerede olabilir. O dosyaların yüklenmesine izin olduğunu öğrenmek olabilir.

Oradan, o kolayca bir php dosya upload olabilir. Bu işlem tamamlandıktan sonra, bu oyun bitti. O, şimdi tüm verilere erişimi vardır ve istediği bir şey yok ya da değiştirebilirsiniz.

Başka bir yaygın hata sel izin veriyor. Eğer veriler üzerinde bazı aklı başında sınırlar koymak gerekir. Giriş saçma veri kullanıcılara izin vermeyin. Neden uzunluğunda bir kullanıcının ismi 2MB'dir? Birisi veritabanı veya dosya sistemi sel nedeniyle uzay hataları dışarı sistemin çökmesine için böyle şeyler yapmak o kadar kolay.

PHP savunmasız olabilir yolları ton vardır. Örnekler ve karşı-önlemler Top 10 güvenlik açıkları için iki aşağıdaki bağlantıyı bakın.

WHERE PHP SECURITY COULD FAIL OR BE VULNERABLE

WHERE PHP SECURITY COULD FAIL OR BE VULNERABLE 2