На главную | Содержание | Назад | Вперёд
Наши друзья

 

 

Ошибки при классификации

Классификация или разбиение по категориям имеет огромное значение для программного обеспечения. После принятия решения на основе классификации, выполняется целый логический блок программы. Следовательно, ошибки при классификации могут иметь катастрофические последствия.
В программном обеспечении классификация очень важна. После принятого решения программа вызывает определенные модули и/или запускает крупные блоки подпрограмм. В качестве хорошего примера классификации запросов и возникающих при этом опасных ситуаций можно назвать способ, используя который HTTP-серверы принимают решение о типе запрашиваемого файла: сценарии должны обрабатываться с помощью одного механизма, исполняемые файлы — с помощью CGI-программ, а обычные текстовые файлы — с помощью своего текстового редактора. Хакеры ужа давно разобрались, как запросить нужный файл и одновременно "убедить" Web-сервер, что этот файл является чем-то совершенно другим. Наиболее распространенный способ использования этого метода в атаках позволяет хакерам получать двоичные файлы CGI-программ или файлы сценариев, в которых содержатся жестко закодированные пароли или другая ценная информация.
Шаблон атаки: вынужденная ошибка Web-сервера
Уже достаточно широко известны проблемы, связанные с ошибками классификации, которые происходят при исследовании Web-сервером нескольких последних символов в имени файла. Web-сервер исследует эти символы, чтобы определить, какой тип файла запрашивается. Использовать эти проблемы можно самыми разнообразными методами, например, добавляя определенные строки к именам файлов, добавляя символы точки и т.д.
Ошибка классификации в спецификаторе файловых потоков NTFS
ДЛЯ использования одной из ошибок классификации Web-сервера строка ::$DATA добавляется в конце имени файла. Программный код Web-сервера исследует три последних символа в строке и обнаруживает "расширение" АТА. В результате при запросе в виде /index.asp: : $data, Web-сервер не в состоянии обнаружить, что запрашивается ASP-файл и услужливо возвращает содержимое файла (используя подпрограммы, скрытые от злоумышленников).
Создание эквивалентных запросов
Многие команды проходят синтаксический анализ или фильтрацию. Во многих случаях в фильтре учитывается только один конкретный способ форматирования команды. На самом деле одну и ту же команду можно закодировать тысячами разных способов. Достаточно часто альтернативно закодированная команда позволяет добиться того же результата, что и оригинальная команда. Таким образом две команды, которые с точки зрения фильтра программы выглядят по-разному, позволяют получить одинаковый результат. Во многих случаях для проведения успешных атак хакеры пользуются альтернативно закодированными командами, которые позволяют им выполнить обычно запрещенные действия.
Исследование на уровне функций API
ДЛЯ ТОГО чтобы найти и составить перечень альтернативных кодировок команд, удобно написать небольшую программу, которая "прогонит" все возможные входные данные для конкретного вызова функции API. Такая программа может, например, различным способом шифровать имена файлов. Для каждого шага в цикле в вызов API может передаваться искаженное имя файла, после чего будет записываться результат.
В следующем фрагменте кода осуществляется циклическая проверка различных значений, которые могут использоваться в качестве приставки для строки \test. txt. Результаты запуска подобной программы помогут нам определить, какие символы могут использоваться для проведения атак, связанных с переходом вверх по дереву каталогов (../../).
int main(int argc, char* argv[]) {
for(unsigned long c=0x01010101^ != -l;c + + )
{
char _ffii§pafh[[255}! ;
% с » 24, с >> 16, с >> 8,c&ChOOOOOOFF ); try
{
FILE *iiin_ffliL£ = fopenOfilepath, "r");
if(in_file)
{
printf("«h£cki«g3 path %s\rr", filepath);
puts("file opened!"); getchar () ; felose(in_file) ;
} }
catch(...)
f
}
}
return 0;

В строке могут быть выполнены небольшие (но автоматические) изменения. В конечном счете изменения в строке запроса сводятся к попытке использования различных хитростей для получения одного и того же файла. Например, одна из попыток может привести к появлению следующей команды.
sprintf(_filepath, "..%c\\..%c\\..%c\\..%c\\scans2.txt"/ с, с, с, с) ;
Этот процесс можно представить себе в виде последовательности уровней. Мы стремимся попасть на уровень вызова функции API. Если программист установил до вызова функции API какие-либо фильтры, то эти фильтры можно считать дополнительными уровнями, которые защищают оригинальный набор функциональных возможностей. Используя все возможные входные данные для доступа на уровень функции API, мы начинаем раскрывать и исследовать установленные в программе фильтры. Если мы точно знаем, что в программе используются вызовы функций API, то можно проверить все варианты кодирования имени файла. В случае успеха одна из хитростей сработает, наши данные успешно проникнут сквозь фильтры и будут переданы вызову функции API.
Воспользовавшись методами, описанными в главе 5, "Взлом клиентских программ", можно составить перечень управляющих кодов, которые могут быть вставлены в вызов API (многие из которых позволяют обойти фильтры). Например, если данные были специально переданы (с помощью конвейера) в командный интерпретатор, мы можем получить реально работающие управляющие коды. Конкретный вызов может записывать данные в файл или поток, специально предназначенные для просмотра информации на экране термина или в окне клиентской программы. В качестве простого примера следующая строка содержит два символа возврата на одну позицию, что, вероятнее всего, проявится при выполнении команды на терминале.
write("echo hey!\xO8\xO8") ;
Когда терминал обрабатывает принятые данные, из оригинальной строки будут стерты два последних символа. Эта хитрость использовалась очень долго для искажения данных в файлах журналов. В файлах журналов сохраняется вся информация о выполненных транзакциях. Хакер может внедрить символ NULL (например, %00 или \ 0) или добавить так много дополнительных символов в строку, что запрос в журнале будет сохранен в "ук°роченном" виде. Представьте себе запрос, в окончании которого будет содержаться более тысячи дополнительных символов. Очевидно, что в журнале строка будет сохранена не полностью и важные данные, указывающие на проведение атаки, будут утрачены.

 

На главную | Содержание | Назад | Вперёд
 
Яндекс.Метрика