Я начал работу над 5-м изданием PHP глазами хакера. Книга будет обновлена с учетом 8-й версии PHP и есть планы добавить новую главу, а о чем она будет, пока секрет.
Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку уже лайкнули 1 человек
Здравствуйте Михаил, купил сразу 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"
так?
базовая для обоих /home/bitrix, вот её и нужно указать. Но с точки зрения безопасности всё же лучше не хранить в home, используй /var/www/, которая по умолчанию. Просто помести сайты в /var/www/bitrix/www и в /var/www/bitrix/ext_www
>>>базовая для обоих /home/bitrix
спасибо попробую!
>>>используй /var/www/, которая по умолчанию
дело в том, что в BitrixVM все завязано именно на эти пути (создание хостов из меню виртуальной машины и пр. пр..)
/home/bitrix/www
/home/bitrix/ext_www
А чем не безопасен путь home ?
Ну это директория пользователя и они не для Web. Настроить можно любую папку для Web, но просто пользовательские не желательно, это нелогично.
Здравствуйте, вопросы по главе "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!");
?>
Просьба подсказать как с этим бороться.
Если есть защита от второго, то защита от первого не нужна. Для защиты от второго раньше использовали 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 проверка работала. Сейчас поиграю с функцией.
Похоже вместо getimagesize нужно пробовать создавать картинку методами imagecreatefromgif или imagecreatefromjpeg. Нужно будет обновить книгу.
$gifimage = imagecreatefromgif($_FILES['file1']['tmp_name']);
if ($gifimage) {
if($_FILES['file1']['size']) {
move_uploaded_file($_FILES['file1']['tmp_name'], './filename.gif');
}
}
Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.