在 Nginx 網頁伺服器中,防範「日誌注入 (Log Injection)」與伴隨的「本地檔案包含 (LFI)」攻擊,核心原則是:阻斷日誌被讀取、限制網頁程式的檔案執行範圍,以及限制敏感埠口的連線。
以下是 Nginx 最有效且常見的四個防禦設定:
如果駭客不知道你的 Log 檔案存放在哪裡,他就無法利用 LFI 漏洞去觸發它。
root 或 adm 群組能讀取,網頁程式用戶(如 www-data 或 nginx)絕對不能有讀取日誌的權限。# 在 /etc/nginx/nginx.conf 中修改
access_log /var/log/nginx/hidden_path_access.log;
error_log /var/log/nginx/hidden_path_error.log;
我們可以直接在 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;
}
# 你的其他網頁設定...
}
因為你的 8080 port 目前是對外公開的,最安全且暴力的防禦方式,就是只允許你自己的 IP 連結這個網站,其他網路上的掃描機器人一律拒門在外。
server {
listen 8080;
server_name localhost;
# 只允許你家裡或辦公室的固定外網 IP(請更換為你的實際 IP)
allow 203.0.113.50;
# 允許本機存取
allow 127.0.0.1;
# 拒絕其他所有人
deny all;
# 你的其他網頁設定...
}
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)。