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. |