2014-02-20 3 views
0

У меня есть знаменитый скрипт, установленный на моем сервере программист сказал мне, что у меня есть код внутри одной из страниц, который можно использовать для выполнения любого кода или функции, и grep все данные моего ящикаэксплоит в моем php-скрипте

код

function fileRequestHandler($handler, $module = false, $file = false){ 
global $test_conf; 

switch ($handler) { 
    case 'reload': 
// AJAX handler for reload event 
     $response = do_reload(); 
     header("Content-type: application/json"); 
     echo json_encode($response); 
     break; 
    case 'file': 
     /** Handler to pass-through file requests 
     * Looks for "module" and "file" variables, strips .. and only allows normal filename characters. 
     * Accepts only files of the type listed in $allowed_exts below, and sends the corresponding mime-type, 
     * and always interprets files through the PHP interpreter. (Most of?) the environment is available, 
     * including $db and $astman, and the user is authenticated. 
     */ 
     if (!$module || !$file) { 
      die_myscript("unknown"); 
     } 
//TODO: this could probably be more efficient 
     $module = str_replace('..', '.', preg_replace('/[^a-zA-Z0-9-\_\.]/', '', $module)); 
     $file = str_replace('..', '.', preg_replace('/[^a-zA-Z0-9-\_\.]/', '', $file)); 

     $allowed_exts = array(
      '.js' => 'text/javascript', 
      '.js.php' => 'text/javascript', 
      '.css' => 'text/css', 
      '.css.php' => 'text/css', 
      '.html.php' => 'text/html', 
      '.php' => 'text/html', 
      '.jpg.php' => 'image/jpeg', 
      '.jpeg.php' => 'image/jpeg', 
      '.png.php' => 'image/png', 
      '.gif.php' => 'image/gif', 
     ); 

что проблема кода здесь ?? , какой тип действия может быть передан через этот код?

как я мог закрыть его благодаря

+1

Вы не закрывать 'switch' – Albzi

+0

Вы должны объяснить контекст этот код используется в Это обработчик для загрузки файлов? как правило, уязвимости безопасности запускаются с помощью ввода пользователем. Какие переменные в вашем коде заданы пользователем? Будь конкретнее – deadlock

+0

переключатель наверняка закрыт, но я не вставлял полный код –

ответ

1

Простой google search узнал меня, что вы ищете, где этот код:

http://cxsecurity.com/issue/WLB-2014020088

function fileRequestHandler($handler, $module = false, $file = false) 
{ 
    global $amp_conf; 

    switch ($handler) { 
     case 'reload': 
// AJAX handler for reload event 
      $response = do_reload(); 
      header("Content-type: application/json"); 
      echo json_encode($response); 
      break; 
     case 'file': 
      /** Handler to pass-through file requests 
      * Looks for "module" and "file" variables, strips .. and only allows normal filename 
      * characters. 
      * Accepts only files of the type listed in $allowed_exts below, and sends the corresponding mime-type, 
      * and always interprets files through the PHP interpreter. (Most of?) the freepbx environment is available, 
      * including $db and $astman, and the user is authenticated. 
      */ 
      if (!$module || !$file) { 
       die_freepbx("unknown"); 
      } 
//TODO: this could probably be more efficient 
      $module = str_replace('..', '.', preg_replace('/[^a-zA-Z0-9-\_\.]/', '', $module)); 
      $file = str_replace('..', '.', preg_replace('/[^a-zA-Z0-9-\_\.]/', '', $file)); 

      $allowed_exts = array(
       '.js' => 'text/javascript', 
       '.js.php' => 'text/javascript', 
       '.css' => 'text/css', 
       '.css.php' => 'text/css', 
       '.html.php' => 'text/html', 
       '.php' => 'text/html', 
       '.jpg.php' => 'image/jpeg', 
       '.jpeg.php' => 'image/jpeg', 
       '.png.php' => 'image/png', 
       '.gif.php' => 'image/gif', 
      ); 
      foreach ($allowed_exts as $ext => $mimetype) { 
       if (substr($file, -1 * strlen($ext)) == $ext) { 
        $fullpath = 'modules/' . $module . '/' . $file; 
        if (file_exists($fullpath)) { 
// file exists, and is allowed extension 

// image, css, js types - set Expires to 24hrs in advance so the client does 
// not keep checking for them. Replace from header.php 
         if (!$amp_conf['DEVEL']) { 
          header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 86400) . ' GMT', true); 
          header('Cache-Control: max-age=86400, public, must-revalidate', true); 
         } 
         header("Content-type: " . $mimetype); 
         ob_start(); 
         include($fullpath); 
         ob_end_flush(); 
         exit(); 
        } 
        break; 
       } 
      } 
      die_freepbx("../view/not allowed"); 
      break; 
     case 'api': 
      if (isset($_REQUEST['function']) && function_exists($_REQUEST['function'])) { 
       $function = $_REQUEST['function']; 
       $args = isset($_REQUEST['args']) ? $_REQUEST['args'] : ''; 

//currently works for one arg functions, eventually need to clean this up to except more args 
       $result = $function($args); 
       $jr = json_encode($result); 
      } else { 
       $jr = json_encode(null); 
      } 
      header("Content-type: application/json"); 
      echo $jr; 
      break; 
    } 
    exit(); 
} 

//Function is called at admin/config . php at line 132 

if (!in_array($display, array('noauth', 'badrefer')) 
    && isset($_REQUEST['handler']) 
) { 
    $module = isset($_REQUEST['module']) ? $_REQUEST['module'] : ''; 
    $file = isset($_REQUEST['file']) ? $_REQUEST['file'] : ''; 
    fileRequestHandler($_REQUEST['handler'], $module, $file); 
    exit(); 
} 
+0

Да, это правильно, эксплоит в моем скрипте freepbx , но я не хочу сказать, что это не для того, чтобы сделать его популярным: ( , но кажется, что эксплойт был опубликован –

+2

Я вижу, что '$ _REQUEST ['function']' выполняется без какой-либо дезинфекции. Я думаю, что это может привести к произвольному выполнению кода. – deadlock

+0

@ M.Hossam Тогда я действительно Не понимаю, что вы здесь задаете. – veelen

0

Все $ _REQUEST не продезинфицировать. , как говорили другие, вы должны дезинфицировать пользовательские входы ($ _GET, $ _POST, $ _REQUEST и т. Д.) , если вы не можете иметь дело с php. Я рекомендую вам нанять хорошего программиста php для защиты вашего приложения. Или лучше, не используйте скрипты, которые содержат подобные уязвимости.

, и если они не являются для вас вариантом, добавьте этот код ко всем вашим php-файлам после тега <?php (или в ваш config.php, если он включает все файлы php);

// sanitize $_GET variables 
$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);   

// sanitize $_POST variables 
$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);  

// sanitize $_REQUEST variables 
foreach($_REQUEST as $key => $val){ 
$_REQUEST[$key] = @filter_var(strip_tags(htmlspecialchars($val), FILTER_SANITIZE_STRING)); 
} 

Обратите внимание, что этот код может расколоть некоторую часть вашего приложения, особенно работающих со специальными гольцов ...

+0

Это не поможет. Прочитайте http://cxsecurity.com/issue/WLB-2014020088 – Gumbo

+0

@ Gumbo, пожалуйста, прочитайте мой ответ еще раз. Конечно, это поможет дезинформировать пользовательские данные. Но этого достаточно? Конечно, нет, прочитайте то, что я написал. Плюс о том, что об этом здесь не поможет, в вашей ссылке. Они рекомендуют использовать брандмауэр и платный продукт (который не связан с вопросом ops) для покрытия этой уязвимости.Op спрашивает о безопасности приложений, а не о безопасности сервера ... мы не можем рекомендовать платные решения, связанные с брандмауэром или сервером, о защите приложений. Безопасность приложений и безопасность серверов - это разные вещи. – optional

+0

Санирование ввода, как вы предлагаете, не поможет, поскольку использование указанной уязвимости не требует каких-либо символов, удаленных/закодированных FILTER_SANITIZE_STRING. На связанной странице упоминается пример 'config.php? Handler = api & function = system & args = id', который приводит к' system ('id') '. – Gumbo

Смежные вопросы