包含语言文件时利用本地文件包含漏洞



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

有人能帮我修理它吗?或者把我带到我能找到帮助的地方?我试了几种可能的方法来修复它,但都没用。问题是在我的代码中包含语言文件。

下面的代码更清楚:

<?php 
if(isSet($_GET['lang']))
$lang = $_GET['lang'];
else $lang='en';
include 'languages/'.$lang.'.php'; 
include("header.php");
?>

p.S我只有两个语言文件,它们是英语="en.php"和阿拉伯语="ar.php"

如果有人能帮忙,我将不胜感激。

永远不要相信用户输入!

<?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");
?>

通过这种方式,您可以在以后轻松添加额外的语言,并且始终确保只包含所需的文件。

漏洞在于可以在$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所建议的,如果你只有aren,那么只需检查它是否是其中之一。

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

$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不同)。

相关内容

  • 没有找到相关文章

最新更新