информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаГде водятся OGRыЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / web building
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Сервис снова взломан. Лови мыло. 09.06.06 10:55  Число просмотров: 3032
Автор: paganoid Статус: Member
<"чистая" ссылка>
<web building>
Страшный сон администратора уже реальность! 08.06.06 12:39  
Автор: xintrea Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Решил разместить здесь информацию для интересующихся.

Речь пойдет о некой базе для сетевых проектов, в которых необходимо обеспечить
выполнение произвольного кода (PHP) на строне сервера. То есть, задача - позволить
выполнять на сервере произвольный PHP код, который можетдобавитьивыполнить
_любой_ пользователь интернета.

Насколько вы понимаете, такой веб-сервис - потенциальная дыра в системе безопасности.

Причем, сделать все нужно максимально портабельно - не через экзотическую систему "виртуальная
машина" PHP 5 из расширения PECL (попробуйнайди такого хостера за пару грин в месяц), а
более простыми средствами.

Задача облегчается тем, что в выполняемом PHP коде нужно оставить только алгоритмическую часть, математические функции и функции вывода типа echo или print.


Обсуждение реализации такого сервиса, можно почитать здесь
http://phpclub.ru/talk/showthread.php?s=&threadid=81551&perpage=20&pagenumber=1

В результате сервис был сделан, и в данный момент запущен для проверки здесь
http://xi.net.ru/sandbox/webcode.php

Все запущено на FreeBSD + Apache, PHP ветки 4, SAFE MODE не включен.

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


На страничке находится поле для кода и кнопочка "Выполнить". Вы можете добавлять любой PHP-код, и если система посчитает его безопасным, он будет запущен на выполнение на сервере, а в окно браузера будет выдан результат.

Если система посчитает код опасным, будет выдано предупреждение с указанием опасной строки и конструкции в ней.

Скопируйте, например, такой код, и запустите его на выполнение

$i=3;
$j=5;
echo $i+$j;

В ответ будет выдано 8, т.е. система работает. Теперь нужно выяснить, насколько эта
система безопасна.


Соглашения.

- PHP код не нужно оформлять тегами начала-конца php-кода ("<?", "<?php", "?>" и тому подобные), система сама их добавит.

- В PHP коде разрешено использовать только алгоритмические конструкции языка, математические функции, команды echo и print.

- Вы можете описывать свои функции и использовать их.

- Для задания строк используйте апостроф. Использование двойных кавычек и обратного апострофа запрещено.

- Использование переменных переменных ($$) запрещено.

- Использование объектно-ориентированной части языка PHP запрещено.

- После проверки, введеный код выполняется через функцию eval().

- Код не проверяется на ошибки в синтаксисе PHP

- Код не проверяется на зацикленность

- Код не проверяется на возможность выделения достаточной памяти


В данный момент проверяется именно валидатор кода. Поэтому других мер безопасности - защита от флуда и прочее, пока не реализовано. Пожалуйста, не нарушайте работу сервера тупым JavaScript флудом и другими "нагружающими" поделками.


Проверка валидатора.
(то, ради чего все и затевалось)

В данный момент нужно выяснить главную вещь - действительно ли валидатор выявляет все опасные конструкции. Для этого, в тот же каталог, где расположен скрипт webcode.php, помещен файл msg.txt. Права на него назначены как 600, его содержимое могут читать php-скрипты, а непосредственно из интернета он не виден.

В файле msg.txt находится сообщение, которое необходимо каким-либо образом попытаться прочитать. Вы можете использовать любые технические методы взлома. Но обратите внимание, социальный хак хостера - это не круто . Взлом через сниффинг пароля на админку - за взлом webcode.php не считается )

Если вам удасться прочитать содержимое файла msg.txt, пожалуйста, пришлите мне текст этого файла, и по настроению - последовательность ваших действий. При нахождении дырки просьба сильно не резвиться на сервере, файлы не уничтожать. Если охота порезвиться, ограничтесь пожалуйста дефейсом.

Ваши замечания или отчеты об обнаруженных дырках присылайте пожалуйста на мой любимый e-mail dlagovna@mail.ru или размещайте в этой теме.


Спасибо.
Опа, по ходу дела уже взломали, щас разберуся как :) 08.06.06 12:52  
Автор: xintrea Статус: Незарегистрированный пользователь
<"чистая" ссылка>
А что ты хотел, тут ребята толковые, 13 минут хватит чтоб поломать :-). 08.06.06 13:08  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Отредактировано 08.06.06 13:09  Количество правок: 1
<"чистая" ссылка>
Да нет, дырку нашол товарищ с PhpClub.ru 08.06.06 14:45  
Автор: xintrea Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Да нет, дырку нашол товарищ с PhpClub.ru

Щас подумаю как ограничить то что нашли, и весь класс таких же конструкций.

Для интересующихся - ломанули так

$a = 'file_get_contents';
echo ${'a'}('msg.txt');


Мда, забавный у PHP синтаксис, даже не знаешь как можно извратиться.

Сейчас скрипт заблокирован, когда размещу новую версию - нипишу сюда.
Ого. А что, все опасные функции не написали в disable_functions ? 08.06.06 19:59  
Автор: ZloyShaman <ZloyShaman> Статус: Elderman
<"чистая" ссылка>
А этого ненужно. 08.06.06 23:14  
Автор: xintrea Статус: Незарегистрированный пользователь
<"чистая" ссылка>
А этого ненужно.
Вместо этого есть enable list, функции из которого разрешены, все остальное - запрещено.
В данной реализации в enable list внесены математические функции.

Только есть проблемма - обнаружить вызов функции.
Синтаксическим анализом это можно обнаружить, но дело портят переменные переменных ($$)
и варианты их написания.

Да, наверно сделаю перед вызовом кода еще и disable_functions(), хуже не будет.
Кстати, в PHP оказывается нет такой вещи как... 09.06.06 01:23  
Автор: xintrea Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Да, наверно сделаю перед вызовом кода еще и
> disable_functions(), хуже не будет.

Кстати, в PHP оказывается нет такой вещи как disable_function()!
Есть только runkit_function_remove(), но это PECL расширение, и потому
к поставленой задаче она не подходит.

Впринципе можно поиграться функцией rename_function() с заменой
имени запрещеной функции на случайную строку. А блин, тоже нет,
это тоже PECL функция.

Но хочу заметить - после первой переделки скрипта, его еще никто не ломанул. :))
Посему с нетерпением жду очередного хака.
В твоей затее вижу три варианта развития событий 09.06.06 11:07  
Автор: paganoid Статус: Member
Отредактировано 09.06.06 11:21  Количество правок: 1
<"чистая" ссылка>
>
> Но хочу заметить - после первой переделки скрипта, его еще
> никто не ломанул. :))

В твоей затее вижу три варианта развития событий

1. Положишь молодость :)
2. Ограничишь сервис до такой степени, что его функционал будет нулёвый - уже сейчас без кавычек как-то неуютно
3. В силу природной лени окружающих будешь думать, что ВОТ СЕЙЧАС я залатал все дырки (написав все регекспы и рулезы) - думаю, это будет не так.

Сделай RTFM про формальным системам (математика), просканируй книжку Пенроуза "Новый разум короля" - думаю тебе будет это весьма интересно.
rtfm 09.06.06 01:29  
Автор: ZloyShaman <ZloyShaman> Статус: Elderman
<"чистая" ссылка>
> Кстати, в PHP оказывается нет такой вещи как
> disable_function()!
Такой вещи действительно нет.
Есть директива disable_functions. Она устанавливается или в php.ini или при помощи ini_set()
Ок, посмотрим 09.06.06 11:57  
Автор: xintrea Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > Кстати, в PHP оказывается нет такой вещи как
> > disable_function()!
> Такой вещи действительно нет.
> Есть директива disable_functions. Она устанавливается или в
> php.ini или при помощи ini_set()

Впринципе, если ini_set() для полного списка функций будет работать шустро,
можно использовать. Перед eval() запустить блокировку функций, кроме разрешенных
(в нашем случае математических).

Если бы я так сделал сразу, первого хака по методу "изващаемя с синтаксисом"
у товарища не получилось бы.

Хорошо хоть такая опасная вещ как eval - это не функция, а языковая конструкция.
И она чотко щучится токенайзером. Хотя блин тоже не факт... Надо посмотреть,
можно ли в принципе вызвать eval() через переменную переменную.
не прокатит ini_set 09.06.06 12:16  
Автор: paganoid Статус: Member
<"чистая" ссылка>


> > > Кстати, в PHP оказывается нет такой вещи как
> > > disable_function()!
> > Такой вещи действительно нет.
> > Есть директива disable_functions. Она устанавливается
> или в php.ini или при помощи ini_set()

эта директива доступна на установку в режиме PHP_INI_SYSTEM - то есть только через php.ini или httpd.conf . В твоем предположении о работе двигла на обычных хостингах - не у всех есть доступ к php.ini.


>
> Впринципе, если ini_set() для полного списка функций будет
> работать шустро,
> можно использовать. Перед eval() запустить блокировку
> функций, кроме разрешенных
> (в нашем случае математических).
>
> Если бы я так сделал сразу, первого хака по методу
> "изващаемя с синтаксисом"
> у товарища не получилось бы.
>
> Хорошо хоть такая опасная вещ как eval - это не функция, а
> языковая конструкция.
> И она чотко щучится токенайзером. Хотя блин тоже не факт...
> Надо посмотреть,
> можно ли в принципе вызвать eval() через переменную
> переменную.
Как например у меня. Тоже доступа на редактирование нету. 09.06.06 12:49  
Автор: xintrea Статус: Незарегистрированный пользователь
<"чистая" ссылка>
>
>
> > > > Кстати, в PHP оказывается нет такой вещи как
> > > > disable_function()!
> > > Такой вещи действительно нет.
> > > Есть директива disable_functions. Она
> устанавливается
> > или в php.ini или при помощи ini_set()
>
> эта директива доступна на установку в режиме PHP_INI_SYSTEM
> - то есть только через php.ini или httpd.conf . В твоем
> предположении о работе двигла на обычных хостингах - не у
> всех есть доступ к php.ini.

Как например у меня. Тоже доступа на редактирование нету.

Действительно, глянул http://ru.php.net/manual/ru/ini.php#ini.list и вижу

disable_functions Только php.ini Доступна с версии PHP 4.0.1.

Такое впечатление, что если брать тока базовые функции PHP4, можно
полагаться только на блокировку через синтаксический валидатор.
Даже rename_function() - это PECL расширение... В общем ухожу на переосмысление.

Сервис снова в эфире. Ломаем дальше. 08.06.06 16:17  
Автор: xintrea Статус: Незарегистрированный пользователь
<"чистая" ссылка>

Учел пожелания профи, обновил скрипт валидатора.
Сервис запущен.
Жду обнаружения новых дырок.
Сервис снова взломан. Лови мыло. 09.06.06 10:55  
Автор: paganoid Статус: Member
<"чистая" ссылка>
Сервис снова остановлен :) 09.06.06 12:26  
Автор: xintrea Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Ага, ответил тебе письмом.

Для интересующихся, код взлома

$lol = 'file_get_contents';
$mamba = 'lol';
echo $bad*/$mamba/*bad('msg.txt');

Забыл, что комментарий тоже может являться разделителем
в терминах токенов T_WHITWSPACE и T_COMMENT - разные вещи.
А было настроено только на учет T_WHITWSPACE.

В данный момент сервис остановлен, идет переосмысление. :)))
Сервис запущен. Добавлена история взломов. 14.06.06 00:32  
Автор: xintrea Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Забыл, что комментарий тоже может являться разделителем
> в терминах токенов T_WHITWSPACE и T_COMMENT - разные вещи.
> А было настроено только на учет T_WHITWSPACE.

В сервис внесены коррективы и он снова запущен.
Для интереса, сервис теперь снабжен историей взломов.

Напоминаю адрес сервиса
http://xi.net.ru/sandbox/webcode.php
и снова взломан, лови мыло 14.06.06 10:09  
Автор: paganoid Статус: Member
Отредактировано 14.06.06 10:58  Количество правок: 1
<"чистая" ссылка>
subj.


и не взлом, вопрос по функционалу:

ээ, а как ВООБЩЕ двойную кавычку напечатать-то?
$mamba = '"mama mia"';
Без кавычки жизнь тугая вообще.
По традиции - иправлен и снова запущен 16.06.06 12:45  
Автор: xintrea Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> subj.
>
>
> и не взлом, вопрос по функционалу:
>
> ээ, а как ВООБЩЕ двойную кавычку напечатать-то?
> $mamba = '"mama mia"';
> Без кавычки жизнь тугая вообще.

Фак, что-то не добавилась мессага в форум, пешу второй раз.

Двойные кавычки зпрещены впринципе, разрешены только одинарные,
так как в двойных кавычках происходит парсинг содержимого
на предмет вычленения значащих лексем. При этом, в токенах
лексемы из строки с двойными кавычками невидны, поэтому
сложно надежно определять опасные конструкции в таких строках.


На данный момент сервис снова запущен.
http://xi.net.ru/sandbox/webcode.php


Для интересующихся - история взломов

Взлом N1

Время: 08.06.06 12:22
Автор: Valyala
Код:

$a = 'file_get_contents';
echo ${'a'}('msg.txt');


Взлом N2

Время: 09.06.06 10:57
Автор: Paganoid
Код:

$lol = 'file_get_contents';
$mamba = 'lol';
echo $bad*/$mamba/*bad('msg.txt');


Взлом N3

Время: 14.06.06 10:09
Автор: Paganoid
Код: Взлом через URL со специально искаженным кодом (использование символа 0Dh).

http://xi.net.ru/sandbox/webcode.php?httpcodetext=//$%0Decho%20file_get_contents(%27msg.txt%27);
Кстати говоря, вспомнилась одна аналогия с указанным... 14.06.06 10:04  
Автор: HoverHell Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Кстати говоря, вспомнилась одна аналогия с указанным сервисом: javascript.
Существуют случаи когда он фильтруется, оставляя только невредоносный код. Броузеры, если не ошибаюсь. Хотя там это сделанно отсутствием имплементации всех функций кроме определённых.
А математические функции в javascript есть.
P.S. Как видно по первой строчке, это всё просто так, к сведению.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach