[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: _SERVER['SERVER_NAME']
Iura_185
Привет, подскажите плиз не давно создал свой сайт и ищу разные уязвимости которые нужно сразу предотвратить.

Xss и SQL-инъекций сайт защищен, и include - от подключаемых скриптов не известных с нуль байтом и так далее тоже - проверка стоит на существование скрипта из массива, если скрипта нет на сервере отбрасываем пользователя.

Как то так -

if(isset($arrayfile[$name])){
include($_SERVER['DOCUMENT_ROOT'].'/scripts/$arrayfile[$name].php');
}else{
//Подключаем другой файл
}


Но тут наткнулся на одну новую статью на хабре http://habrahabr.ru/post/166855/

И сразу начал тестить что и как, в php скриптах не используется $_SERVER['HOST_NAME'], но сервер $_SERVER['SERVER_NAME'] используется, для переадресации (header).

Тестировал, потом посмотрел логи что получилось, запросы попали в error log с текстом "Client sent malformed Host header"

У меня сервер уязвим сейчас? - нужно что то править, просто я не давно только этим занялся, и многого не знаю в структуре сервера...

Все запросы такие как "$out.= "Host: /www.site.ru\r\n"; , $out.= "Host: ../../www.site.ru\r\n"; $out.= "Host: /~%#$^&*()<>?@\!.\"'{}[]=+|\r\n";" попадают под ошибку 400

Но запросы с вымышленным Hostom - который может существовать обрабатываются 200 ("Host: http://www.uoppsow.ru/") - с таким хостом допустим работают - 200,
но $_SERVER['SERVER_NAME'] только в скриптах для переадресации

header('Location: http://'.$_SERVER['SERVER_NAME'].'/');
exit;
больше не где $_SERVER['SERVER_NAME'] не используется.


И еще один вопрос, сервер не отдает информацию "HTTP/1.1 200 OK Server: и так далее " если убрать "HTTP/1.1 из запроса к ниму", он выдает только файл индекса - стандартный который прописан - это нормально (Здесь уязвимости нет)?
Iura_185
+++
Valick
Iura_185, на форуме есть человек, который за денюшку проверит ваш сайт.
http://phpforum.su/index.php?showtopic=23941

_____________
Стимулятор ~yoomoney - 41001303250491
Iura_185
Цитата (Valick @ 6.03.2015 - 10:06)
Iura_185, на форуме есть человек, который за денюшку проверит ваш сайт.
http://phpforum.su/index.php?showtopic=23941

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

header('Location: http://'.$_SERVER['SERVER_NAME'].'/');
exit;

В $_SERVER['SERVER_NAME'] можно все что угодно поместить, $_SERVER['SERVER_NAME'] мне нужен только для переадресации (header)
Я хочу понять можно ли какой-то левый код отправить (с байтами там или что то подобное) в последствие чего на сервере может открыться какая та дыра?
Конечно я могу сделать проверку в скриптах

if($_SERVER['SERVER_NAME']=='http://site.ru' OR $_SERVER['SERVER_NAME']=='http://www.site.ru'){
header('Location: http://'.$_SERVER['SERVER_NAME'].'/');
exit;
}else{
header('Location: http://site.ru/');
}

Это делается очень быстро, но меня другой гложит вопрос - можно ли изменить $_SERVER['SERVER_NAME'] так чтоб хакнуть сам сайт, залить на него чего то или просто прочесть нужную злоумышленнику инфу.

Можно какие то примеры, я проверю.

Register_Globals - off в php.ini
inpost
В теории подменяются только те переменные, что начинаются с HTTP_ , поэтому уязвимости в SERVER_NAME я не вижу. С другой стороны кто-то может в скрипте переопределить по слану:
$_SERVER['DOCUMENT_ROOT'] = 'моё имя';
но тут будет палка в 2 конца, если он подменил код, значит получил доступ к файловой системе, значит уже не безопасно и мог и код изменить.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Guest
Цитата (inpost @ 7.03.2015 - 17:23)
С другой стороны кто-то может в скрипте переопределить по слану:
$_SERVER['DOCUMENT_ROOT'] = 'моё имя';

Не понял, как злоумышленник может подменить $_SERVER['DOCUMENT_ROOT'] ?

1. Register_Globals - off в php.ini
2. Во всех скриптах кроме index.php подключаются именно те файлы которые мне нужны, то есть прописаны на стороне сервера, а не

include_once($_SERVER['DOCUMENT_ROOT'].'/scripts/$_GET['file'].php');

В самом главном скрипте, index.php, написал следующий код


if(isset($_GET['file'])){
$file=mysql_real_escape_string($_GET['file']);
$ss1=mysql_query("SELECT * FROM `script` WHERE `file`='$file'");
$ss2=mysql_fetch_array($ss1);
$ssid=$ss2['id'];
$ssfile=$ss2['file'];
if($ssid>0){
include_once($_SERVER['DOCUMENT_ROOT'].'/script/'.$ssfile.'.php');
}else{
include_once($_SERVER['DOCUMENT_ROOT'].'/script/back.php');
}
}
else{
include_once($_SERVER['DOCUMENT_ROOT'].'/script/site.php');
}


Смысл следующий - проверяем не перешагнул ли человек на какой то скрипт if(isset($_GET['file'])), если не перешагнул показываем главную страницу.
Если перешагнул, проверяем существует ли скрипт на сервере - "SELECT * FROM `script` WHERE `file`='$file', если есть id - подключаем его, если нет подключаем другой скрипт.
А еще для себя, в начале каждого скрипта прописан некий код, в котором должна передаться переменная, она находится в index.php, если переменная не передалась значит скрипт открыт не через index.php, тогда отбрасываем человека если он перешагнул примерно так site.ru/script/script.php, он строго должен отправить запрос index.php?file=??? иначе дальше не сможет лазить по сайту.

3. Я проверял сервер на подмену через Куки, get, post. Отправлял на сервер запросы с _SERVER['DOCUMENT_ROOT']=sfamkfsasjk - не чего не меняется. Нужная директива которая прописана открывается.

4. И наконец нет таких скриптов где было бы что то подобное прописано $_SERVER['DOCUMENT_ROOT']=$_GET['root']; :))
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.