Спасибо за немного теории, сей метод весьма изощрённо продуман, респект за такое. Был бы весьма благодарен, если после того, как всё это закончиться и фикс окажется в стейбле, теория немного расширилась бы, до момента/ситуации в которой непосредственно проводился экслойтинг, ради удовлетворения любопытства.GmHunter писал(а):Да, так оно и есть. Респект. Эта инъекция позволяет получить полный доступ к базе на чтение. Но не при помощи WPE. Ее очень трудно использовать, ни один нормальный запрос не влезает в пакет. Пришлось дробить запрос на кусочки, они отсылаются по отдельности и сохраняются во временных переменных на стороне сервера. Вручную этого не сделать, отсылается больше сотни пакетов, пришлось мутить прогу. Сделал на основе небольшого самодельного RO-бота, который я писал до появления OpenKore.
Надоело ботоводить?Тогда это предложение для вас/стать ГМ'ом
Модератор: 4epT
Сорри, был занят. К сожалению, с PillowsRO ничего не получится:
http://www.pillowsro.net/index.php?page=Server
Server backups of the account databases are done daily to ensure that if anything happens, you will not lose more than 1 days work. Passwords are also encrypted in MD5, meaning that no one is able to view your passwords, not even the Administrators.
http://www.pillowsro.net/index.php?page=Server
Server backups of the account databases are done daily to ensure that if anything happens, you will not lose more than 1 days work. Passwords are also encrypted in MD5, meaning that no one is able to view your passwords, not even the Administrators.
Большинство нормальных серверов проапдейтилось, теперь я могу рассказать о баге подробнее. Уязвимы SQL версии eAthena до SVN 11244 включительно, на сервере должна функционировать mail-система. SQL – инжекция возможна в функции mail_send (файл /map/mail.c):
sprintf(tmp_sql,"SELECT `account_id`,`name` FROM `%s` WHERE `name` = \"%s\"", char_db, jstrescape(name));
Используемая в афине функция jstrescape не обрабатывает двойные кавычки, но mysql их поддерживает на равне с апострофами. Всю инжекцию необходимо разместить в нике того, кому мы хотим отправить письмо. Появляется две проблемы: 1) В нике неможет быть пробелов, 2) Длина ника ограничена. Первая проблема решается путем использования всяческих извращений типа 0*, вторая проблема обходится благодаря наличию в MySql временных переменных, в которых путем серии коротких запросов собирается финальный длинный запрос. Счет там идет на байты, прошло несколько недель, пока я смог найти это решение Дальше встает другая проблема – надо получить результат. Описанный выше запрос выбирает из базы два столбца account_id и name. Строка, полученная из столбца name, не проходит jstrescape, и напрямую попадает в следующий запрос, заносящий сообщение в базу:
sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`to_account_id`,`to_char_name`,`from_account_id`,`from_char_name`,`message`,`priority`) VALUES ('%d', '%s', '%d', '%s', '%s', '%d')",mail_db, atoi(mail_row[0]), mail_row[1], sd->status.account_id, sd->status.name, jstrescape(message), flag);
Разработчики афины надеялись, что в mail_row[1] инжекции быть уже не может На предыдущем шаге в name формируется апостроф, и результат собранного во временных переменных запроса письмом уходит на наш собственный аккунт.
В образовательных целях выкладываю реализацию этого алгоритма на самодельном RO-боте. Не спрашивайте меня, как его юзать, достойные разберуться, а остальным халявы не будет
Мое предложение услуг более не действительно.
http://myfolder.ru/4588531
sprintf(tmp_sql,"SELECT `account_id`,`name` FROM `%s` WHERE `name` = \"%s\"", char_db, jstrescape(name));
Используемая в афине функция jstrescape не обрабатывает двойные кавычки, но mysql их поддерживает на равне с апострофами. Всю инжекцию необходимо разместить в нике того, кому мы хотим отправить письмо. Появляется две проблемы: 1) В нике неможет быть пробелов, 2) Длина ника ограничена. Первая проблема решается путем использования всяческих извращений типа 0*, вторая проблема обходится благодаря наличию в MySql временных переменных, в которых путем серии коротких запросов собирается финальный длинный запрос. Счет там идет на байты, прошло несколько недель, пока я смог найти это решение Дальше встает другая проблема – надо получить результат. Описанный выше запрос выбирает из базы два столбца account_id и name. Строка, полученная из столбца name, не проходит jstrescape, и напрямую попадает в следующий запрос, заносящий сообщение в базу:
sprintf(tmp_sql, "INSERT DELAYED INTO `%s` (`to_account_id`,`to_char_name`,`from_account_id`,`from_char_name`,`message`,`priority`) VALUES ('%d', '%s', '%d', '%s', '%s', '%d')",mail_db, atoi(mail_row[0]), mail_row[1], sd->status.account_id, sd->status.name, jstrescape(message), flag);
Разработчики афины надеялись, что в mail_row[1] инжекции быть уже не может На предыдущем шаге в name формируется апостроф, и результат собранного во временных переменных запроса письмом уходит на наш собственный аккунт.
В образовательных целях выкладываю реализацию этого алгоритма на самодельном RO-боте. Не спрашивайте меня, как его юзать, достойные разберуться, а остальным халявы не будет
Мое предложение услуг более не действительно.
http://myfolder.ru/4588531
В документации на MySqlKissa2k писал(а):Где можно почитать про временные переменные mysql (просто я не знаю про это ничего, и в сети ничего не нашел..) ?
9.3. User-Defined Variables
You can store a value in a user-defined variable and then refer to it later. This enables you to pass values from one statement to another. User-defined variables are connection-specific. That is, a user variable defined by one client cannot be seen or used by other clients. All variables for a given client connection are automatically freed when that client exits.