簡體   English   中英

如何通過路徑信息在 PHP 中傳遞 URL 來防止 SSRF?

[英]How can I prevent SSRF via pathinfo passing a URL in PHP?

使用 Acunetix 掃描我們的代碼以查找漏洞后,我們遇到了以下腳本的問題,其中說:

“針對hit0yPI7kOCzl.bxss.me 域發起了一個 HTTP 請求,這表明該腳本容易受到 SSRF(服務器端請求偽造)的攻擊。”

我怎樣才能防止這種情況?

<?php
$filename = strip_tags($_GET['url']);

if (substr($filename,0,4) !== 'http') {
    die("Need a valid URL...");
}

$ext = pathinfo($filename, PATHINFO_EXTENSION);


switch ($ext) {
    case "gif":
        header('Content-Type: image/gif');
        readfile($filename);
        break;
    case "png":
        header('Content-Type: image/png');
        readfile($filename);
        break;
    case "jpg":
    default:
        header('Content-Type: image/jpeg');
        readfile($filename);
        break;
}
?>

來源,如果您的問題是您的服務器將嘗試從任何傳遞的 url 中獲取數據。 鑒於它在url參數中包含http://google.com ,腳本將以實際的 google 網站內容進行響應。

為什么它不好? 例如,這可能會被利用來繞過您的防火牆設置、訪問您服務器的內部網絡或污染套接字連接,因此您的服務器將無法連接或連接到並且將變得無響應。

首先,您應該考慮是否真的想用 PHP 提供靜態文件。 很可能這個責任可以委托給網絡服務器。 甚至可以使用當前的網絡服務器從 3rd 方網站“提供”靜態信息,因此您應該認真考慮擺脫該代碼。

如果在這種情況下您 100% 確定要與 PHP 一起使用,則應該對代碼添加限制。

  1. 添加域白名單,這樣將只允許在url變量中使用受信任的域列表;
  2. 不處理擴展名未知的文件。

在這種情況下,代碼將如下所示:

<?php

$whitelist = [
    'some.whitelisted.com',
    'other.whitelisted.com'
];

$extensionMap = [
    'gif'  => 'image/gif',
    'png'  => 'image/png',
    'jpg'  => 'image/jpeg',
    'jpeg' => 'image/jpeg'
];

$filename = strip_tags($_GET['url']);

$host = parse_url($filename, PHP_URL_HOST);

if(empty($host) || !in_array($host, $whitelist)) {
    header('HTTP/1.1 404 Not Found');
    exit;
}

$ext = pathinfo($filename, PATHINFO_EXTENSION);

if(!isset($extensionMap[$ext])) {
    header('HTTP/1.1 404 Not Found');
    exit;
}

header(sprintf('Content-Type: %s', $extensionMap[$ext]));
readfile($filename);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM