Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #90, ИЮНЬ 2006 г.

PHPenetration

Zadoxlik (antichat.ru)

Хакер, номер #090, стр. 090-072-4


eval("\$$register_poll_vars[$i] = \"".trim($HTTP_GET_VARS[$register_poll_vars[$i]])."\";")

Передавая в GET'е параметр id в виде id={${php_code}}, я получили веб-шелл. Что означает ${php_code}}, читай ниже.

preg_replace - зачем там /e?

Функция preg_replace заменяет подстроку (первый параметр), заданную регулярным выражением, на строку (второй параметр), которая также может быть задана регулярным выражением в данной строке (третий параметр). Также существует необязательный 4-ый параметр, но он нас не интересует.

Заменяемая подстрока имеет следующий формат:

[разделитель][выражение][разделитель][модификаторы]

Разделитель - это любой неалфавитный символ (чаще всего это / или #),

Выражение - собственно сам шаблон заменяемого фрагмента, а модификаторы - своего рода указатели. Они указывают правила, по которым обрабатывается регулярное выражение. Каждый модификатор записывается как буква. Например, модификатор i означает поиск без учета регистра. В заменяющей строке могут быть использованы «результаты поиска» в данной строке. В заменяемой подстроке фрагменты результатов логически обозначаются взятием в скобки. Смотри: «/(.*)/i» означает поместить всю данную строку в результат №1. Номеруются результаты, начиная с первого номера, по порядку, слева направо, по ходу расположения открывающихся логических скобок в заменяемой подстроке. Чтобы поместить результат с номером n, в заменяющей строке используется сочетание \\n или равносильное $n. Пример:

$c="aba";$c=preg_replace("/([ab]+)/i", "<b>$1</b>", $c);

Здесь переменная $c примет значение <b>aba</b>

Тебя, конечно же, заинтересовал модификатор «e», используемый в preg_replace. Он предполагает то, что перед тем, как заменить в исходной строке фрагменты, найденные регулярным выражением новой подстрокой (repalcement), он эту подстроку интерпретирует как PHP-код. Значит, если у нас с тобой есть строка $c="ping", то, прогнав вот такой вот PHP-сценарий

$c=preg_replace("/^(.*)$/ie", "print('\\1')", $c);

на монитор, мы получим содержимое строки $c - «ping». На практике рассмотрим нашумевшую PHP-инъекцию в phpBB, в коде viewtopic.php. Давай поймем, в чем фишка этой инъекции. Итак, вот фрагмент кода viewtopic.php из phpBB версии 2.0.15:

$message = str_replace('\"', '"', substr(@preg_replace

('#(\>(((?>([^><]+|(?R)))*)\<))#se',

"@preg_replace('#\b(" . str_replace('\\',

'\\\\', $highlight_match) . ")\b#i',

'<span style=\"color:#" . $theme['fontcolor3'] .

"\"><b>\\\\1</b></span>', '\\0')"

, '>' . $message . '<'), 1, -1));

highlight_match - переменная, где лежат слова, которые следует подсветить. Пользователь задает $_GET['highlght'], где пробелы разделяют различные слова. $highlight_match - его потомок, где вместо пробелов используется |. Трудно разбирать такое длинное выражение. Поэтому просто посмотри: $highlight_match участвует в параметре replacement функции preg_replace, где в заменяемой подстроке участвует модификатор «e». Причем $highlight_match нигде не обрамляется в addslashes. Это означает, что ты преспокойно можешь внедриться в тот PHP-сценарий, который выполнится перед заменой подстроки, в строке $message.

Назад на стр. 090-072-3  Содержание  Вперед на стр. 090-072-5
Hosted by uCoz