Для изученияв всего этого дела создал простую талицу мискл, и файлик php на локальном хосте, который подключается к базеи тянет от туда данные. Естественно ничего не защищал, передавал данные GET, никак их не фильтруя.
<?php
// данные доступа к базе данных
$db_host="localhost"; // обычно не нужно изменять
$db_user="root"; // имя пользователя БД
$db_password=""; // пароль БД
$db_name = "spl"; // имя БД
$table = "category";
$where = $_GET['var']; // имя таблицы статистики
// соединение с БД
mysql_connect($db_host, $db_user, $db_password) or die (mysql_error());
mysql_select_db($db_name) or die (mysql_error());
mysql_query('SET NAMES utf8');
// Выполняем запрос: выбрать ID пользователей, которые посетили приложение более 10 раз
$query = "SELECT name FROM " . $table . " where parent=" .$where;
echo $query;
$sql = mysql_query($query);
// обрабатываем полученный результат
// если нужно, то узнаем количество выбранных значений
$num_rows = mysql_num_rows($sql);
echo "<hr> количество полей = " . $num_rows.'<hr />';
// выводим данные
while ($sql_data = mysql_fetch_array($sql)) {
echo $sql_data['name'].' - '.$sql_data['post_title'].'<br />';
}
В результате исполнения запроса: index.php?var=-1 order by 20 выдается ошибка: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:\home\test2.ru\www\index.php on line 30, а в том видео это прокатило.
Далее почитал факи, везде описывается именно данный метод инъекции. И у все все работает. Проверил на локалке у себя, на хостере (1gb.ru) - везде такая песня(((
Спустя 1 час, 5 минут, 5 секунд (9.01.2012 - 09:36) Игорь_Vasinsky написал(а):
говоря об атаках на БД, то реч скорее всего подразумевается использование POST или GET
а если злоумышленник из твоего кода... тут уже считай хост порвали.
а если злоумышленник из твоего кода... тут уже считай хост порвали.
Спустя 53 минуты, 53 секунды (9.01.2012 - 10:30) Michael написал(а):
Цитата (287_08) |
На форуме: 2 года, 4 месяца, 2 дня |
Цитата |
sql injection, Время пришло узнать |
Спустя 3 часа, 49 минут, 8 секунд (9.01.2012 - 14:19) 287_08 написал(а):
Цитата |
и не говори |
На форуме то я долго, заниматься стал сейчас. Тот пример написан просто изучить основы и понять что это такое вообще.
Каким GET запросом произвести инъекцию в тот код, на все запросы которые я вводил просто выдается ошибка, запрос не исполняется.
Спустя 2 часа, 12 минут, 9 секунд (9.01.2012 - 16:31) SlavaFr написал(а):
index.php?var=-1 or 1=1
Спустя 29 минут, 13 секунд (9.01.2012 - 17:01) inpost написал(а):
287_08
Честно? Отвратительный пример взлома :) Я недавно парню показывал пример, так я на деле показывал, как можно авторизироваться с правами администратора имея такой похожий запрос.
Если ты в скрипт передаёшь значение, то обрабатывай его (int), а если ты передаёшь текст, то в запросе mysql текст обрамляется одинарными кавычками (Что ты не сделал для parent!!!) и в добавок переменную обрабатываешь mysql_real_escape_string. Теперь проблем со взломом не будет.
Перед тестом надо не забыть ОТКЛЮЧИТЬ МАГИЧЕСКИЕ КАВЫЧКИ, потому что они будут портить возможность тестирования такого метода.
Смысл в том, что если хотя бы 1 запись была выбрана, тогда прогонять цикл.
Но беда не в этом, беда в самом запросе, поэтому напиши:
Дело в том, что матюкаться на запрос он будет в том случае, если mysql_query вернёт ошибку, а не 0 записей, а ошибка из-за синтаксиси либо чего другого.
Инъекция - это не ошибка запроса, а удачно пройденный запрос, поэтому не стесняйся в этих целях использовать or die(), потому что если sql-inj пройдет успешно, то or die не сработает!
Честно? Отвратительный пример взлома :) Я недавно парню показывал пример, так я на деле показывал, как можно авторизироваться с правами администратора имея такой похожий запрос.
Если ты в скрипт передаёшь значение, то обрабатывай его (int), а если ты передаёшь текст, то в запросе mysql текст обрамляется одинарными кавычками (Что ты не сделал для parent!!!) и в добавок переменную обрабатываешь mysql_real_escape_string. Теперь проблем со взломом не будет.
Перед тестом надо не забыть ОТКЛЮЧИТЬ МАГИЧЕСКИЕ КАВЫЧКИ, потому что они будут портить возможность тестирования такого метода.
if(mysql_num_rows($sql))
{
while() {
тут содержание
}
}
else
echo 'Таких записей в БД нет!';
Смысл в том, что если хотя бы 1 запись была выбрана, тогда прогонять цикл.
Но беда не в этом, беда в самом запросе, поэтому напиши:
mysql_query($query) or die(mysql_error());
Дело в том, что матюкаться на запрос он будет в том случае, если mysql_query вернёт ошибку, а не 0 записей, а ошибка из-за синтаксиси либо чего другого.
Инъекция - это не ошибка запроса, а удачно пройденный запрос, поэтому не стесняйся в этих целях использовать or die(), потому что если sql-inj пройдет успешно, то or die не сработает!