Главная страница статей --> Хитрости при программировании php, заметки по базам данных

PHP и mySQL (кратко)

Источник: realcoding.net

Для начала работы с базой нам необходимо установить с ней соединение:

mysql_connect($hostname,$username,$password)

И выбрать базу с которой будем работать:

mysql_select_db($dbname)

$hostname – сервер БД
$username – логин к базе $password – пароль к базе $dbname – название базы После этого мы можем отдавать sql запросы с помощью mysql_query($query) где
$query – наш запрос.

Например:

<?
# определяем сервер, логин, пароль, название базы
$hostname = localhost;
$username = root;
$password = pass;
$dbname = forum;

# подключаемся к серверу
mysql_connect ($hostname,$username,$password);

# выбираем нужную базу
mysql_select_db($dbname);

# отдаем запрос к БД
$result = mysql_query(select * from table_1);
...
?>

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

================================================
---/// Основы sql-injection
================================================

Как вы могли заметить тестовые данные передаются в sql-запросах заключенными в кавычки ‘data отсюда можно сделать интересное замечание. Что если к скрипте данные для sql-запроса берутся из полученных от пользователя переменных и не фильтруются… Тогда мы можем попробовать вставить в запрос эту самую кавычку ""

Допустим есть скрипт выбирающий мыло пользователя из таблицы в соответствии с его логином:

<?
...
подключение к БД ...
...
получение данных из запроса ...

$result = mysql_query(select mail from users where login=$login);

...
?>

Если мы передаем в переменной $login нормальный текст например "lamer" то в sql будет выполнен запрос:

select mail from users where login=lamer

И все сработает как надо…

А теперь попробуем вставить кавычку: $login=hacker
И запрос будет такой:

select mail from users where login=hacker

И как мы сможем увидеть данный запрос выдаст нам ошибку. Отлично =) Лишняя кавычка сделала свое дело и мы смогли видоизменить запрос к базе данных. Наипростейший пример. Допустим приведенный выше скрипт позволяет смотреть пользователю его регистрационные данные. Теперь используя кавычку мы сможем посмотреть инфу всех пользователей, вот примерно так:

$login=blah or login=admin

И sql-запрос изменится на такой:

select mail from users where login=blah or login=admin

Т.е. вместо вывода мыла юзера, скрипт выдаст нам мыло админа данного скрипта.
Далее мы можем получить мыла всех пользователей:

$login=no_user or 1=1

sql запрос такой станет:

select mail from users where login=no_user or ‘1=1

Т.к. 1=1 всегда то запрос вернет все записи из таблицы.

Использование кавычки применимо в случае передачи в запрос текстовых данных, с числовыми данными все еще проще. Допустим скрипт выводит пароль пользователя в соответствии с его порядковым номером:

<?
...
$result = mysql_query(select password from users where num=$num);
...
?>

При передаче нормального номера скрипт отдает запрос к БД и запрос возвращает необходимые данные:

select password from users where num=7;

Тут мы можем изменить запрос даже не прибегая в кавычкам:

$num=1 or 2

и запрос станет:

select password from users where num=1 or 2;

Это основа данного типа атак. Также кроме кавычки есть еще символы которые смогут нам пригодится.

Точка с запятой ";" служит для разделения sql-запросов к базе данных. К сожалению не поддерживается в mysql =( так что далее в статье рассматриваться не будет. В случае если мы имеем дело с ms sql в которой данная возможность поддерживается то с её помощью мы получаем возможность отдавать несколько запросов в одной строке, например:

Рассмотренный выше скрипт:

<?
...
подключение к БД ...
...
получение данных из запроса ...

$result = mysql_query(select mail from users where login=$login);

...
?>

Если работает с ms sql то изменяем переменную вот таким образом:

$login=no_user; delete from users where login=admin

Запрос:

select mail from users where login=no_user; delete from users where login=admin;

Соответственно мы удалим запись у которой в поле login стоит значение "admin" =)

Также нам пригодятся "-" и "/*" это символы обозначающие в sql начало комментария. Пригодится чтоб отсекать лишние данные в запросах. Например:

$result = mysql_query(select mail from users where login=$login and post=123);

Если мы передадим переменную $login=no_user or 1=1 то запрос станет:

select mail from users where login=no_user or 1=1 and post=123;

Согласитесь не совсем то что нам надо = В этом случае нам и пригодится комментирование…

$login=no_user or 1=1;--

или

$login=no_user or 1=1/*

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



Похожие статьи:
- Таблицы во флеше? Легко!
- Ruby on Rails 0.13
- Установка Ruby
- Создание Rails приложения с помощью Streamlined
- Рельсы - скепсис
- Установка защиты на страницу используя MySQL и PHP
- Безопасный и удобный поиск на PHP
- Зачем интернету usability?
- XML. Обзор языка
- Как "заценить" собственный сайт?
- Простая поисковая система
- SSI: вкусно и полезно
- Поиск на странице Java Script


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.002]