Автор работы: Пользователь скрыл имя, 02 Октября 2009 в 19:14, Не определен
В реферате содержится информация о современных методах защиты баз данных.
Еще
один метод определения версии MySQL
сервера состоит в
К
примеру, если запрос http://localhost/test.php?id=
Если применение кавычек мешает фильтрация, то вместо строки можно использовать функцию, которая в качестве значения вернет необходимую строку. Можно использовать char(), функцию, которая возвращает строку, соответствующую из символов с ASCII кодами которые приняты в качестве аргументов.
Пример.
Запрос http://localhost/test.php?id=
Пользуясь
этим примером можно выявить и
полную версию СУБД MySQL, либо последовательно
подбирая все символы, либо пользуясь
дихотомическим поиском, используя
сравнение строк в
Стоит отметить, что подомным же образом можно подобрать и значения других функций, которые могут быть интересны нападающему. User() – возвращает имя пользователя MySQL из под которого произошло подсоединение с базой данных. Database() – возвращает имя текущей базы данных.
Даже, если инъекция происходит в произвольном запросе в произвольном месте, выяснить MySQl это или нет, и версию MySQL аналогичным образом можно, например внедряя внутри этих скобок значения, которые однозначно “испортят” запрос.
http://localhost/test.
Следует помнить, что инструкции должны быть синтаксически верными, однако приводящими к ошибке в запросе. В случае ошибки в синтаксисе, эта запись в любом случае будет воспринята как комментарий. Об этом стоит помнить, и несколько видоизменять запрос для каждой конкретной ситуации.
Инъекция после where
SQL
инъекция после ключевого
В случае, если имеет место инъекция в третей версии сервера, то нижеизложенный прием позволит получить содержание любой записи любого столбца в любой таблице, используемой в запросе.
Допустим
имеет место SQL инъекция в скрипте
http://localhost/test.php?id=1
Если
в таблице храниться хеш
Для получения информации из некоторого столбца, нужно как минимум знать имя этого столбца. В случае, если запрос сложный, то кроме имени столбца нужно еще знать имя таблицы, либо псевдонима таблицы, используемой в запросе. При чем, если псевдоним использовался, то необходимо знать именно псевдоним.
Имя таблицы или ее псевдоним понадобиться знать только в том случае, если в запросе использует более одной таблицы, и имя подбираемого столбца присутствует в более чем одной таблице, из присутствующих в запросе.
Вряд ли, более чем в одной таблице будут присутствовать такие столбцы, как login или pass и т.п, так что подбирать имя таблицы в большинстве случаев не необходимо.
Если
это система с открытым исходным
кодом, или в ошибках системы
выводиться достаточно информации о
запросе, то это не составит проблемы.
Однако, в случае, если внешнему пользователю
ничего не известно о внутренней структуре
запроса и базы данных, то имя
поля и, возможно имя таблицы придется
подбирать вручную.
Пример
http://localhost/test.
http://localhost/test.
http://localhost/test.
http://localhost/test.
http://localhost/test.
…
Если результатом одного из представленных запросов будет страница, идентичная странице с переданным идентификатором id=1, то это будет свидетельствовать о том, что имя столбца, и, возможно, имя таблицы найдено успешно.
Допустим, интересующее нас имя столбца – pass,те второй запрос вернул положительный результат.
Вычислим
пароль любого пользователя системы. Пароль
будем подбирать
http://localhost/test.
http://localhost/test.
…
http://localhost/test.
http://localhost/test.
http://localhost/test.
…
http://localhost/test.
…
http://localhost/test.
http://localhost/test.
Запись, соответствующая идентификатору 9999999, не существует в базе данных, в этом стоит убедиться заранее.
Плюсом
отмечен положительный
При
этом может выводиться как один результат,
так и несколько (все найденные),
в зависимости от того, как написан
скрипт. Вывод параметров какого либо
пользователя в броузер при каком
либо запросе следует
То
что предпоследний запрос выдал
положительный результат, а последний
– отрицательный следует
При
подборе символов пароля таким способом
следует помнить, что в пароле
могут присутствовать как символы
английского алфавита, так и цифры
и другие символы. В случае, если
в пароле присутствует символ _ или
%, то при их подборе внутри like, эти
символы следует
Совершенно очевидно, что таким образом мы сможем подобрать пароль произвольного или нескольких произвольных пользователей в системе. Однако, не очевидно, что мы сможем подобрать пароль целевого пользователя, особенно если пользователей очень много.
Действительно, в описанной нами ситуации скорее всего будет выведен первый случайный пользователь, пароль которого удовлетворяет данным условиям. А о том, удовлетворяют эти условия целевому пользователю или нет мы никогда не узнаем, так он должен был бы вывестись вторым.
Те, если выводятся все результаты запроса, либо, играя с limit, все же можно узнать пароль целевого пользователя, но это может быть сопряжено с некоторыми трудностями.
Описанный
прием лучше применять, если достаточно
знать пароль любого пользователя,
те все подобные пользователи равноправны.
Теперь, допустим, необходимо узнать пароль
целевого пользователя. Для этого как
минимум необходимо выяснить, как мы сможем
идентифицировать запись в БД, соответствующую
этому пользователю. Например, запись
можно идентифицировать по идентификатору,
или имени пользователя, либо по другим
параметрам. В любом случае необходимо
выяснить, какие значения должны быть
в соответствующих столбцах искомой записи.
Например, идентифицировать некоторую запись администратора можно было бы так:
http://localhost/test.
http://localhost/test.
После того, как интересующая нас запись может быть идентифицирована, можно аналогичным образом подобрать пароль.
http://localhost/test.
и так далее.
Кроме того, для убыстрения поиска, в обоих случаях, можно воспользоваться дихотомическим поиском.
http://localhost/test.
http://localhost/test.
http://localhost/test.
http://localhost/test.
и так далее, последовательно перебирать каждую букву.
Стоит отметить, что в любом описанном в этой статье случае, строковую константу, заключенную в кавычки, можно заменить на функцию char(), с соответствующими аргументами.
Инъекция после order by
В
нередких случаях внедрение
Так как ключевое слово where согласно синтаксису SQL должно находиться перед order by, таким образом, невозможно внедрение булевых функций, ограничивающих вывод с целью получения информации о значениях некоторых записей.
Однако, в MySQL после order by, разрешено использовать функции и значения столбцов в произвольной комбинации, и пользуясь этим фактом, можно подобрать значения любых столбцов для произвольной и целевой записи в любой таблице, используемой в запросе.
Допустим,
скрипт http://localhost/test2.php?
Стоит вспомнить, что в MySQL булевы значения приводятся к целым значениям, соответственно 0 и 1.
Заметим
следующую особенность, http://localhost/test2.php?
Одновременно
http://localhost/test2.php?