[php, mysql] уязвим ли код?

Jekich

Есть скрипт на php - суть, счетчик скачивания файлов.
 

$directory='files';
if($_GET['file']{0}=='.') error('Wrong file!');

if ( file_exists($directory.'/'.$_GET['file']) ){
mysql_query(" INSERT INTO download_manager SET filename='".mysql_real_escape_string($_GET['file'])."'
ON DUPLICATE KEY UPDATE downloads=downloads+1");
header("Location: ".$directory."/".$_GET['file']); exit;
}

Так как отсутствует фильтрация (привычная, например убрать слэши) переменной file, то меня это заинтересовало... Передавал строку, начинающуюся с /
Например, file=/../files/1.txt для функции file_exists ничем не отличается от file=1.txt
Но добился только того, что можно записать в БД кучу строк... Не очень интересно
Так как используется header а не инклуд, то прочитать ничего интересного не получится.
Вопрос - можно ли как-нить провести sql-инъекцию?

artimon

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

AlexV769

file_exists ещё каталоги мимо себя пропустит, т.е. считаться будет явно много мусора.
is_file(realpath должен быть более корректен.

Andbar

ещё лучше is_readable, коль уж его скачивать затем собираются.

Jekich

Про мусор все ясно.
filename  | varchar(128)  

Можно засорять слешами, точками... ('////', ''/./././' и т.д.)...
Но вот возможность sql-инъекции похоже реально не существует :(
А все таки хочется ее получить

Dasar

Так как отсутствует фильтрация (привычная, например убрать слэши) переменной file, то меня это заинтересовало...
такая фильтрация нужна для отсутствия "php-иньекции".
от sql-иньекции достаточно заэскейпить параметры, что и сделано в коде с помощью функции mysql_real_escape_string

Jekich

mysql_real_escape_string
Сорри, mysql_real_escape_string появилась позже в ходе тестирования...
Естественно вопрос актуален для незаэскейпенной строки

Dasar

на сервере винда или линукс?

AlexV769

Естественно вопрос актуален для незаэскейпенной строки
Хорошее "естественно".
Тогда этот код типичный "Роберт дроп тейбл стьюдентс".

Jekich

на сервере винда или линукс?
Linux

Jekich

Хорошее "естественно".
Естественно = Если строка заэскейпенна, то тут не подкопаться
Тогда этот код типичный "Роберт дроп тейбл стьюдентс".
:confused:

Dasar

Тогда этот код типичный "Роберт дроп тейбл стьюдентс".
мешает проверка на соответствие реальному файлу

Dasar

с нулевым символом можно попробовать поиграться.

fufa58

:confused:

Jekich

с нулевым символом можно попробовать поиграться.
Пробовал
file=1.txt%00%27
file=1.txt%00
Файл нот фаунд (This file does not exist!)

Maurog

а относительные пути не представляют проблемы?
../../../etc/config/blah-blah
такие файлы можно скачивать?

jgimi

А апача в chroot директорию поместить?

Jekich

../../../etc/config/blah-blah
такие файлы можно скачивать?
не имеет разницы зачрутен ли апач или нет. В скрипте используется header а не include поэтому нет смысла запрашивать пободные файлы, их все равно не прочесть
Иначе бы работало
http://google.com/../../../../../../../../../etc/passwd :grin:

Hastya

IMHO можно попробовать поиграться с инъекцией в Header.
Например, попытаться передать в качестве 'file' строку с двойным переводом строки в конце - интересно, получиться ли обмануть ПХП таким образом. Правда ничего особенного этим не добъешься...

rosali

а какие еще сервисы есть на этом сервере. может там можно через что-нибудь создавать файлы с любыми именами ;)
Оставить комментарий
Имя или ник:
Комментарий: