2

我的网站有一个 php 代码,一位朋友告诉我,我的代码存在本地文件包含漏洞,因为我使用了“include”方法。

有人可以帮我修复它或带我去哪里可以找到帮助吗?我尝试了几种可能的修复方法,但没有奏效。问题在于在我的代码中包含语言文件。

下面是更清楚的代码:

<?php 

if(isSet($_GET['lang']))
$lang = $_GET['lang'];
else $lang='en';

include 'languages/'.$lang.'.php'; 
include("header.php");
?>

PS我只有2个语言文件,它们是英语=“en.php”和阿拉伯语=“ar.php”

如果有人可以提供帮助,我将不胜感激。

4

2 回答 2

2

永远不要相信用户输入!

<?php 

if ( isset($_GET['lang']) && $_GET['lang'] == 'en') {
    $lang = 'en';
} else {
    $lang = 'ar';
}

include 'languages/'.$lang.'.php'; 
include("header.php");

?>

或者,为可能的其他语言做准备,我会这样:

<?php 

$lang = !empty($_GET['lang']) ? $_GET['lang'] : 'en';

switch($lang) {
    default:
    case 'en':
        include 'languages/en.php'; 
        break;
    case 'ar':
        include 'languages/ar.php'; 
        break;
}

include("header.php");

?>

这样,您以后可以轻松地添加额外的语言,并且始终确保只包含所需的文件。

于 2016-05-19T09:30:33.457 回答
1

漏洞是可以发送任何类型的相对路径在$lang. 如果用户可以上传文件并找出他们在服务器上的真实路径,这尤其危险。

例子:

  • 黑客可能会使用您网站的某些文件上传功能进行上传evil.php。黑客可能知道/已经发现/猜测它存储在/var/www/uploads/evil.php,并且您的应用程序在/var/www/html.
  • /var/www/uploads现在,如果无法通过 HTTP 访问,通常没有人可以运行此文件。
  • 但是,可以打开http://example.com/index.php?lang=../../uploads/evil并猜猜是什么,它将包括languages/../../uploads/evil.php哪个将解析为/var/www/uploads/evil.php

如果有任何其他文件可用于通过访问它们并调用它们来利用某些东西,例如通常受密码保护的目录中的文件(例如phpMyAdmin),这当然也可以在没有文件上传的情况下工作。

如果你现在认为“这是相当多的假设和'可能'和'如果在那里,你需要非常幸运才能成功”然后小心 - 尽管在你做一个 URL 的地方有一些明显的公开漏洞打个电话,比方说,你可以超越服务器或删除数据库,最危险的是需要多个拼图才能使漏洞利用工作的那些,因为它们很长一段时间都未被发现,而且很难理解如何一旦发生这种情况,服务器实际上就被黑客入侵了,您家门口自然会有一个更有经验,因此也更危险(可能是隐形)的黑客。如果有人下定决心要找到安全漏洞(因为他们的实际目标是攻击您的网站或您,


有多种解决方案。

正如 u_mulder 所建议的,如果你只有ar然后en检查它是否是其中一个。

如果您有更多语言,您可以创建一个包含允许值列表的数组,并检查发送的语言是否在该数组中,例如:

$languages = ['de', 'en', 'ar', 'jp', 'fr'];
if(in_array($_GET['lang'], $languages)) {
    $selectedLanguage = $_GET['lang'];
} else {
    $selectedLanguage = 'en'; // default
    // Note that you could also show an error "invalid language" instead
}

如果您想通过仅允许文件夹中存在的文件来控制这一点,您还可以验证该语言是否仅包含字母(或您需要的任何内容,只要您确保它可能不包含点或斜杠等) :

if(preg_match("/^[a-z]*$/", $_GET['lang'])) { ... }

请注意,使用这种方法,您还应该明确地检查指定的文件是否存在,否则仍然可以通过指定无效语言来拥有无语言站点(特别是因为include不会在不存在的文件上引发错误,不像require)。

于 2016-05-19T09:35:55.307 回答