• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Сайт на php5.6

DmityiD

Green Team
05.12.2016
31
19
BIT
0
Доброго времени суток. Сразу говорю, с пхп - знаком плохо.
Есть старый сайт на пхп 5,6 или меньше, но на 5.6-работает. Сайт часто взламывался через "kcfinder" + возможно были еще дыры. Залиты были шелы. Насколько мог удалил.
Перенес его на выделенный сервер (пришлось поставить там пхп 5,6). И оказалось, что код содержит в себе еще и уязвимость LFI (добрые люди помогли). )
То есть можно получить доступ к большинству файлов на Линуксе. Мне тяжело сказать, то ли это косяк в написании сайта, то ли это код "дописан" после взлома.
Если закрыть доступ настройками веб-сервера, то пол сайта не открывается.

Подскажите пожалуйста.

Одна из страниц где проблемы index.php .
PHP:
?php
session_start();
    //index file for products
    include "../../../src_php/globalConst.php";
    include "../../../src_php/dbLibrary.php";
    include "../../../src_php/utils.php";
    include "../../../src_php/registration/check_user.php"; // функция для проверки регистрации
    include "../../../src_php/admin/DOM.php"; // для замены ссылок
    
    
    readfile("../../../".HTML_RU_PATH."header.html");
    readfile("../../../src_php/admin/showHide.js");
    readfile("../../../".HTML_RU_PATH."menu.html");

    $pathToFiles = ".";
    if (isset($_GET['product']))
    {
        if (!empty($_GET['product']))
        {
            if (!empty($_GET['catId']) && !empty($_GET['name']))
                echo createMenu($_GET['product'], $_GET['catId'], $_GET['name']);
            //enter div here
            //echo $_GET['product'];       
            echo '<div class="content">';
            
            $textFile = readFileStr($_GET['product']); // ТУТ ТРАБЛ!!!!
            // заменяем ссылки если не зарегистрирован
            if (!check_user()){
                $textFile = change_link($textFile);
            }
            
            echo $textFile;
            //close div here
        }
    }
    else
    {
        $conn = connectToDb();
        if ($conn)
        {
            setNames("UTF8");
            echo '<div class="content">';
            echo '<h1>Каталог продукции</h1>';
            echo '<div class="product_list">';
            echo qProductList($conn, "user");
            echo '</div>';
        }
        else
            echo ERROR_DB_CONNECT_FAIL;
    }
    echo '</div>';
    readfile("../../../".HTML_RU_PATH."footer.html");
    
    
    
    function createMenu($product, $catId, $productName)
    {
        $output = '<div class=content_head_menu>';
        $output .= '<a href="/index.php">Главная</a> → ';
        $output .= '<a href="index.php">Товары</a> → ';
        //$output .= '<a href="index.php?product='.$product.'&catId='.$catId.'&name='.$productName.'">'.$productName.'</a>';
        $output .= $productName;
        $output .= '</div>';
        return $output;
    }
    
    if (check_user()){
        include ("../../../".HTML_RU_PATH."reg_yes.html");
    }else{
        include ("../../../".HTML_RU_PATH."reg_no.html");   
    }
    
    echo '<script>show_open_list();</script>';
    
?>

Трабл вот здесь " $textFile = readFileStr($_GET['product']); ". он ссылается на utils.php, а там есть такое:

PHP:
<?php
session_start();
    include "globalConst_en.php";
    //this file contains some utils that can be used from all files
    //this function return true if user is entered to the system or false if not
    function isSignIn()
    {
        //session_start();
        if (isset($_SESSION['sign']))
            return true;
        else
            return false;
    }
    //this file end user session and unset all session variables
    function endSession()
    {
        //session_start();
        unset($_SESSION['sign']);
        session_destroy();
    }
    //this function save file
    function saveFile($filePath, $text)
    {
        $fp = fopen($filePath, 'w') or die(ERROR_OPEN_FILE);
        fwrite($fp, $text) or die(ERROR_WRITE_FILE);
        fclose($fp);
    }
    //this function read file
    function readFileStr($filePath)
    {
        $fp = fopen($filePath, 'r') or die(ERROR_OPEN_FILE);
        $s = fread($fp, filesize($filePath)) or die(ERROR_READ_FILE);
        fclose($fp);
        return $s;
    }
    //this function get all files from $dirName and filter them using $filter
    function getFiles($dirName, $filter)
    {
        $dp = openDir($dirName) or die(ERROR_OPEN_DIR);
        while ($currentFile !== false)
        {
            $currentFile = readDir($dp);
            $files[] = $currentFile;
        }       
        return preg_grep($filter, $files);
    }
?>
 

explorer

Platinum
05.08.2018
1 081
2 474
BIT
14
Если сказать в общих словах:

Очевидно что у вас идёт подключение через include других файлов, поэтому появляется возможность вместо инклюда подставлять "полезные нагрузки" (уязвимость LFI), которые дают возможность прочесть файлы из файловой системы, (типа ../etc/passwd/ и т.п.) или увидеть исходный код страниц PHP. Многое зависит от настроек PHP, например, если будет выставлено allow_url_include ON, то появляется возможность раскрутить уязвимость LFI до более серьёзной RFI, то есть удалённого доступа к сайту. Таким образом можно уже заливать шеллы, майнеры и проч.

Версия PHP 5.6 весьма дырявая, под неё написана куча всевозможных эксплойтов, и довольно слабая политика безопасности по-умолчанию. Поэтому очень важно поменять версию PHP например на 7xx, совсем недавно, в конце ноября, вышла уже v 8.0.0. Разумеется, скорее всего, часть сайта окажется неработоспособной без изменения кода. Поэтому предварительно нужно развернуть сайт на локалке и всё протестировать. Найденные устаревшие функции заменить на новые. С переходом на новую версию PHP, из-за другой политики безопасности, часть уязвимостей уже не будет возможность проэксплуатировать.

После этого нужно как минимум протестировать хотя бы несколькими сканерами уязвимостей на наличие оных. Найденные уязвимости уже сами подскажут, какие участки кода скорее всего проблемные. Очевидная вещь - любой пользовательский ввод на сайте (когда он имеется), должен идти через фильтрацию входящих данных. Загрузка файлов также место повышенного внимания - достаточно просто, при отсутствии фильтрации данных (или недостаточной фильтрации), загрузить вредоносный файл.

Ну и в довершение можно отметить, что в вашем коде нигде нет никаких признаков фильтрации. Раз сами не разбираетесь, то логично отдать доработать сайт тому кто разбирается. Это самый логичный и правильный путь. Потенциальному исполнителю можно дать почитать то что написано выше, чтобы не оказалось потом, что он писать код может, а как фильтровать данные имеет слабое представление.

Ничего "дописанного" в данном коде я не вижу. Используйте абсолютный путь в коде, а не относительный, это может быть неудобно только при смене доменного имени/сервера с другой файловой системой, но повысит безопасность.
 

DmityiD

Green Team
05.12.2016
31
19
BIT
0
Если сказать в общих словах:

Очевидно что у вас идёт подключение через include других файлов, поэтому появляется возможность вместо инклюда подставлять "полезные нагрузки" (уязвимость LFI), которые дают возможность прочесть файлы из файловой системы, (типа ../etc/passwd/ и т.п.) или увидеть исходный код страниц PHP. Многое зависит от настроек PHP, например, если будет выставлено allow_url_include ON, то появляется возможность раскрутить уязвимость LFI до более серьёзной RFI, то есть удалённого доступа к сайту. Таким образом можно уже заливать шеллы, майнеры и проч.

Версия PHP 5.6 весьма дырявая, под неё написана куча всевозможных эксплойтов, и довольно слабая политика безопасности по-умолчанию. Поэтому очень важно поменять версию PHP например на 7xx, совсем недавно, в конце ноября, вышла уже v 8.0.0. Разумеется, скорее всего, часть сайта окажется неработоспособной без изменения кода. Поэтому предварительно нужно развернуть сайт на локалке и всё протестировать. Найденные устаревшие функции заменить на новые. С переходом на новую версию PHP, из-за другой политики безопасности, часть уязвимостей уже не будет возможность проэксплуатировать.

После этого нужно как минимум протестировать хотя бы несколькими сканерами уязвимостей на наличие оных. Найденные уязвимости уже сами подскажут, какие участки кода скорее всего проблемные. Очевидная вещь - любой пользовательский ввод на сайте (когда он имеется), должен идти через фильтрацию входящих данных. Загрузка файлов также место повышенного внимания - достаточно просто, при отсутствии фильтрации данных (или недостаточной фильтрации), загрузить вредоносный файл.

Ну и в довершение можно отметить, что в вашем коде нигде нет никаких признаков фильтрации. Раз сами не разбираетесь, то логично отдать доработать сайт тому кто разбирается. Это самый логичный и правильный путь. Потенциальному исполнителю можно дать почитать то что написано выше, чтобы не оказалось потом, что он писать код может, а как фильтровать данные имеет слабое представление.

Ничего "дописанного" в данном коде я не вижу. Используйте абсолютный путь в коде, а не относительный, это может быть неудобно только при смене доменного имени/сервера с другой файловой системой, но повысит безопасность.
Спасибо большое за такой развернутый ответ. Очень помогли, в плане понимания и поставки следующих задач. :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!