1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-web-hacking-101-zh

Клонировать/Скачать
18.md 19 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 03:04 a1c380c

Память

Автор: Peter Yaworski Переводчик: Летающий дракон

Протокол: CC BY-NC-SA 4.0

Описание

Переполнение буфера — это сценарий, в котором программа записывает данные в буфер или область памяти, превышая фактический размер выделенной области. Используя метафору с кубиками льда, можно представить, что у вас есть 12 ячеек, но вы хотите создать только 10. При заполнении ячеек вы добавляете слишком много воды и заполняете 11 позиций вместо 10. Вы переполняете буфер.

В лучшем случае переполнение буфера может привести к странному поведению программы, а в худшем — к серьёзным уязвимостям безопасности. Причина этого заключается в том, что при использовании переполнения буфера злоумышленник может использовать освобождённое пространство для записи данных, которые затем будут использоваться программой. Если это произойдёт, код, который будет выполняться, будет сильно отличаться от ожидаемого, что приведёт к ошибкам. Или же злоумышленник сможет использовать переполнение для записи и выполнения вредоносного кода.

Вот изображение из Apple, иллюстрирующее возможное переполнение буфера:

Первый пример показывает возможное переполнение буфера. Функция strcpy принимает строку Larger и записывает её в память, независимо от доступного пространства (белые ячейки) и записывая её в непредназначенное место (красные ячейки).

Переполнение буфера за пределами границ

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

Известным недавним примером уязвимости переполнения за пределами границ является уязвимость OpenSSL Heartbleed, обнаруженная в апреле 2014 года. На момент обнаружения примерно 17% (500 тысяч) серверов с безопасным подключением, которым выданы сертификаты доверенными органами, считались уязвимыми.

Heartbleed можно использовать для кражи закрытого ключа сервера, данных сеанса, паролей и других конфиденциальных данных. Он выполняется путём отправки сообщения «Heartbleed Request» на сервер, который отвечает сообщением, содержащим параметр длины. Серверы, уязвимые для этой атаки, выделяют память на основе параметра длины без проверки фактической длины сообщения.

Таким образом, Heartbleed использует небольшие сообщения и большие параметры длины для эксплуатации уязвимых получателей, которые считывают дополнительные данные, выходящие за рамки выделенной памяти для сообщения. Вот изображение из Википедии:

Хотя переполнение буфера требует более подробного анализа, чтение за пределами границ и Heartbleed выходят за рамки этой книги. Если вам интересно узнать больше об этих темах, вот несколько полезных ресурсов:

Обрезка памяти

Обрезка памяти — это техника, используемая для выявления уязвимостей путём принуждения кода к выполнению необычных или неожиданных действий, раскрывающих уязвимости. Её эффект похож на переполнение буфера, где содержимое раскрывается, когда оно не должно быть раскрыто.

Примером является инъекция пустых байтов. Это происходит, когда предоставляются пустые байты %00 или шестнадцатеричное значение 0x00, что приводит к неожиданному поведению принимающей программы. В C/C++ или низкоуровневых языках программирования пустой байт представляет конец строки или терминатор строки. Это может сказать программе немедленно прекратить обработку строки, игнорируя байты после пустого байта.

Когда код зависит от длины строки, последствия могут быть значительными. Если пустой байт считывается и обработка останавливается, длина строки становится равной 5. Например:

thisis%00mystring

Предполагается, что эта строка имеет длину 15, подразумевая, что если строка заканчивается пустым байтом, её длина равна 6. Это проблематично для низкоуровневых языков, управляющих собственной памятью.

Теперь, когда веб-приложения взаимодействуют с внешними API, библиотеками и другими вещами, написанными на C, это становится актуальным. Отправка %00 в URL может позволить злоумышленнику манипулировать более широким спектром ресурсов на сервере, особенно когда язык программирования имеет проблемы, такие как PHP, который написан на языке C.

Ссылки OWASP

См. OWASP Buffer Overflows (https://www.owasp.org/index.php/Buffer_Overflows), OWASP Reviewing Code for Buffer Overruns and Overflows (https://www.owasp.org/index.php/Reviewing_Code_for_Buffer_Overruns_and_Overflows), OWASP Testing for Buffer Overflow (https://www.owasp.org/index.php/Testing_for_Buffer_Overflow), OWASP Testing for Heap Overflow (https://www.owasp.org/index.php/Testing_for_Heap_Overflow), и OWASP Testing for Stack Overflow (https://www.owasp.org/index.php/Testing_for_Stack_Overflow). Также см. OWASP Embedding Null Code (https://www.owasp.org/index.php/Embedding_Null_Code).

Примеры

1. PHP ftp_genlist()

Сложность: высокая URL: нет Ссылка на отчёт: https://bugs.php.net/bug.php?id=69545 Дата отчёта: 12 мая 2015 г. Награда: $500 Описание: PHP, язык программирования, написанный на C, управляет собственной памятью. Как описано выше, переполнение буфера позволяет злоумышленникам записывать данные в недоступную память и потенциально выполнять удалённый код. Здесь функция ftp_genlist() FTP-расширения допускает переполнение или отправку более 4293 МБ данных, которые будут записаны во временный файл. Это делает выделенный буфер слишком маленьким, чтобы вместить данные, загружаемые обратно в память при создании файла, вызывая переполнение кучи.

Важный вывод

Переполнение буфера является давней и известной уязвимостью, но всё ещё широко распространено при работе с приложениями, управляющими собственной памятью, особенно C и C++. Если вы обнаружите, что работаете с веб-приложением, основанным на C (написанном на PHP), переполнение буфера представляет собой очевидную возможность. Однако, если вы новичок, возможно, стоит потратить больше времени на поиск и эксплуатацию простых инъекций, возвращаясь к переполнению буфера по мере накопления опыта.

2. Модуль Python Hotshot

Сложность: высокая URL: нет Ссылка на отчёт: http://bugs.python.org/issue24481 Дата отчёта: 20 июля 2015 года Награда: $500 Описание: Как и PHP, Python — это язык программирования, основанный на C. В модуле Hotshot, который является заменой существующего модуля profile и почти полностью написан на C, было обнаружено переполнение буфера в 2015 году. Оно связано с попыткой скопировать строку из одного места в другое. По сути, этот код называется memcpy, который копирует содержимое из одного места в другое, принимая количество байтов для копирования. Например:

memcpy(self->buffer + self->index, s, len);

Этот метод принимает три аргумента: str, str2 и n. str — это цель, str2 — источник для копирования, а n — количество копируемых байтов. Здесь они соответствуют self->buffer + self->index, s и len.

Здесь проблема заключается в том, что self->buffer всегда имеет фиксированную длину, но s может быть любой длины.

Поэтому при выполнении функции copy (как показано на диаграмме Apple выше) функция memcpy игнорирует фактическую длину целевого буфера, вызывая переполнение.

Важный вывод

Мы рассмотрели два примера функций, на которые повлияло неправильное выполнение, приводящее к переполнению буфера: memcpy и strcpy. Если мы знаем, что сайт или приложение зависят от C или C++, мы можем просмотреть исходный код библиотеки (используя что-то вроде grep) для поиска неправильного выполнения.

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

Однако, как упоминалось ранее, если вы только начинаете, возможно, вам следует отложить поиск таких уязвимостей и вернуться к ним, когда вы лучше познакомитесь с методами белого ящика. Сейчас нам не нужно вдаваться в технические подробности, связанные с областью памяти и «дескриптором» (понимание термина «дескриптор» выходит за рамки этой книги, поэтому нет необходимости разбираться), и приложение будет копировать дескриптор для создания копии данных. В этом и заключается уязвимость, реализация копирования использует strdup, а данные предполагается имеющими нулевой символ в качестве конца строки.

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

Важный вывод

Это пример очень сложной уязвимости. Хотя она слишком технична для этой книги, я включил её, чтобы показать её сходство с тем, что мы изучили. Когда мы разберём её, эта уязвимость также связана с ошибкой в реализации кода на языке C, а язык C связан с управлением памятью и копированием. Точно так же, если вы собираетесь исследовать уязвимости в программах на C, ищите места, где данные копируются из одной области в другую.

4. Утечка памяти в PHP

Сложность: высокая

URL: отсутствует

Ссылка на отчёт: https://bugs.php.net/bug.php?id=69453

Дата отчёта: 2015.4.14

Вознаграждение: $500

Описание:

Функция phar_parse_tarfile не учитывает имена файлов, начинающиеся с нулевого символа, который представляет собой байт со значением 0, то есть шестнадцатеричный 0x00.

Во время выполнения этого метода при использовании имени файла массив переполняется (то есть пытается получить доступ к несуществующим данным и выходит за пределы выделенной памяти массива).

Эта уязвимость важна, поскольку предоставляет хакеру доступ к памяти, которая должна быть ограничена.

Важный вывод

При работе с приложениями, которые сами управляют памятью, особенно на языках C и C++, утечка памяти является старой, но всё ещё распространённой уязвимостью, как переполнение буфера. Если вы обнаружите, что работаете с веб-приложением на основе языка C (PHP использует его для написания), обратите внимание на способ работы с памятью. Однако, если вы только начинаете, возможно, стоит потратить больше времени на поиск простых уязвимостей внедрения, и вернуться к утечке памяти, когда у вас будет больше опыта.

Заключение

Хотя уязвимости, связанные с памятью, могут вызвать большой резонанс, они также очень сложны и требуют значительного мастерства. Лучше оставить эти типы уязвимостей в покое, если у вас нет опыта программирования на низкоуровневых языках.

Современные языки программирования вряд ли будут затронуты, благодаря их стратегиям управления памятью и сборки мусора, но приложения, написанные на языке C, по-прежнему подвержены влиянию. Кроме того, при работе с современными языками, написанными на языке C, могут потребоваться некоторые навыки, как видно из примеров PHP ftp_genlist() и модуля Python Hotspot.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-web-hacking-101-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-web-hacking-101-zh.git
oschina-mirror
wizardforcel-web-hacking-101-zh
wizardforcel-web-hacking-101-zh
master