【问题标题】:Prevent Host header attack防止主机头攻击
【发布时间】:2017-10-11 23:15:53
【问题描述】:

我使用 Acunetix Web Vulnerability Scanner 扫描了我的网站,发现了 Host Header 攻击漏洞。

描述中说我写的

(_SERVER["HTTP_HOST"] 在 PHP 中

但我没有,我也不知道如何解决这个问题。

这是我受影响文件的标题

<?php
    include 'core/init.php';

    if($user->is_loggedin()){
        redirect('index.php');
        exit();
    }

    if($detect->isMobile()){
        redirect('http://m.website.com/prijava.php');
        exit();
    }

    if(isset($_POST['prijava'])){
        $post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
        if(time() - $user->failTime($post['email']) < 600 && $user->failCount($post['email']) >= 3){
            $err = '<p style="color:red;">Račun vam je zaključan na 10 minuta.</p>';
        }else{          
            if(empty($post['email']) || empty($post['password'])){
                $err = '';
            }elseif($id = $user->prijava($post['email'], $post['password'])){
                if($user->isActive($post['email'])){                    
                    $_SESSION['user'] = $id['id'];
                    $user->resetFail();
                    redirect('index.php');
                    exit();
                }else{
                    $err = '<p style="color:red;">Korisnički račun nije aktiviran.</p>';    
                }           
            }else{
                if($user->checkMail($post['email'])){
                    if($user->storeFail($post['email'])){
                        $err = '<p style="color:red;">Lozinka i email se ne poklapaju.</p>';
                    }
                }else{
                    $err = '<p style="color:red;">Lozinka i email se ne poklapaju.</p>';
                }           
            }
        }       
    }
?>

还有html

<head>
    <meta charset="UTF-8">
    <title>Prijava</title>
    <link rel="shortcut icon" href="images/favicon.png" type="image/png">
    <link rel="stylesheet" type="text/css" href="css/sign.css?<?php echo time(); ?>">       
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>

这是漏洞描述的图片:

总结一下,我该如何保护我的网站,谢谢。

【问题讨论】:

  • 这只是如何使用此标头的示例。我会检查 php.ini 以获取与标头相关的设置。另外,你在使用一些框架吗?
  • @Alfabravo 不使用任何框架,我无法访问 php.ini,我应该向我的托管服务提供商咨询吗?

标签: php security


【解决方案1】:

这是解决主机头攻击的代码。必须指定 URL。

$allowed_domains = array('yourdomain1', 'yourdomain2', 'yourdomain3');
$default_domain  = 'yourprimedomain';

if (in_array($_SERVER['HTTP_HOST'], $allowed_domains, TRUE))
{
    $domain = $_SERVER['HTTP_HOST'];
}
else
{
    $domain = $default_domain;
}

if (! empty($_SERVER['HTTPS']))
{
    $config['base_url'] = 'https://'.$domain;
}
else
{
    $config['base_url'] = 'http://'.$domain;
}
请把这个放在你的标题上
<base href="<?php echo base_url(); ?>" />

在 mozilla 上使用编辑运行测试并重新发送,或者使用 curl 进行测试。

【讨论】:

  • 我仍然有同样的漏洞
  • 我刚刚编辑了答案,请放标题。抱歉回答不完整。
【解决方案2】:

有两种方法可以防止 Host 标头攻击:

  1. 使用$_SERVER['SERVER_NAME'] 在httpd(Apache、nginx等)配置级别强制执行

    这意味着您应该为您服务的每个域都明确配置一个虚拟主机。或者换句话说 - 不允许“包罗万象”的配置。

  2. 检查它是否与您服务的域的白名单匹配:

    // Just in case there's more than one ...
    $domains = ['abc.example.com', 'foo.bar.baz'];
    if ( ! in_array($_SERVER['SERVER_NAME'], $domains)) {
        // error
    }
    

尽管它的名字暗示了什么,除非您遵循第一个解决方案,否则当 PHP 运行“catch all”配置时,$_SERVER['SERVER_NAME'] 也将由 Host 标头值填充。
因此,除非您的 HTTP 服务器配置正确,否则它们都是相等的,因此为什么上述两种解决方案都引用 $_SERVER['SERVER_NAME'] - 使用它或 $_SERVER['HTTP_HOST'] 实际上并不重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-12
    • 2017-09-15
    • 2015-10-19
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多