PHP глазами хакера 5-е издание


7 1

Я начал работу над 5-м изданием PHP глазами хакера. Книга будет обновлена с учетом 8-й версии PHP и есть планы добавить новую главу, а о чем она будет, пока секрет. 


Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку уже лайкнули 1 человек


Комментарии

toorr2p

04 Ноября 2023

Здравствуйте Михаил, купил сразу 2 ваши книги "PHP глазами хакера" и "WEB сервер глазами хакера", начал с первой.
В главе 3,4,3 Тюнинг PHP затронута очень важная тема о конфигурации PHP,
и у меня вопрос по поводу директивы open_basedir в которой вы советуете перечислить разрешенные пути.
Но какие они должны быть? Например если я хочу защитить CMS Bitrix в которой сайты на сервере располагаются в директориях
/home/bitrix/www
/home/bitrix/ext_www

Что мне указать, эти пути или что?
open_basedir = "/home/bitrix/www:/home/bitrix/ext_www"
так?


Михаил Фленов

04 Ноября 2023

базовая для обоих /home/bitrix, вот её и нужно указать. Но с точки зрения безопасности всё же лучше не хранить в home, используй /var/www/, которая по умолчанию. Просто помести сайты в /var/www/bitrix/www и в /var/www/bitrix/ext_www


toorr2p

04 Ноября 2023

>>>базовая для обоих /home/bitrix
спасибо попробую!

>>>используй /var/www/, которая по умолчанию
дело в том, что в BitrixVM все завязано именно на эти пути (создание хостов из меню виртуальной машины и пр. пр..)
/home/bitrix/www
/home/bitrix/ext_www

А чем не безопасен путь home ?


Михаил Фленов

04 Ноября 2023

Ну это директория пользователя и они не для Web. Настроить можно любую папку для Web, но просто пользовательские не желательно, это нелогично.


toorr2p

14 Января 2024

Здравствуйте, вопросы по главе "5,1 Загрузка файлов на сервер"
1) Почему нет проверки $_SERVER['HTTP_REFERER']?
Ведь могут же сканером проходить по сайту, отыскивая формы с INPUT type="file" и грузить туда свои зловреды.

2) Также не понял, как защитится к примеру от загрузке шелла, под видом картинки GIF, описанной в этой статье "CTF-соревнование: взлом ch4inrulz (1.0.1)" на securitylab ru ? Я проверил, действительно все описанные проверки в главе не предотвращают от загрузки такого файла (shell.gif) с содержимым:

GIF98
<?php
echo $_SERVER["DOCUMENT_ROOT"];
?>

Код с проверками (из листинга главы)
<?php
$uplDstDir = $_SERVER['DOCUMENT_ROOT'] . '/upload';
$uplFileName = md5(microtime());

//Check file size
if(!$_FILES['file1']['size'])
    die("Error fail upload file!");

//Check file max size
if($_FILES['file1']['size']>300*1024)
    die("Error file size is larger 100kb!");

//If it’s a picture, check its width and height
$arrSize = getimagesize($_FILES['file1']['tmp_name']);
if(!$arrSize[0] || !$arrSize[1])
    die("Error image dimensions must not be zero!");

//Check file type
preg_match("'([a-z]+)\/[x\-]*([a-z]+)'", $_FILES['file1']['type'], $ext);

if(!in_array($ext[2], array('jpg', 'jpeg', 'gif', 'png')))
    die("Error file format not allowed!");

//Moving a file from a temporary directory to a permanent one
$uplFileName = "$uplDstDir/$uplFileName.$ext[2]";
if(!move_uploaded_file($_FILES['file1']['tmp_name'], $uplFileName))
    die("Error file not upload!");
?>

Просьба подсказать как с этим бороться.


Михаил Фленов

14 Января 2024

Если есть защита от второго, то защита от первого не нужна. Для защиты от второго раньше использовали getimagesize. Сейчас я полез в документацию и там к сожалению написано:

Caution
This function expects filename to be a valid image file. If a non-image file is supplied, it may be incorrectly detected as an image and the function will return successfully, but the array may contain nonsensical values.

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


Михаил Фленов

14 Января 2024

Похоже вместо getimagesize нужно пробовать создавать картинку методами imagecreatefromgif или imagecreatefromjpeg. Нужно будет обновить книгу.  

    $gifimage = imagecreatefromgif($_FILES['file1']['tmp_name']);
    if ($gifimage) {
        if($_FILES['file1']['size']) {
            move_uploaded_file($_FILES['file1']['tmp_name'], './filename.gif');
        }
    }


Добавить Комментарий

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне