Старый 05.07.2010, 22:39   #1
FrILL
 
Регистрация: 05.07.2010
Сообщений: 5
Репутация: 3
По умолчанию Раскрытие путей. Методы, примеры.

Разберем на примере

gff.ge

В свойствах картинки например видим
gff.ge/functions/img.php?src_jpg=../album/2_3469_646112.jpg&im_new_w=70

Далее пишим какуюнибудь муть
gff.ge/functions/img.php?src_jpg=blabla&im_new_w=70

Вываливается пустая картинка, скачиваем, открываем блокнотом, видим
Цитата:
<br />
<b>Warning</b>: imagecreatefromjpeg(blabla) [<a href='function.imagecreatefromjpeg'>function.image createfromjpeg</a>]: failed to open stream: No such file or directory in <b>/home/gffge/public_html/functions/img.php</b> on line <b>18</b><br />
<br />
<b>Warning</b>: imagesx(): supplied argument is not a valid Image resource in <b>/home/gffge/public_html/functions/img.php</b> on line <b>19</b><br />
<br />
<b>Warning</b>: imagesy(): supplied argument is not a valid Image resource in <b>/home/gffge/public_html/functions/img.php</b> on line <b>20</b><br />
<br />
<b>Warning</b>: Division by zero in <b>/home/gffge/public_html/functions/img.php</b> on line <b>21</b><br />
<br />
<b>Warning</b>: imagecreatetruecolor() [<a href='function.imagecreatetruecolor'>function.imag ecreatetruecolor</a>]: Invalid image dimensions in <b>/home/gffge/public_html/functions/img.php</b> on line <b>24</b><br />
<br />
<b>Warning</b>: imagecreatefromjpeg(blabla) [<a href='function.imagecreatefromjpeg'>function.image createfromjpeg</a>]: failed to open stream: No such file or directory in <b>/home/gffge/public_html/functions/img.php</b> on line <b>25</b><br />
<br />
<b>Warning</b>: imagesx(): supplied argument is not a valid Image resource in <b>/home/gffge/public_html/functions/img.php</b> on line <b>31</b><br />
<br />
<b>Warning</b>: imagesy(): supplied argument is not a valid Image resource in <b>/home/gffge/public_html/functions/img.php</b> on line <b>31</b><br />
<br />
<b>Warning</b>: imagecopyresampled(): supplied argument is not a valid Image resource in <b>/home/gffge/public_html/functions/img.php</b> on line <b>31</b><br />
<br />
<b>Warning</b>: imagejpeg(): supplied argument is not a valid Image resource in <b>/home/gffge/public_html/functions/img.php</b> on line <b>37</b><br />
<br />
<b>Warning</b>: imagedestroy(): supplied argument is not a valid Image resource in <b>/home/gffge/public_html/functions/img.php</b> on line <b>38</b><br />
И это далеко не единственный сайт
FrILL вне форума   Ответить с цитированием
Старый 05.07.2010, 23:41   #2
nobody
 
Аватар для nobody
 
Регистрация: 05.07.2010
Сообщений: 176
Репутация: 130
Post

ужас, а не методы и примеры

раскрытие путей - это ничто более чем последствие фатальных/критических ошибок выполнения функции

классический пример - передача в качестве параметра массив, при условии что функция обрабатывающая этот параметр имеет такой вид
Код:
string function (  string $string, [...] );
это например такие как
Код:
htmlspecialchars
mysql_real_escape_string
urldecode
urlencode
etc
Это может быть ошибка при выполнении функции, например function redeclaration (переопределение функции), чтение не существующего файла, инклюд не существующего файла, передача не верного параметра(типа параметра) в функцию,etc


1. Function redeclaration

Чаще всего я встречал такие ошибки при определении функции в цикле, хотя возможна масса вариантов
PHP код:
<?php
for($i=0;$i<=$count;$i++) {
 function 
do_smth($var) {
  
// ....
 
return $var;}
 
//.. вызов функции do_smth
}
?>
при 1 итерации ошибок не будет, но при двух и более
Код:
Fatal error: Cannot redeclare do_smth() (previously declared in [path]-:3) in [path]- on line 7
3 - строка в которой функция инициализируется, 7 - строка в которой мы пытается её передекларировать
Решение: не быдлокодить

2. File existance
чтение/запись/инклюд не существующего файла,
PHP код:
<?php
$f 
fopen('1.txt''r');
fclose($f);
?>
Код:
Warning: fopen(1.txt): failed to open stream: No such file or directory in [path]- on line 2
или файла без прав чтения/записи
Код:
Warning: fopen(1.txt): failed to open stream: Permission denied in [path]- on line 2
Решение: проверять функциями file_exists, is_readable, is_writeble и директорию в которой находится файл, ведь если имя файла передаётся со стороны пользователя, то /etc/passwd под file_exists, а иногда и под is_readable покатит, это так - на заметку

3. Include/require
суть практически та же что и при чтении, лишь существенные нюансы
PHP код:
<?php
include('2.txt');
?>
Код:
Warning: include(2.txt): failed to open stream: No such file or directory in [path]- on line 2

Warning: include(): Failed opening '2.txt' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in [path]- on line 2
Решение: allow_url_fopen/include = Off, никаких include("./".$_GET[var].".html"), вообще это тема отдельной статьи


4. Function warnings

Тот же классический пример передачи не верного параметра функции
PHP код:
<?php
$a
[] = 1;
echo 
htmlspecialchars($a);
?>
Код:
Warning: htmlspecialchars() expects parameter 1 to be string, array given in [path]- on line 3
Конечно бывают следственные моменты, когда в функцию передаётся не верный аргумент, но она не крашит, но так или иначе - возвращает не правильный результат, который в дальнейшем используется другой функцией, которая и начнёт орать ворнингами.

Пример
PHP код:
<?php
//db connect
$x mysql_query("hello idiots!");
echo 
mysql_fetch_assoc($x);
?>
mysql_query какбЭ пох, возвращает 0, проверки aka mysql_num_rows нет, итог
Код:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in [path]- on line 4
Решение: перед тем как использовать функцию вспомнить с какими типами данных она работает, выдаёт ли ворнинги, и являяется ли она уместной (ну например может htmlentites будет лучше htmlspecialchars не надо следить за кодировкой, числа/строки/массивы/объекты кушает и не крашит), и обрабатывать все возможные варианты

Еще пример
PHP код:
<?php
$sock 
fsockopen("site.ru"$port);
$head[] = "Http headers\r\n";
....
fclose($sock);
?>
а что если соединение не откроется? угу, будет ворнинг с путями, по этому надо что-то типа
PHP код:
<?php
$sock 
fsockopen("site.ru"$port) or die("жопа какая-то");
?>
5. Disabled functions/classes
Тут и говорить нечего
Код:
me@localhost:/var/www$ sudo cat -b /etc/php5/apache2/php.ini | grep disable_
   193  disable_functions = system
   197  disable_classes =
PHP код:
<?php
system
($_GET['x']);
?>
Код:
Warning: system() has been disabled for security reasons in [path]  on line 2
Это disable_function. Абсолютно тоже, с classes

6. Sessions

Спс oRb что напомнил
Функция session_start генерирует warning, если идентификатор сессии содержит недопустимые символы.
PHP код:
<?php
session_start
();
$_SESSION['any'] = 123;
?>
в куках получаем нечто вроде - 08ac1e741ebfb0b9e0445e77b6d7088b
Шлём пакет, или попросту меняем куки (идентификатор сессии) добавляя в него произвольные спец. символы
Код:
GET /sys.php HTTP/1.0
Host: localhost
Cookie: PHPSESSID=!@#$%^&
Результат
Код:
<b>Warning</b>:  session_start() [<a href='function.session-start'>function.session-start</a>]: The session id contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in <b>[path]</b> on line <b>2</b><br />
<br />
<b>Warning</b>:  session_start() [<a href='function.session-start'>function.session-start</a>]: Cannot send session cookie - headers already sent by (output started at [path]:2) in <b>[path]</b> on line <b>2</b><br />
<br />
<b>Warning</b>:  session_start() [<a href='function.session-start'>function.session-start</a>]: Cannot send session cache limiter - headers already sent (output started at [path]:2) in <b>[path]</b> on line <b>2</b><br />
Решение: http://www.php.net/manual/en/functio...tart.php#82957

И конечно error_reporting(0) на сервере, но никак не на своей девелоперской машине
nobody вне форума   Ответить с цитированием
Старый 06.07.2010, 00:02   #3
oRb
 
Аватар для oRb
 
Регистрация: 01.07.2010
Сообщений: 319
Репутация: 138
По умолчанию

Дополню:
Функция session_start генерирует warning, если идентификатор сессии содержит недопустимые символы.
__________________
Не оказываю никаких услуг.
I don't provide any services.
oRb вне форума   Ответить с цитированием
Старый 09.07.2010, 06:23   #4
Магараджи
 
Регистрация: 08.07.2010
Сообщений: 3
Репутация: 0
По умолчанию

Извиняюсь за оффтоп, но вот по поводу сессий, поясните, как грамотно бороться с этим багом раскрытие путей? Только лишь хапать $_COOKIE[‘rdot’]; и регуляркой проверять на соответствие символов 0-9 a-f ? Может есть более правильный способ?
Магараджи вне форума   Ответить с цитированием
Старый 09.07.2010, 08:01   #5
BlackFan
 
Аватар для BlackFan
 
Регистрация: 08.07.2010
Сообщений: 354
Репутация: 402
По умолчанию

null значение в идентификаторе сессии так же выдает Warning, как и недопустимые символы.

javascript:void(document.cookie="PHPSESSID=");
BlackFan вне форума   Ответить с цитированием
Старый 09.07.2010, 10:18   #6
Ctacok
 
Аватар для Ctacok
 
Регистрация: 06.07.2010
Сообщений: 127
Репутация: 49
По умолчанию

Цитата:
Сообщение от BlackFan Посмотреть сообщение
javascript:void(document.cookie="PHPSESSID=");

Так же выдает Warning, как и недопустимые символы
Эм, а разница? Тут и был упомянут PHPSESSID, у тебя лишь скрипт его вызывает и всё.
__________________
Twitter - @Ctacok
Ctacok вне форума   Ответить с цитированием
Старый 09.07.2010, 12:25   #7
Jokester
 
Аватар для Jokester
 
Регистрация: 01.07.2010
Сообщений: 250
Репутация: 155
По умолчанию

Цитата:
Сообщение от Магараджи Посмотреть сообщение
Извиняюсь за оффтоп, но вот по поводу сессий, поясните, как грамотно бороться с этим багом раскрытие путей? Только лишь хапать $_COOKIE[‘rdot’]; и регуляркой проверять на соответствие символов 0-9 a-f ? Может есть более правильный способ?
подави их просто

@session_start()
Jokester вне форума   Ответить с цитированием
Старый 17.07.2010, 19:49   #8
mexx
 
Регистрация: 17.07.2010
Сообщений: 12
Репутация: 2
По умолчанию

error_reporting(0);
еще дожно помочь вроде бы. в контексте php естественно
mexx вне форума   Ответить с цитированием
Старый 17.07.2010, 21:13   #9
Dr.TRO
 
Аватар для Dr.TRO
 
Регистрация: 06.07.2010
Сообщений: 90
Репутация: 21
По умолчанию

Скрывать ошибки это символ не профессионализма, и показатель невозможности того чтоб их убрать, но и в тот же момент способ быстрого и эффективного гашения сеих ошибок которые не несут особой опасности кроме как непосредственно показывания Warning'а.
__________________
http://fc01.deviantart.net/fs48/f/20...eyecixramd.png
http://img156.imageshack.us/img156/2...userbartd7.png
Цитата:
root@rdot.org ~ # perl -MAcme::BadExample
Dr.TRO вне форума   Ответить с цитированием
Старый 17.07.2010, 21:21   #10
mexx
 
Регистрация: 17.07.2010
Сообщений: 12
Репутация: 2
По умолчанию

ну конечно при разработке надо стремиться, чтобы ошибок не было.
но при запуске в продакшн, имхо, лучше всеже подстраховаться, и отрубить их отображение совсем.
mexx вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot