Как вызвать отказ в обслуживании на моем локальном PHP-сервере?

Предисловие: я студент бакалавриата компьютерных наук, который скоро закончит учебу, но у меня практически нет опыта в веб-разработке и PHP в частности. Извиняюсь за незнание.

Предыстория: я пытаюсь создать простую уязвимость DoS на моем собственном локальном PHP-сервере, на котором работает XAMPP на 64-битной виртуальной машине Linux (18.04). Чтобы убедиться, что я не просто увеличиваю загрузку ЦП на виртуальной машине за счет локальной активности, я запускаю другую виртуальную машину, на которой я использую скрипт Python вместе с библиотекой «requests» для запроса уязвимой страницы 10 000 раз в цикле. На данный момент уязвимая страница (dos.php) запускает цикл, в котором она добавляет случайное число к списку, а затем выводит хэш общей текстовой строки, которые совершенно не связаны, кроме предположительно интенсивного использования ЦП.

Проблема: я узнал, что могу вывести данные об использовании памяти и ЦП в браузер (через https://devdojo.com/tutorials/how-to-get-memory-and-cpu-usage-in-php). Проблема в том, что мне не удалось увеличить загрузку ЦП на сервере выше 4%... Память составляет примерно 30%. Тем не менее, я знаю, что делаю небольшую часть правильно, потому что я вижу увеличение с 0-1% до 4%, но ничего сверх этого.

Конечная цель — продемонстрировать доказательство концепции, где я показываю, что фаззер (SlowFuzz) может найти эту уязвимость, если указать на документ PHP. Как только у меня появится DoS-уязвимость, я планирую написать очень простую и намеренно сломанную функцию. Что-то вроде цикла, в котором пользователь определяет верхнюю границу.

Вот изображение PHP на dos.php: Код PHP

Заранее спасибо за вашу помощь! Надеюсь, это не слишком глупый вопрос.


person ndsamu    schedule 05.12.2018    source источник


Ответы (1)


Apache можно легко подвергнуть DoS-атаке, заполнив очередь запросов клиентами с медленным чтением.
Apache настроен на максимальное количество одновременно подключенных клиентов и по умолчанию не устанавливает минимальную скорость чтения для клиентов, поэтому считывает ответ размером 1 байт. /sec будет удерживать соединение открытым очень долго и уменьшит количество повторных подключений, необходимых вашему инструменту DoS, а также уменьшит вероятность прохождения обычного клиента.

Современные настройки Apache будут отбрасывать клиентов, которые читают слишком медленно, или отклонять чрезмерные соединения с одного и того же адреса, чтобы предотвратить такого рода атаки. Я не уверен, включает ли это установка XAMPP по умолчанию.

person Cobra_Fast    schedule 05.12.2018
comment
Спасибо за ваш вклад. Я очень ценю помощь. Однако я не уверен, что это будет достаточным решением, так как суть проекта заключается в отказе в обслуживании с перегрузкой процессора. Поэтому я не знаю, будет ли это на самом деле воздействовать на процессор. - person ndsamu; 05.12.2018
comment
DoS-атаки, связанные с процессором, становятся все более и более сложными по мере того, как оборудование и программное обеспечение становятся более эффективными с течением времени. У вас возникнут проблемы с тем, чтобы заставить его работать с вашим O (n) PHP-скриптом. Возможно, вы можете получить более высокую перегрузку, если будете рассылать спам-запросы параллельно (если вы этого еще не сделали). - person Cobra_Fast; 06.12.2018
comment
Это именно то, о чем я думал. Но суть этой атаки в том, что потребуется всего один пакет. Вот почему такой параметр, как верхний предел, будет типом предполагаемой цели. Но я не могу найти способ увеличить сложность таким образом, чтобы это действительно повлияло на использование. Может быть, хеш-функция с массивным вводом? Или серия вложенных циклов? Я немного смущен тем, какая функциональность больше всего влияет на процессор. Если в PHP есть форки, может ли это быть форк-бомбой? Любые предложения приветствуются. - person ndsamu; 06.12.2018
comment
PHP-потоки posix_fork() и pthreads невероятно глючат при вызове из Apache, вам нужно сначала запустить скрипт PHP-CLI. - person Cobra_Fast; 06.12.2018