在 Nginx 網頁伺服器中,防範「日誌注入 (Log Injection)」與伴隨的「本地檔案包含 (LFI)」攻擊,核心原則是:阻斷日誌被讀取、限制網頁程式的檔案執行範圍,以及限制敏感埠口的連線。

以下是 Nginx 最有效且常見的四個防禦設定:

1. 隱藏與保護 Nginx 日誌路徑(防範讀取)

如果駭客不知道你的 Log 檔案存放在哪裡,他就無法利用 LFI 漏洞去觸發它。

# 在 /etc/nginx/nginx.conf 中修改
access_log /var/log/nginx/hidden_path_access.log;
error_log /var/log/nginx/hidden_path_error.log;

2. 利用 Nginx 阻擋惡意代碼注入(防範寫入)

我們可以直接在 Nginx 設定規則,當發現請求的網址(URL)或參數中包含 PHP 標籤、特殊字元或常見攻擊語法時,直接封鎖並回應 403 Forbidden,不讓它寫入 Log。

在你的 server 區塊(例如監聽 8080 的區塊)加入以下過濾規則:

server {
    listen 8080;
    server_name localhost;

    # 1. 偵測並阻擋網址中包含常見的 LFI 路徑與 PHP 標籤
    if ($request_uri ~* "(\.\./|boot\.ini|etc/passwd|win\.ini|<\?php)") {
        return 403;
    }

    # 2. 偵測並阻擋 User-Agent 中包含 PHP 惡意代碼
    if ($http_user_agent ~* "(<\?php|eval\(|base64_)") {
        return 403;
    }

    # 你的其他網頁設定...
}

3. 如果只是練習用,強烈建議「限制來源 IP」

因為你的 8080 port 目前是對外公開的,最安全且暴力的防禦方式,就是只允許你自己的 IP 連結這個網站,其他網路上的掃描機器人一律拒門在外。

server {
    listen 8080;
    server_name localhost;

    # 只允許你家裡或辦公室的固定外網 IP(請更換為你的實際 IP)
    allow 203.0.113.50;

    # 允許本機存取
    allow 127.0.0.1;

    # 拒絕其他所有人
    deny all;

    # 你的其他網頁設定...
}

4. 搭配後端(如 PHP-FPM)的防禦設定

LFI 攻擊之所以成功,是因為後端程式(如 PHP)被叫去執行了 Log 檔。如果你使用的是 PHP,請務必在 php.ini 設定中開啟 open_basedir。

這個設定可以將 PHP 限制在網頁根目錄內,即使網頁有 LFI 漏洞,PHP 只要企圖跨目錄去讀取 /var/log/nginx/,就會直接被作業系統攔截並報錯。

# 在 php.ini 中設定(假設你的網頁放在 /var/www/html)
open_basedir = "/var/www/html/:/tmp/"

💡 下一步建議

您可以檢查一下您目前的 Nginx 設定檔(通常在 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/default)。