получить true при сравнении $str == 'aaa'

Discussion in 'PHP' started by 4upakabr0, 30 Jun 2014.

  1. 4upakabr0

    4upakabr0 Member

    Joined:
    14 May 2008
    Messages:
    124
    Likes Received:
    23
    Reputations:
    0
    здравствуйте,

    возможно ли имея контроль над $str получить при сравнении
    Code:
    $str== 'ololo'
    - true ?

    язык - php


    Это нужно для обхода следующей корявой авторизации:

    Code:
    if($_SERVER['PHP_AUTH_USER'] == 'user' and $_SERVER['PHP_AUTH_PW'] == 'somePass' )
    есть идеи?


    оп-оп, есть идеи:
    когда нестрогое сравнение, то любая строка не содержащая чисел при сравнении
    Code:
     0 == 'somestringwithoutnumbers'
    даёт нам положительный результат!
     
    #1 4upakabr0, 30 Jun 2014
    Last edited: 30 Jun 2014
  2. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    http://www.php.net/manual/en/types.comparisons.php
     
    _________________________
    1 person likes this.
  3. 4upakabr0

    4upakabr0 Member

    Joined:
    14 May 2008
    Messages:
    124
    Likes Received:
    23
    Reputations:
    0
    збс, там, кстати о
    Code:
    0 == 'somestring'
    - true ни слова. лишь о пустой строке.
    но крутая таблица нестрого сравнения. спасибо.

    как думаешь, такая реализация basic авторизации уязвима? или мы не можем задать $_SERVER['PHP_AUTH_USER'] как число а только лишь строкой?
     
    #3 4upakabr0, 30 Jun 2014
    Last edited: 30 Jun 2014
  4. попугай

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

    Joined:
    15 Jan 2008
    Messages:
    1,520
    Likes Received:
    401
    Reputations:
    196
    И в чем ее корявость?
     
  5. 4upakabr0

    4upakabr0 Member

    Joined:
    14 May 2008
    Messages:
    124
    Likes Received:
    23
    Reputations:
    0
    Думаю, в том, что хранить парольчики в открытом виде не комильфо. Но самое главное, в нашем случае, при нестрогой проверке, без учета типа, пых будет приводить всё к числу(если конечно, первый аргумент сравнения число*), а следовательно сила пароля равна силе ряда цифр в парольной фразе. Следовательно можно брать количество сочетаний цифр из 10(0,1,...,9) по 1, по 2, по 3 и т.д. с повторениями и перебирать. Т.е. если пароль "pass123" , то мы угадаем его введя 123. Конечно, нужно знать логин. Но это уже другой вопрос.

    *пока мне этого добиться не удалось :D
     
    #5 4upakabr0, 4 Jul 2014
    Last edited: 4 Jul 2014
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    нет
    нет. На это и предыдущее - пхп при сравнении будет приводить оба аргумента к наименьшему типу. Порядок аргументов значения не имеет.
    PHP:
    var_dump('somestring' == 0);
    var_dump(== 'somestring');

    bool(true)
    bool(true)
    Дважды нет.
    1) При сравнении строки "pass123" с числом 123 строка будет приведена к числовому типу. Порядок приведения - из строки берутся цифры слева направо, пока не встретится буква. Полученные числа интерпретируются как десятичные. Исключение - буква "e"

    Согласно этого алгоритма - строка pass123 будет равна нулю, и следует отправлять число 0, тогда проверка пройдет. Пример:
    PHP:
    var_dump('pass123' == 123);
    var_dump('pass123' == 0);
    var_dump('123pass' == 123);
    var_dump('123pass' == 0);

    bool(false)
    bool(true)
    bool(true)
    bool(false)
    2) Второй раз нет по той причине, что вы не можете отправить в качестве аргументов числа. ПХП интерпретирует все параметры как строки. И все написанное выше в общем случае не верно.

    PHP:
    var_dump('somestring' == '0');
    var_dump('0' == 'somestring');
    var_dump('pass123' == '123');
    var_dump('pass123' == '0');
    var_dump('123pass' == '123');
    var_dump('123pass' == '0');

    bool(false)
    bool(false)
    bool(false)
    bool(false)
    bool(false)
    bool(false)
    Как я уже сказал - особый случай это буква "е" и строки состоящие только из цифр и из буквы "e". Предлагаю помедитировать почему все следующие проверки возвращают true:

    PHP:
    var_dump('0e12312323' == '0');
    var_dump('12e1' == '120');
    var_dump('12e-2' == '1200e-4');
    var_dump('12e-2' == '0.12');
     
    _________________________
    #6 Gifts, 4 Jul 2014
    Last edited: 4 Jul 2014
    2 people like this.
  7. 4upakabr0

    4upakabr0 Member

    Joined:
    14 May 2008
    Messages:
    124
    Likes Received:
    23
    Reputations:
    0
    шик! спасибо.