Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #69, СЕНТЯБРЬ 2004 г.

Железный скрипт

Докучаев Дмитрий aka Forb

Xakep, номер #069, стр. 069-130-3


Необходимо отметить, что передавать данные следует только методом POST, а GET применять лишь на стадии отладки. Я могу привести как минимум две причины, следуя которым необходимо отказаться от GET.

Во-первых, хакер, который видит все признаки GET-запроса, пытается изменить значение переменных прямо через браузер. В итоге, если твой скрипт действительно небезопасен, злоумышленник может совершить какую-нибудь пакость. Когда данные передаются POST'ом, взломщику нужно заглянуть в HTML-код, узнать переменные, которые получает скрипт, а лишь затем подставить их в поток. Впрочем, ты можешь усложнить миссию хакера, если заюзаешь следующую конструкцию:

die if ($ENV{REQUEST_METHOD} ne ‘POST’);

При таком раскладе хакер должен сохранить HTML-документ к себе на винт, затем немного его пропатчить, а лишь потом скормить переменные скрипту. Поверь, не каждый взломщик пойдет на такие извращения :).

Во-вторых, если ты юзаешь GET, любой локальный юзер в системе может узнать пароли, передаваемые сценарию (если, конечно, таковые имеются). Это делается при помощи команды grep password access_log с последующим варьированием шаблона.

Уф, кажется, я убедил тебя отказаться от GET. Раз я заговорил о паролях, продолжим эту тему. Некоторые администраторы любят делать дефолтные пароли в своих сценариях либо писать их чистым текстом. Когда ты занялся изготовлением фриварного скрипта, забудь о значениях по умолчанию. Лучше наколбась какой-нибудь install.cgi, который запросит пароль у пользователя. Если же ты юзер, выбравший творение с дефолтным паролем, – немедленно поменяй его на сложную фразу, иначе тебя легко поломают.

Никогда не пиши пароль чистым текстом. Если хакер имеет доступ к FTP либо SSH, то он сможет его подсмотреть, а затем использовать в корыстных целях. Лучше зашифруй пассворд функцией crypt(), а затем сравнивай пришедший извне пароль с эталонным. Это делается следующим образом:

$pass="fDwb42WrIg4De";

$pass2=param(‘pass’);

die print "Error\n" if (crypt($pass2,substr($pass,2)) ne $pass);

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

Суидные скрипты

Порой приходится писать суидные сценарии (скрипты, запускаемые из под рута), которые обрабатываются специальным интерпретатором /usr/bin/suidperl. Он создан специально для работы с подобным кодом. Когда создаешь такие вещи, нужно обращать особое внимание на безопасность, в противном случае взломщик может порутать сервер за несколько минут. По умолчанию компилятор запускается с опцией –T, которая отвечает за так называемую taint-проверку. Подобная вещь анализирует внешние данные. Если в сценарии используются переменные окружения либо небезопасные параметры, скрипт немедленно завершает работу. Некоторые «продвинутые» программисты забивают на такую проверку, блокируя ее флажком –U. В итоге вся безопасность сводится на нет. Никогда не отказывайся от Taint-проверки, если она действительно необходима.

Назад на стр. 069-130-2  Содержание  Вперед на стр. 069-130-4